Autor Beitrag
dubstep
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72

Win XP, Win 7
C# (VS 2010)
BeitragVerfasst: So 24.10.10 16:42 
Meine Aufgabenstellung:
Umsetzung einer beliebigen einfachen Simulation durch Delegaten.
Das ganze könnte so aussehen: Ich habe in WinForms als BackgroundImage eine Art Linie mit drei Stationen. Ein U-Bahnzug (dargestellt durch PictureBox) fährt diese drei Stationen durch einen Timer entlang - das funktioniert alles schon und ist bereits fertig implementiert.
Doch jetzt kommen die Delegaten ins Spiel: Die Station und der U-Bahnzug stellen je ein Objekt dar. Der Sinn hinter Delegaten ist (soweit ich das richtig verstanden habe), dass ein Objekt auf ein Ereignis eines anderen Objektes reagiert. Das ganze könnte man so umsetzen: Fährt das Objekt U-Bahnzug in die Station ein, so reagiert die Station mit mehreren Ereignissen. Das Signal (dargestellt durch zwei PictureBoxen - eine PictureBox mit rotem Signal als Bild, die zweite PictureBox mit grünem Signal als Bild) soll von rot auf grün wechseln. Weiters soll das Fahrgastinformationsdisplay von "Abfahrt in 1 Minute" auf "boarding-Symbol" schalten. Das Fahrgastinformationsdisplay in der Station wird ebenfalls durch zwei PictureBoxen dargestellt.
Sobald der U-Bahnzug einen bestimmten x-Wert bei der Position erreicht hat, soll z.B. die PictureBoxSignalRot durch die PictureBoxSignalGrün ersetzt werden. Dies wird dadurch erreicht, indem die PictureBoxSignalGrün auf ".visible = true" gesetzt wird.
Das Beispiel im msdn zu Delegaten ist eigentlich schon ganz brauchbar, aber hier habe ich leider das Problem, dass es auf Konsolenausgabe und nicht GUI basiert. In "program.cs" gibt man einen gewünschten Zahlenwert ein und eine Ausgabe (je nachdem ob die Zahl positiv oder negativ ist) erfolgt. Ist die eingegebene Zahl positiv so wird Funktion "a" genommen, ist die Zahl negativ, so wird Funktion "b" genommen.
Genauso würde ich es auch gerne bei meiner Simulation umsetzen. Die Location (x-Wert des U-Bahnzuges) wird eingelesen. Je nachdem welcher x-Wert das nun ist, wird die entsprechende Funktion gewählt.
Leider fehlt mir irgendwie ein Ansatz, wie (und wo) ich Delegaten hier einbauen kann. Ein Teil davon wird wahrscheinlich in "program.cs" gehören, ein Teil (wahrscheinlich die Funktionen) in "form.cs", ....
Hier noch ein Bild um sich das besser vorstellen zu können:
user defined image
user defined image

Hier noch mein bisheriger Code:
program.cs:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
 public static class Program 
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormBasic());

            // folgende Zeilen aus msdn - sind derzeit noch rot unterwellt
            // Dies könnte man umgehen, indem man program.cs von delegate.cs erben lassen würde
            // Doch macht das überhaupt Sinn?
            mySampleClass mySC = new mySampleClass();
            myMethodDelegate myD1 = new myMethodDelegate(mySC.myStringMethod);
            myMethodDelegate myD2 = new myMethodDelegate(mySampleClass.mySignMethod);

            Console.ReadLine();
        }
    }
}


delegate.cs:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
{
    public class Delegate 
    {
        
        public delegate String myMethodDelegate(int myString);

       
        public class mySampleClass
        {

           // mySignMethod wird rot unterwellt, weil - eh klar - noch kein Wert zurückgegeben wird
            public static String mySignMethod(string myString)
            {
               
            }
        }
    }


formbasic.cs (war: form1.cs):
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
    public partial class FormBasic : Form
    {
        public FormBasic()
        {
            InitializeComponent();
            
        }


        public void timerZug01U2_TickZug01(object sender, EventArgs e)
        {
            if(textBox1.Text == "abfertigen")
            {
                if (pictureBoxZug01U2.Location.X == 351)
                {
                    textBox1.Text = "stop";
                }

                else
                {
                    timerZug01U2.Interval = 5;
                    pictureBoxZug01U2.Left = pictureBoxZug01U2.Left + 1;
                    textBoxaktuellePosition.Text = Convert.ToString(pictureBoxZug01U2.Location.X);
                }
            }
        }

        private void buttonZugAbfertigen_Click_1(object sender, EventArgs e)
        {
            textBox1.Text = "abfertigen";
        }
    }
}
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 25.10.10 09:28 
Hallo und guten Morgen -)

Zuersteinmal zu deinem Delegate-Code: du brauchst nicht von Delegate zu erben, sondern verwendest einfach:
ausblenden C#-Quelltext
1:
Delegate.myMethodDelegate // btw: Klassnnamen und öffentliche Eigenschaften/Member sollten mit einem Großbuchstaben anfangen (laut eigener MS-Richtlinie -)					


Jetzt zum eigentlichen:
die Umsetzung sollte mittels Ereignissen (Events) passieren - dies sind sog. Multicast-Delegates, s.a. Eigenen Event definieren / Information zu Events