Gambas: Form
zurück zu Gambas
- zurück zu Gambas: Steuerelemente
Siehe auch Waybackmaschine und dann www.madeasy.de/7/prgmini.htm#form
Wie erstellt man ein neues Formular?
[Bearbeiten]In der Gambas-IDE geht man mit der rechten Maustaste auf Formulare . Dann wählt man Neu und Formular. Meist nutzt man das ausgewählte Formular auch als Startformular und muss dies dann mit dem kleinen grünen Pfeil angeben. Oder aber man hat bereits ein Startformular oder eine Startklasse, dann wählt man einfach ein Formular ohne den grünen Pfeil.
Einfaches zum Thema Formular
[Bearbeiten]Im folgenden werden ein paar Dinge zum Formular erklärt, die man immer wieder braucht.
Ausführen von Anweisungen direkt beim Öffnen des Formulares
PUBLIC SUB Form_Open() Anweisung_1 ... Anweisung_N END
Ausführen von Anweisungen wenn man mit der Maus darauf kommt
PUBLIC SUB Form_Enter() Anweisung_1 ... Anweisung_N END
Den Namen eines Formulares ändern mit
ME.Text = „neuer Titel“
Schließt ein Formular
ME.Close
Fragen
[Bearbeiten]Wie kann man 2 Formulare gleichzeitig darstellen?
STATIC PUBLIC SUB Main() Form1.Show Form2.Show END
oder eben noch mehr als 2 gleichzeitig
STATIC PUBLIC SUB Main() Form1.Show Form2.Show Form3.Show Form4.Show .... END
Wie kann man 2 Formulare gleichzeitig darstellen, ohne dass sie sich überlappen?
Formular 2 liegt rechts neben Formular 1:
STATIC PUBLIC SUB Main() Form1.Show Form2.X = Form1.X + Form1.ClientWidth Form2.Y = Form1.Y Form2.Show END
Formular 2 liegt unterhalb Formular 1:
STATIC PUBLIC SUB Main() Form1.Show Form2.X = Form1.X Form2.Y = Form1.Y + Form1.ClientHeight Form2.Show END
Eine leichte Überlappung ist noch vorhanden; Ursache ist vermutlich, dass die Fensterrahmenbreite und -höhe nicht bei ClientWidth bzw. ClientHeight mitgezählt wird.
Startformular
[Bearbeiten]Das Startformular erhält von Gambas automatisch die Main Class zugeordnet. Dies erleichtert am Anfang die Programmierung, erschwert aber den Umgang mit mehreren Formularen.
Modales Formular
[Bearbeiten]Wenn man eine modales Formular aufruft, werden automatisch alle anderen Fenster passiv gestellt. Man kann also nur noch auf dem modalen Formular weitermachen.
Die Programmausführung des aufrufenden Formulars wird an der Stelle des Aufrufes des modalen Formulars eingestellt, bis das modale Formular beendet wird (wird ein nichtmodales Formular aufgerufen, geht die Programmausführung des aufrufenden Formulars parallel weiter).
Der Aufruf eines modalen Formulars erfolgt mit:
Form2.ShowModal
Hier gibt es leider einen kleinen Schönheitsfehler: Das aufrufende Formular wird zwar passiv, es lässt sich nicht mehr bedienen, die Bedienelemente sind aber nicht 'ausgegraut' und suggerieren dem Benutzer die Bedienbarkeit (Gambas Version 1.0.15). Abhilfe erreicht man durch folgenden Code:
ME.Enabled = False Form2.ShowModal ME.Enabled = True
Die 3. Zeile ist nötig, damit nach Beendigung des modalen Dialogs das aufrufende Formular wieder bedienbar wird.
Dieses gilt auch für die vordefinierten modalen Dialoge
message message.Info message.Error message.Delete message.Warning message.Question
Dieser Abschnitt muss noch ausführlich bearbeitet werden.
Siehe auch: http://www.binara.com/gambas-wiki/static/Gambas/ModalForm.html [z.Z. nicht erreichbar]
Eigenschaften eines Formulars
[Bearbeiten]Arrangement BackColor Background Border Caption Children ClientH ClientHeight ClientW ClientWidth ClientX ClientY Cursor Design Drop Enabled Expand Font ForeColor Foreground H Handle Height Icon Id Left Mask Menus Modal Mouse Next Padding Parent Persistent Previous ScreenX ScreenY SkipTaskbar Spacing State Tag Text Title ToolTip Top TopOnly Visible W Width Window X Y
- W bzw. Width
- liefert die Breite des Formulares, aber abzüglich der Fensterelemente (Rahmen links und rechts)
- H bzw. Height
- liefert die Höhe des Formulares, aber abzüglich der Fensterelemente (Rahmen oben incl. Überschrift und Rahmen unten)
Methoden eines Formulars
[Bearbeiten]- Center
- Zentriert das Formular auf der Bildschirmarbeitsfläche
Close Delete Drag Find Grab Hide Lower Move MoveScaled Raise Refresh Reparent Resize ResizeScaled SetFocus Show ShowDialog ShowModal
Ereignisse eines Formulars
[Bearbeiten]Activate Close DblClick Deactivate Drag DragMove Drop Enter GotFocus Hide KeyPress KeyRelease Leave LostFocus Menu MouseDown MouseMove MouseUp MouseWheel Move Open Resize Show
Konstanten des Formulars
[Bearbeiten]Fixed FullScreen Maximized Minimized None Normal Resizable
Tab-Order des Formulares
[Bearbeiten]Die Tab-Order ist die Reihenfolge, in welcher die grafischen Steuerelemente bei Betätigung der Tabulatortaste durchlaufen werden. Sie kann im Hierarchiefenster der IDE geändert werden.
Neues Formular
[Bearbeiten]Sie wollen mit 2 Formularen arbeiten und von einem Formular zum Anderen hin- und herspringen:
Beispiel: Sie brauchen 2 Formulare und auf jedem Formular eine Schaltfläche ( Commandbutton).
Der Code für Form1.class lautet:
PUBLIC SUB Button1_Click() Form2.Show Form1.Hide END
Der Code für Form2.class lautet:
PUBLIC SUB Button1_Click() Form1.Show Form2.Close END
Beachten Sie, dass die beiden Formulare nicht gleichberechtigt sind. Die Form2 ist ein Objekt der Startklasse für Form1. Die Form1 ist die sogenannte Hauptklasse (main class)
Wenn Sie bei Form1 folgenden Code eingeben:
PUBLIC SUB Button1_Click() Form2.Show Form1.close END
funktioniert das Programm nicht, da es vorzeitig beendet wird. Auch Form2 wird dann nicht angezeigt, da sie von Form1 abhängig ist.
Diese Abhängigkeit kann sich auch auf die Eigenschaften der Form2 auswirken.
Siehe http://www.madeasy.de/7/prgnewform.htm
Datenübergabe von einem Formular zu einem anderen Formular
[Bearbeiten]Siehe http://www.madeasy.de/7/prgformtoformplus.htm Reichlich kompliziert das Ganze. Vielleicht geht es ja auch noch einfacher.
Es geht einfacher: Siehe das nächste Kapitel mit den globalen Variablen.
Globale Variablen in Gambas
[Bearbeiten]In VB ist es möglich, z.B. aus der Form2 heraus eine Textbox in Form1 direkt anzusprechen. Der Befehl dazu lautet: Form1!Textbox1.Text = "zb". Dies funktioniert in Gambas nicht. In Gambas gibt es keine projektübergreifenden globalen Variablen. Man kann sich behelfen, wenn man eine Klasse erzeugt, die man Global nennt. Die globalen Variablen deklariert man als statische public-Variablen in dieser Klasse. Dann kann man auf sie mit Global.variablename im ganzen Projekt zugreifen.
Minsini: It's still poor programming practice but at least they'll be identified as global variables whenever you use them ;)
Programmbeispiel:
[Bearbeiten]Sie haben 2 Formulare und wollen Text zwischen den Formularen austauschen. Die globale Variable zum Textaustausch soll einfach t heißen.
- Auf Form1 haben Sie 3 Commandbuttons und eine Textbox.
- Auf Form2 haben Sie 2 Commandbuttons und eine Textbox
Der Code für die Global class (die gleichzeitig Startklasse ist) lautet:
STATIC PUBLIC t AS String STATIC PUBLIC SUB Main() form1.Show 'Wenn Sie diese Zeile nicht einfügen, wird kein Formular angezeigt. END
Der Code für Form1 lautet:
PUBLIC SUB Button1_Click() Textbox1.Text = "Dies ist ein Test" Global.t = Textbox1.Text END PUBLIC SUB Button2_Click() Global.t = Textbox1.Text Form2.Show END PUBLIC SUB Button3_Click() Textbox1.Text =Global.t END
Der Code für Form2 lautet:
PUBLIC SUB Button1_Click() Textbox1.Text = Global.t END PUBLIC SUB Button2_Click() Global.t = Textbox1.Text Form1.Show 'Form2.Close END
Wenn Sie jetzt den Text der Textbox in Form1 ändern, wird er in Form2 übergeben und durch Klicken von Button1 eingefügt. Dasselbe passiert in Form2. Auch hier können Sie den Text der Textbox ändern und der geänderte Text wird mit Anklicken des Button3 auf Form1 in der Textbox gezeigt.
Vereinfachtes Programmbeispiel zum Datenaustausch zwischen Formularen
[Bearbeiten]Das ganze geht noch einfacher wie folgendes Beispiel zeigt:
- Sie brauchen eine Global.class, die Startklasse ist.
- In Form1 brauchen Sie eine Textarea und einen Commandbutton.
- In Form2 brauchen Sie eine Textarea und einen Commandbutton.
Code für die Global.class
STATIC PUBLIC t AS String STATIC PUBLIC SUB Main() form1.show END
Für den Namen Global.class Sie können aber auch den vorgegebenen Namen Class1.class belassen, dann heißt die globale Variable nicht mehr Global.t sonder Class1.t.
Code für Form1
PUBLIC SUB Form_Open() IF NOT Global.t THEN 'Falls Global.t noch leer ist, dann fülle die Textarea mit einem text textarea1.text = "Dies ist ein Anfang" ELSE textarea1.Text = global.t ENDIF END PUBLIC SUB Button1_Click() Global.t = textarea1.Text Form1.Close Form2.show END
Code für Form2
PUBLIC SUB Form_Open() Textarea1.Text = global.t Textarea1.Text = Textarea1.Text & " und etwas dazu." & Chr(10) END PUBLIC SUB Button1_Click() Global.t = textarea1.Text form2.close form1.Show END
Jedesmal wenn man von einem Formular zum anderen wechselt, wird der Text der Textarea der globalen Variablen t zugeordnet und in der nächsten Form noch etwas hinzugefügt.
Kopieren des Formularlayouts
[Bearbeiten]Sie wollen ein umfangreiches Formularlayout exakt von einem Formular auf ein anderes kopieren. Wenn man dazu alle Elemente des Formular markiert und sie mit der rechten Maustaste mittels Copy und Paste auf das andere Formular übertragen will, dann stehen die Elemente (z.B. die Buttons) oft nicht mehr an der richtigen Stelle.
Mit einem simplen Trick sind auch nach dem Kopieren alle Elemente richtig an Ort und Stelle.
Man platziert behelfsweise zusätzlich ein Steuerelement exakt in die linke oberen Ecke (Position 0,0), hier z.B. den Button3. Dieser dient als Sperre dagegen, dass Gambas die kopierten Elemente beim Einfügen verschiebt. Vor allem bei komplexeren Layouts mit vielen, teilweise auch überlappenden Elementen ersparen man sich so jede Repositionierungsarbeit. Dieser kleine Trick hilft auch in einer ganzen Reihe von anderen Grafik-Programmen.
Siehe http://www.madeasy.de/7/prgformcopy.htm
Resize einer Textarea an eine Form
[Bearbeiten]Sie haben ein Formular mit einer Textarea. Die Größe dieser Textarea möchten Sie immer an Ihre Formulargröße anpassen.
Das Programm
[Bearbeiten]Um das Programm in Gang zu bringen, brauchen Sie ein Formular und eine Textarea.
Wenn Sie das Formular verschieben zieht die Textarea immer mit.
Wenn Sie bei den Formulareigenschaften die Bordereigenschaft auf Resizeable stellen, wird die Textarea automatisch an eine Größenänderung der Form angepasst.
So schaut das Programm im Laufmodus aus:
Der Code:
[Bearbeiten]PUBLIC SUB Form_Resize() TextArea1.Move(0, 0, ME.ClientWidth, ME.ClientHeight) END
Was hier für eine Textarea gezeigt wurde, geht natürlich genauso auch mit einer Picturebox oder einer Drawingarea.
Siehe http://www.madeasy.de/7/prgresize.htm
Ändern der Breite eines Textfeldes beim Ändern der Breite des Formulares
[Bearbeiten]PUBLIC SUB Form_Resize() TextBox1.Move(TextBox1.X,TextBox1.Y,Form1.ClientW - ( TextBox1.X * 2 ) ,TextBox1.H) END
Die Breite der Textbox wird bei Breitenänderung des Formulares so angepaßt, daß rechts derselbe Abstand zum Rand besteht wie links.