From 3b5c45a25b1a7757a6ec26316a54c1eb2a9fe6b2 Mon Sep 17 00:00:00 2001
From: Uwe Wienkop <uwe.wienkop@th-nuernberg.de>
Date: Mon, 7 Jun 2021 12:56:17 +0200
Subject: [PATCH] 2021-06-07 Delegate-Verkettung, datengetriebene
 Programmierung

---
 10-1 DelegateVariable/Button.cs               | 10 +++-
 10-1 DelegateVariable/Program.cs              |  3 +-
 10-3 WpfButton/MainWindow.xaml                |  4 +-
 10-3 WpfButton/MainWindow.xaml.cs             |  9 +++
 11-1 DataDriven/11-1 DataDriven.csproj        |  9 +++
 11-1 DataDriven/MyInt.cs                      | 24 ++++++++
 11-1 DataDriven/Program.cs                    | 32 +++++++++++
 .../11-2 Delegate Verkettung.csproj           |  9 +++
 11-2 Delegate Verkettung/MessageBox.cs        | 20 +++++++
 11-2 Delegate Verkettung/Program.cs           | 24 ++++++++
 .../11-Ubg Mailverteiler-Mo.csproj            |  9 +++
 11-Ubg Mailverteiler-Mo/MessageBox.cs         | 25 ++++++++
 11-Ubg Mailverteiler-Mo/Program.cs            | 57 +++++++++++++++++++
 Prog2WienkopSS2021.sln                        | 20 ++++++-
 14 files changed, 250 insertions(+), 5 deletions(-)
 create mode 100644 11-1 DataDriven/11-1 DataDriven.csproj
 create mode 100644 11-1 DataDriven/MyInt.cs
 create mode 100644 11-1 DataDriven/Program.cs
 create mode 100644 11-2 Delegate Verkettung/11-2 Delegate Verkettung.csproj
 create mode 100644 11-2 Delegate Verkettung/MessageBox.cs
 create mode 100644 11-2 Delegate Verkettung/Program.cs
 create mode 100644 11-Ubg Mailverteiler-Mo/11-Ubg Mailverteiler-Mo.csproj
 create mode 100644 11-Ubg Mailverteiler-Mo/MessageBox.cs
 create mode 100644 11-Ubg Mailverteiler-Mo/Program.cs

diff --git a/10-1 DelegateVariable/Button.cs b/10-1 DelegateVariable/Button.cs
index 651686e..04fe83d 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 346f0c4..5d139b1 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 04922d8..2ee5cd4 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 861b830..8d64410 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 0000000..0856a08
--- /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 0000000..3d619a3
--- /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 0000000..a00a474
--- /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 0000000..87ce270
--- /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 0000000..1ae2df2
--- /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 0000000..85a7dbc
--- /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 0000000..b1b8b4c
--- /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 0000000..b594ba9
--- /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 0000000..52f29fc
--- /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 146b443..dc31255 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
-- 
GitLab