diff --git a/10-1 DelegateVariable/Button.cs b/10-1 DelegateVariable/Button.cs index 651686e55511386c02f2b1893cd841b9eee38fdd..04fe83d848dc092c3c450dac67e4d1b386928db8 100644 --- a/10-1 DelegateVariable/Button.cs +++ b/10-1 DelegateVariable/Button.cs @@ -7,15 +7,21 @@ namespace _10_1_DelegateVariable delegate void MyFunction(string s); class Button { - public /*event*/ MyFunction Callback; + public event MyFunction Callback; // event ~ Einschränkung der Zugriffsmöglichkeiten von // außerhalb der Klasse auf nur noch += bzw. -= public void Print(string s) { - Callback?.Invoke(s); + // Vorarbeiten + // Callback(s); + Callback?.Invoke(s); // ?. ~ (Callback==null) ? null : Callback.Invoke(s) // print = null; ~ Nur innerhalb der Klasse erlaubt + // Nacharbeiten } + // Console.WriteLine(s); + // AusgabeInGrossbuchstaben(s); + // : } } diff --git a/10-1 DelegateVariable/Program.cs b/10-1 DelegateVariable/Program.cs index 346f0c4a201b300e873d434b0ed3f934fa50429c..5d139b1add462f44a11e0801dc87e722819b34a3 100644 --- a/10-1 DelegateVariable/Program.cs +++ b/10-1 DelegateVariable/Program.cs @@ -21,7 +21,7 @@ namespace _10_1_DelegateVariable t1.Callback += Console.WriteLine; t1.Callback += AusgabeInGrossbuchstaben; - t1.Callback = AusgabeInKleinbuchstaben; + t1.Callback += AusgabeInKleinbuchstaben; t1.Callback += delegate (string s) { Console.WriteLine($"*** {s} ***"); }; t1.Callback += s => { Console.WriteLine($"--- {s} ---"); }; //t1.print -= AusgabeInGrossbuchstaben; @@ -31,6 +31,7 @@ namespace _10_1_DelegateVariable // Anonyme Methoden & Lambda-Ausdrücke können nicht aus der Liste entfernt werden! t1.Print("Hallo"); + // t1.Callback("Hallo"); //~ Direkter Aufruf der Delegate-Var ist bei event nicht erlaubt // t2.print += t1.print; Ebenfalls nicht erlaubt //t2.Print("Welt"); diff --git a/10-3 WpfButton/MainWindow.xaml b/10-3 WpfButton/MainWindow.xaml index 04922d8e47d55d015383b3dae40dd622cc020514..2ee5cd48373b6d9b7557839483c0cf276c8c28e3 100644 --- a/10-3 WpfButton/MainWindow.xaml +++ b/10-3 WpfButton/MainWindow.xaml @@ -7,7 +7,9 @@ mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> - <Button Content="Mein Button" HorizontalAlignment="Left" Margin="117,91,0,0" VerticalAlignment="Top" Click="Button_Click"/> + <Button x:Name="btnMeinKlickButton" Content="Klick!" HorizontalAlignment="Left" Margin="117,91,0,0" VerticalAlignment="Top" Click="Button_Click"/> + <Label x:Name="LblCount" Content="" HorizontalAlignment="Left" Height="32" Margin="117,158,0,0" VerticalAlignment="Top" Width="247"/> + <Button x:Name="DoppelklickButton" Content="Mein Doppelklick Button" HorizontalAlignment="Left" Margin="439,64,0,0" VerticalAlignment="Top" MouseDoubleClick="MeineDoppelklickMethode"/> </Grid> </Window> diff --git a/10-3 WpfButton/MainWindow.xaml.cs b/10-3 WpfButton/MainWindow.xaml.cs index 861b8304604205f71ab77ca7c91e1527434d4a3c..8d644100af71b5031ed8d250a5e2d1c108e75195 100644 --- a/10-3 WpfButton/MainWindow.xaml.cs +++ b/10-3 WpfButton/MainWindow.xaml.cs @@ -20,6 +20,7 @@ namespace _10_3_WpfButton /// </summary> public partial class MainWindow : Window { + int count = 0; public MainWindow() { InitializeComponent(); @@ -27,6 +28,14 @@ namespace _10_3_WpfButton private void Button_Click(object sender, RoutedEventArgs e) { + count++; + LblCount.Content = $"Der Button wurde {count} mal angeklickt!"; + } + + private void MeineDoppelklickMethode(object sender, MouseButtonEventArgs e) + { + count+= 10; + LblCount.Content = $"Der Button wurde {count} mal angeklickt!"; } } diff --git a/11-1 DataDriven/11-1 DataDriven.csproj b/11-1 DataDriven/11-1 DataDriven.csproj new file mode 100644 index 0000000000000000000000000000000000000000..0856a087de8decd20c745880dcc56cee4252d561 --- /dev/null +++ b/11-1 DataDriven/11-1 DataDriven.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>_11_1_DataDriven</RootNamespace> + </PropertyGroup> + +</Project> diff --git a/11-1 DataDriven/MyInt.cs b/11-1 DataDriven/MyInt.cs new file mode 100644 index 0000000000000000000000000000000000000000..3d619a3c89ab4de2e8f14f61a3821eb79db6a817 --- /dev/null +++ b/11-1 DataDriven/MyInt.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace _11_1_DataDriven +{ + + class MyInt + { + public delegate void Seiteneffekt(int x); + + private int data; + public event Seiteneffekt Ausgabe; + public int Content + { + get => data; + set + { + data = value; + Ausgabe?.Invoke(data); + } + } + } +} diff --git a/11-1 DataDriven/Program.cs b/11-1 DataDriven/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..a00a474645f9ea94f8a2218a318d8ed373150461 --- /dev/null +++ b/11-1 DataDriven/Program.cs @@ -0,0 +1,32 @@ +using System; + +namespace _11_1_DataDriven +{ + class Ausgabeaufbereitungen + { + public static void Textausgabe(int x) + { + Console.WriteLine($"Textausgabe: {x}"); + } + public static void Balkenanzeige(int x) + { + for (int i = 0; i < x; i++) + Console.Write("*"); + Console.WriteLine(); + } + } + class Program + { + static void Main(string[] args) + { + MyInt x1 = new MyInt(); + x1.Ausgabe += Ausgabeaufbereitungen.Balkenanzeige; + x1.Ausgabe += Ausgabeaufbereitungen.Textausgabe; + + x1.Content = 10; + x1.Content = 20; + x1.Content++; + + } + } +} diff --git a/11-2 Delegate Verkettung/11-2 Delegate Verkettung.csproj b/11-2 Delegate Verkettung/11-2 Delegate Verkettung.csproj new file mode 100644 index 0000000000000000000000000000000000000000..87ce2702f016f839a6c684dcc8b83541fcd0800a --- /dev/null +++ b/11-2 Delegate Verkettung/11-2 Delegate Verkettung.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>_11_2_Delegate_Verkettung</RootNamespace> + </PropertyGroup> + +</Project> diff --git a/11-2 Delegate Verkettung/MessageBox.cs b/11-2 Delegate Verkettung/MessageBox.cs new file mode 100644 index 0000000000000000000000000000000000000000..1ae2df29de4895413afee1babb5012a74596cb58 --- /dev/null +++ b/11-2 Delegate Verkettung/MessageBox.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace _11_2_Delegate_Verkettung +{ + class MessageBox + { + public delegate void Modifier(ref string s); + + public event Modifier Modify; + + public void Send(string s) + { + Modify?.Invoke(ref s); + Console.WriteLine($"Der modifizierte String: {s}"); + } + + } +} diff --git a/11-2 Delegate Verkettung/Program.cs b/11-2 Delegate Verkettung/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..85a7dbc4ac9e6e551266c916642a2b928dc3138a --- /dev/null +++ b/11-2 Delegate Verkettung/Program.cs @@ -0,0 +1,24 @@ +using System; + +namespace _11_2_Delegate_Verkettung +{ + class Program + { + static void ToUpper(ref string s) + { + s = s.ToUpper(); + } + static void WortRest(ref string s) + { + s = s.Substring(6); + } + static void Main(string[] args) + { + MessageBox mb = new MessageBox(); + mb.Modify += ToUpper; + mb.Modify += WortRest; + + mb.Send("Hello World!"); + } + } +} diff --git a/11-Ubg Mailverteiler-Mo/11-Ubg Mailverteiler-Mo.csproj b/11-Ubg Mailverteiler-Mo/11-Ubg Mailverteiler-Mo.csproj new file mode 100644 index 0000000000000000000000000000000000000000..b1b8b4cc8985212536814b6af8df8089e763fb33 --- /dev/null +++ b/11-Ubg Mailverteiler-Mo/11-Ubg Mailverteiler-Mo.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>_11_Ubg_Mailverteiler_Mo</RootNamespace> + </PropertyGroup> + +</Project> diff --git a/11-Ubg Mailverteiler-Mo/MessageBox.cs b/11-Ubg Mailverteiler-Mo/MessageBox.cs new file mode 100644 index 0000000000000000000000000000000000000000..b594ba9b9d9ed8c0109f5bb091757c605e3550af --- /dev/null +++ b/11-Ubg Mailverteiler-Mo/MessageBox.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace _11_Ubg_Mailverteiler_Mo +{ + // Firma A + delegate void Callback(string s); + + class MessageBox + { + public Callback Verteiler; + // Event = Einschränkung + // * Nur += und -= von außerhalb erlaubt + // * Aufruf der Event-Var nur durch Methoden von MessageBox + + public void Send(string s) + { + // Etwaige Vorarbeiten vor dem Aufruf + Verteiler?.Invoke(s); + // ?. ~ (Verteiler == null) ? null : Verteiler.Invoke(s) + // Etwaige Nacharbeiten + } + } +} diff --git a/11-Ubg Mailverteiler-Mo/Program.cs b/11-Ubg Mailverteiler-Mo/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..52f29fccb8f35a8b278592d470afe439af3d5107 --- /dev/null +++ b/11-Ubg Mailverteiler-Mo/Program.cs @@ -0,0 +1,57 @@ +using System; + +namespace _11_Ubg_Mailverteiler_Mo +{ + // Legen Sie ein Delegate void Callback(string s) an + // Erstellen Sie eine Klasse MessageBox mit + // - Einem Event verteiler + // - Einer Methode Send(string s), welche die verteiler Variable aufruft + + // Experimentieren Sie ... + // 1) Legen Sie zwei Dummy-Klassen ClassA und ClassB an. Beide Klassen sollen öffentliche Methoden + // (statisch/nicht-statisch) besitzen, die der Callback-Signatur entsprechen + // 2) Definieren Sie auch in Main noch eine statische Methode, die der Callback-Signatur entspricht + // 3) Legen Sie eine Instanz der MessageBox an und registrieren Sie die Methoden in der Event-Variablen + // 4) Rufen Sie Send() mit einem Text auf + // 5) Entfernen Sie eine der registrierten Methoden und geben Sie noch einen Text aus + + + // Firma B + + class DummyA + { + int a = 0; + public void Ausgabe(string text) + { + Console.WriteLine($"{text}: {++a} mal aufgerufen"); + } + } + class DummyB + { + public static void PrintUpperCase(string txt) + { + Console.WriteLine($"{txt.ToUpper()}"); + } + } + class Program + { + static void Main(string[] args) + { + MessageBox mb = new MessageBox(); + DummyA a1 = new DummyA(); + DummyA a2 = new DummyA(); + + mb.Verteiler += a1.Ausgabe; + mb.Verteiler += a2.Ausgabe; + mb.Verteiler += a2.Ausgabe; + mb.Verteiler += DummyB.PrintUpperCase; + mb.Verteiler = Console.WriteLine; + + mb.Send("Erster Aufruf"); + mb.Send("Zweiter Aufruf"); + + mb.Verteiler -= a2.Ausgabe; + mb.Send("Dritter Aufruf"); + } + } +} diff --git a/Prog2WienkopSS2021.sln b/Prog2WienkopSS2021.sln index 146b443bb0137f8a55008211866596cda330227d..dc3125553e27c60d3c284f00088552f076e0268a 100644 --- a/Prog2WienkopSS2021.sln +++ b/Prog2WienkopSS2021.sln @@ -83,7 +83,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "10-1 GenerischeListeMitSuch EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "10-Ubg HashDict-Di", "10-Ubg HashDict-Di\10-Ubg HashDict-Di.csproj", "{C903192E-44CA-42C3-A136-65E13026ECB1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "10-3 WpfButton", "10-3 WpfButton\10-3 WpfButton.csproj", "{11636803-CB01-4A29-ADAE-F03F3F38ED70}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "10-3 WpfButton", "10-3 WpfButton\10-3 WpfButton.csproj", "{11636803-CB01-4A29-ADAE-F03F3F38ED70}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "11-Ubg Mailverteiler-Mo", "11-Ubg Mailverteiler-Mo\11-Ubg Mailverteiler-Mo.csproj", "{C36B7276-D500-4147-853C-9B90418514B1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "11-1 DataDriven", "11-1 DataDriven\11-1 DataDriven.csproj", "{0799E33E-C645-4CBD-BD98-623E290E947C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "11-2 Delegate Verkettung", "11-2 Delegate Verkettung\11-2 Delegate Verkettung.csproj", "{0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -255,6 +261,18 @@ Global {11636803-CB01-4A29-ADAE-F03F3F38ED70}.Debug|Any CPU.Build.0 = Debug|Any CPU {11636803-CB01-4A29-ADAE-F03F3F38ED70}.Release|Any CPU.ActiveCfg = Release|Any CPU {11636803-CB01-4A29-ADAE-F03F3F38ED70}.Release|Any CPU.Build.0 = Release|Any CPU + {C36B7276-D500-4147-853C-9B90418514B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C36B7276-D500-4147-853C-9B90418514B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C36B7276-D500-4147-853C-9B90418514B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C36B7276-D500-4147-853C-9B90418514B1}.Release|Any CPU.Build.0 = Release|Any CPU + {0799E33E-C645-4CBD-BD98-623E290E947C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0799E33E-C645-4CBD-BD98-623E290E947C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0799E33E-C645-4CBD-BD98-623E290E947C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0799E33E-C645-4CBD-BD98-623E290E947C}.Release|Any CPU.Build.0 = Release|Any CPU + {0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FC3EC66-BD2E-46C4-8512-FB1DFD6A62F8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE