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:
Hier noch mein bisheriger Code:
program.cs:
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 { [STAThread] public static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormBasic());
mySampleClass mySC = new mySampleClass(); myMethodDelegate myD1 = new myMethodDelegate(mySC.myStringMethod); myMethodDelegate myD2 = new myMethodDelegate(mySampleClass.mySignMethod);
Console.ReadLine(); } } } |
delegate.cs:
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 {
public static String mySignMethod(string myString) { } } } |
formbasic.cs (war: form1.cs):
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"; } } } |