GTK+-Programmierung mit FreePascal (Referenz)
Vorwort
Ich hatte eigentlich etwas mehr von GTK+ für FreePascal erwartet, denn der derzeitige Stand von GTK+ für FreePascal ist der, dass alles sich fast identisch wie das C GTK+ verhält. Ich stellte mir unter FreePascal GTK+ eigentlich eher vor, daß der Wrapper Gebrauch von der Objektorientierung von Pascal machen würde. Nun ja, vieles, was hier steht, wird Ihnen eventuell aus anderen Teilen des GTK+-Workshops bekannt vorkommen und soll nun mehr als eine kürzere Zusammenfassung dessen für FreePascal darstellen. Warum ich mich trotz der Enttäuschung weiter mit GTK+ für FreePascal auseinandergesetzt habe, hängt damit zusammen, dass an der Schule, an der ich bin, der aktuelle Informatik-Leistungskurs mit FreePascal unterrichtet wird, und ich damit GTK+ verbinden wollte.
Allgemeiner Programmaufbau
In einem GTK-Pascal-Programm müssen stets die Unit gtk und glib geladen werden. Diese stellen GTK-Funktionen und Typen bereit und zusätzlich den Ersatz einiger Standard-C-Funktionen, von denen wir in der GTK Freepascal-Version jedoch keinen Gebrauch machen werden.
Vor jeglicher Arbeit mit GTK-Funktionen muss GTK+ initialisiert werden. Dies geschieht mit der Funktion gtk_init, die einen Zeiger auf die Anzahl der Parameter und auf die Parameterliste benötigt, um GTK-bezügliche Parameter herauszufiltern. Deshalb sieht der Standard-Aufruf der Funktion wie folgt aus:
gtk_init(@argc, @argv);
Nach der Aufstellung aller Widgets muss die Funktion gtk_main(); aufgerufen werden. Sie übernimmt in einer Schleife dann das Programm und prüft auf auftretende Ereignisse (Mausklicks, Tastendrücke). Wenn man ein Programm für Windows schreiben will, ist der Compilerschalter {$APPTYPE GUI} nützlich, wird er verwendet, wird kein MSDOS-Fenster mehr angezeigt, was man wohl will, wenn man ein Windows-Programm schreibt. Aber WARNUNG: In diesem Falle gibt es keine Standard Ein- oder Ausgabe mehr. Das GTK-Programm wird durch gtk_main_quit() beendet.
Ein Beispiel zu einem minimalen GTK-Programm ist grund.pas.
Bedienelemente allgemein
Das ganze GTK-System besteht aus Bedienelementen, Widgets genannt. Jeder Teil von GTK+ ist eine Untergruppe dieser Widgets und es werden alle Variablen als Typ PGtkWidget deklariert, egal, ob es später ein Knopf oder ein Fenster wird.
Funktionen für alle Widgets
| Funktion | Bedeutung |
|---|---|
gtk_widget_show(widget) | Ein bereits erstelltes Widget wird angezeigt |
gtk_widget_show_all(widget) | Zeigt ein Widget und all seine "Kinder" an |
gtk_widget_hide(widget) | Ein Widget wird versteckt, seine Daten bleiben erhalten |
gtk_widget_destroy(widget) | Ein Widget wird zerstört und seine Daten gehen verloren, der Speicher wird freigemacht |
Fenster
Fenster sind eine Untergruppe der Container>, weshalb alle Containerfunktionen auf sie angewendet werden können. Über Fenster gibt es nicht viel zu wissen, da sie eigentlich nur einen einfachen Rahmen um die Bedienelemente (Widgets) des Programms darstellen.
Wichtige Funktionen zu Fenstern
| Funktion | Bedeutung |
|---|---|
gtk_window_new(typ) | Reserviert Speicher für ein neues Fenster und richtet es ein. Der typ ist entweder: GTK_WINDOW_TOPLEVEL für ein ProgrammhauptfensterGTK_WINDOW_DIALOG für ein Dialogfenster (was von Windows und vielen Window-Managern gesondert behandelt wird)GTK_WINDOW_POPUP, ein Popup-Fenster, was in einer Bildschirmecke klebt und immer im Vordergrund bleibt |
gtk_window_set_title(fenster, titel) | Setzt den |
gtk_window_set_defaultsize(fenster, x, y) | Setzt die Standardgröße des Fensters |
Wichtige Signale von Fenstern
| Signal | Bedeutung |
|---|---|
delete_event | Fenster soll geschlossen werden |
destroy | Fenster soll zerstört werden |
Unter Windows werden unglücklicherweise beim Schließen des letzten Fensters sowohl delete_event als auch destroy ausgelöst.
Container
Container sind Widgets, die ein anderes Widget aufnehmen können. Dazu gehören Fenster, Buttons, Tabs und viele andere.
Wichtige Funktionen zu Containern
| Funktion | Bedeutung |
|---|---|
gtk_container_add(container, widget) | Packt ein Widget in den Container |
gtk_container_remove(container, widget) | Löscht ein Widget aus einem Container |
gtk_container_set_border_width(container, pixel) | Setzt Rahmenbreite eines Containers |
Labels
Labels sind einfache Widgets, die Text anzeigen. Label heißt auf deutsch Etikett und genauso werden sie in Programmen verwendet, um Teile zu beschriften.
Wichtige Funktionen zu Labels
| Funktion | Bedeutung |
|---|---|
gtk_label_new(aufschrift) | Erzeugt ein neues Label mit einer Aufschrift |
gtk_label_set_text(text) | Ändert den Text eines bestehenden Labels |
Beispielprogramm zu Fenstern, Containern und Labels
Dieses erste Beispielprogramm erzeugt ein Fenster, ein Label mit der Aufschrift "Hallo Welt", packt das Label in das Fenster, zeigt alles an und startet den GTK-Main loop. ACHTUNG: das Programm ist unfähig, sich selbst zu beenden. Nach dem Schließen des Fensters läuft es weiter und muss mit CTRL+C oder dem Prozessmanager des betreffenden Betriebssystems gekillt werden.
Buttons
Buttons sind normale Knöpfe, wie man sie im Allgemeinen oft sieht. Sie lösen beim Drücken, beim Loslassen und beim Klicken (Drücken+Loslassen) Signale aus. Buttons sind Container und können Texte, Bilder, oder andere Widgets (andere Buttons *G*) enthalten.
Wichtige Funktionen zu Buttons
| Funktion | Bedeutung |
|---|---|
gtk_button_new() | Erzeugt einen neuen Button ohne Inhalt |
gtk_button_new_with_label(Aufschrift) | Erzeugt einen neuen Button und packt ein Label mit einer Aufschrift rein |
Signale von Buttons
| Signal | Bedeutung |
|---|---|
pressed | Wird ausgelöst, wenn der Button gedrückt wird |
released | Wird ausgelöst, wenn der Button losgelassen wird |
clicked | Wird ausgelöst, wenn der Button gedrückt und wieder losgelassen wird |

