Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft
WinForms ohne Baukasten (Teil 1)

Der Formular Designer in Visual Studio ist zweifellos das Werkzeug, welches die größte Zeitersparnis bringt. Durch einfaches "zeichnen" lassen sich komplexe Windows-Anwendungen gestalten, ohne dass eine Zeile Programmcode geschrieben werden muß.

Aber man kann natürlich Formulare mit Steuerelementen auch von Hand programmieren. Denn etwas anderes tut der Designer auch nicht: Im Hintergrund wird immer Programmcode erzeugt oder verändert.

Warum sollte man aber auf den Designer verzichten? Darauf gibt es mehrere Antworten. Es kann unter Umständen nötig sein, Steuerelemente erst nach Programmstart zu erstellen. Das kann der Designer nicht. Außerdem gibt es weitaus mehr Programmierumgebungen als nur das Visual Studio und nur wenige haben eine Formular Designer. Auch deshalb sollte man wissen wie Steuerelemente von Hand erstellt werden.

Um es nicht ganz so kompliziert zu machen, soll dieses Beispiel sich mit dem manuellen Erstellen von Steuerelementen beschäftigen. Gehen wir also davon aus, dass wir schon ein Formular haben, dem wir Steuerelemente hinzufügen können. Natürlich kann man auch Formulare ohne den Designer erstellen aber das werde ich zu einem späteren Zeitpunkt gesondert erklären.
Erstellen wir also einen Button :
Button buttonOK = new Button();
buttonOK.Location = new Point(10, 10);
buttonOK.Size 100er new Size(75, 25);
buttonOK.Text = "OK";
Das war doch gar nicht schwer. Zuerst erstellen wir mit buttonOK ein Objekt der Button-Klasse. Dann werden einige Eigenschaften des neu erstellten Buttons verändert. Location bestimmt die Position der linken oberen Ecke des Button während die Werte in Size Breite und Höhe festlegen. Soll auf dem Button ein Text stehen, so ist dafür die Text-Eigenschaft zuständig. Natürlich gibt es viele weitere Eigenschaften wie Farbe, Schriftart und Textausrichtung. Aber diese hier sind die Wichtigsten, so dass wir uns erst einmal damit begnügen werden.

Würden wir diese Programmzeilen jetzt ausführen, so würden wir schnell merken, dass hier überhaupt nichts passiert. Wir haben zwar einen neuen Button erzeugt, sehen ihn aber nicht. Es fehlt ein wichtiger Schritt, wir müssen den neuen Button unserem Formular hinzufügen.
Controls.Add(buttonOK);
Jedes Formular hat eine Liste von Steuerelementen (Controls). Dieser Liste müssen wir unseren neu erstellten Button hinzufügen, dann wird er auch sichtbar und zeigt auch das für einen Button typische Verhalten, wenn man auf ihn klickt. Reaktionen auf einen solchen Mausklick gibt es allerdings noch keine. Wir haben ja auch noch keine Funktionalität hinterlegt. Außerdem weiß der Button noch gar nicht, dass er bei einem Mausklick reagieren soll.

Zusätzlich zu den Eigenschaften des Buttons gibt es Ereignisse (Events) auf die ein Button reagieren kann. Für uns ist jetzt nur ein Ereignis interessant, nämlich das, welches stattfindet wenn auf den Button geklickt wird.
buttonOK.Click
Das ist jetzt noch kein vollständiger Befehl. Was hier noch fehlt ist die Methode, die beim Anklicken dann wirklich aufgerufen wird.
buttonOK.Click += new System.EventHandler(buttonOK_Click);
Die aufzurufende Methode wird hier als Delegate-Methode angehängt. Tatsächlich sind hier sogar Multicast-Delegates möglich denn durch das "+=" können mehrere Methoden am Click Ereignis angehängt werden. Das funktioniert zwar problemlos ist mir aber in der Praxis noch nie begegnet, so dass ich von solchen Vorgehensweisen Abstand nehmen würde. Sollten hier noch Unklarheiten bestehen so verweise ich auf mein Tutorial "Delegates mal ganz einfach".

Da es sich hier um einen EventHandler handelt ist es nicht verwunderlich, dass die aufzurufende Methode zwei spezielle Parameter erwartet. Das ist zum einen das Senderobjekt des Ereignisses und als zweites ein EventArgs-Argument. Im Programm sieht das ganze dann so aus:
private void buttonOK_Click(object sender, EventArgs e)
{
}
Dies ist jetzt die Methode die beim Click-Ereignis unseres Buttons ausgeführt wird. In der Regel wird man bei einem einfachen Button das Sendeobjekt und den EventArgs nicht benötigen aber es ist durchaus Interessant zu sehen was diese beiden Parameter übertragen.
private void buttonOK_Click(object sender, EventArgs e)
{
   MessageBox.Show(sender.GetType().ToString());
   MessageBox.Show(e.GetType().ToString());
}
Der Sender ist in diesem Fall wörtlich zu nehmen. Es ist wirklich das Absenden der Nachricht, in diesem Fall eben einer vom Typ "Button". EventArgs enthält hingegen Informationen über die Nachricht. So erhält man zum Beispiel verschiedene Nachrichtentypen wenn man den Button wirklich mit der Maus anklickt oder wenn man die Klickfunktion mit der Eingabetaste ausführt.

Wie dieses erste Beispiel zeigt ist es gar nicht so schwer ohne den Designer auszukommen.