ein Kapitel zurück                                           ein Kapitel weiter

Natürlich sollen sie auch wissen wie so ein Widget "überlebt". Das allozieren des Speichers und wieder freigeben, geschieht meistens Automatisch.

Wenn wir Beispielsweise ein Widget "zerstören" wollen rufen wir die Funktion gkt_widget_destroy auf. Damit wird das Widget aus dem Container entfernt und der Speicher und andere Ressourcen werden freigegeben.

Hierzu der Syntax:

void gtk_widget_destroy(GtkWidget *widget);  

Und hierzu ein Programmbeispiel:

/*Download:gtklife.c*/

#include <gtk/gtk.h>
#include <gtk/gtkwidget.h>


void ende_cb(GtkObject *object)
{
 gtk_main_quit();
}

void weg_damit_cb(GtkWidget *widget, gpointer data)
{
 gtk_widget_destroy(widget);
}


int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *button1, *button2;
 GtkWidget *table;
 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/
 button1  = gtk_button_new_with_label("gtk_widget_destroy");
 button2  = gtk_button_new_with_label("Quit");

 /*Tabelle erstellen...*/
 table = gtk_table_new(2,2,FALSE);

 /*Signale registrieren*/
 gtk_signal_connect(GTK_OBJECT(fenster), "delete_event",
                    GTK_SIGNAL_FUNC(ende_cb), NULL);
 gtk_signal_connect(GTK_OBJECT(button1), "clicked",
                    GTK_SIGNAL_FUNC(weg_damit_cb), NULL);
 gtk_signal_connect_object(GTK_OBJECT(button2), "clicked",
                           GTK_SIGNAL_FUNC(gtk_main_quit), GTK_OBJECT(fenster));
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "gtk_widget_destroy");
 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),15);

 /*Inhalt der Tabelle mit verschiedenen Optionen erstellen....*/
 gtk_table_attach(GTK_TABLE(table),button1, 0,1, 0,1,
                  GTK_FILL, GTK_FILL, 0,0);
 gtk_table_attach(GTK_TABLE(table), button2, 0,1, 1,2,
                  GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND|GTK_SHRINK,0,0);


 gtk_container_add(GTK_CONTAINER(fenster),table);

 /*Zeigs uns.....*/
 gtk_widget_show_all(fenster);

 gtk_main();

 return 0;
}

Und so könnte es aussehen:




Und nach dem Klick auf dem Button gtk_widget_destroy welcher die Callback- Funktion weg_damit_cb aufruft:




Intern besitzt jedes Widget einen Referenz-Zähler. Haben wir zum Beispiel ein Widget erzeugt ist dieser Zähler auf 1. Wenn wir das Widget wieder aus dem Container entfernen, wird der Zähler wieder auf 0 dekrementiert. Wenn also eine Referenz den Wert 0 erreicht ist das Widget "zerstört". Die bedeutet auch, wenn sie ein Widget zerstören welches viele andere Widget beinhaltet, wird dieser Inhalt auch mitzerstört. Dies sollten sie beachten wenn sie ein Programm schreiben und ein Widget entfernen wollen.

Nun will man manch mal ein Widget aus dem Container entfernen und es später wieder hinzufügen. Für solch einen Fall könnten sie eine Referenz auf ein Widget einrichten mit:

void gtk_object_ref(GtkObject *object);  

Wenn sie nun eine Widget aus dem Container entfernen, gehen sie folgendermaßen vor:

gtk_object_ref(widget);
gtk_containter_remove(container,widget);  

Wenn sie das Widget nicht mehr benötigen müssen sie es un-referenzieren mit gtk_object_unref.

Sinn macht dies aber nur wenn sie Beispielsweise ein Widget aus einem Container entfernen und in einem anderen wieder einfügen. Wenn sie ein Widget kurz entfernen und später wieder hinzufügen wollen, empfehle ich Ihnen die schnelleren Funktionen gtk_widget_hide und gtk_widget_show. Hier ein Beispiel wie sie das machen können:

/*Download:gtklife2.c*/

#include <gtk/gtk.h>
#include <gtk/gtkwidget.h>


void ende_cb(GtkObject *object)
{
 gtk_main_quit();
}


int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *button1, *button2;
 GtkWidget *table;
 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/
 button1  = gtk_button_new_with_label("Verstecke mich");
 button2  = gtk_button_new_with_label("Zeig ihn wieder");

 /*Tabelle erstellen...*/
 table = gtk_table_new(2,2,TRUE);

 /*Signale registrieren*/
 gtk_signal_connect(GTK_OBJECT(fenster), "delete_event",
                    GTK_SIGNAL_FUNC(ende_cb), NULL);
 gtk_signal_connect_object(GTK_OBJECT(button1), "clicked",
                    GTK_SIGNAL_FUNC(gtk_widget_hide), GTK_OBJECT(button1));
 gtk_signal_connect_object(GTK_OBJECT(button2), "clicked",
                    GTK_SIGNAL_FUNC(gtk_widget_show), GTK_OBJECT(button1));
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "gtk_widget_destroy");
 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),15);

 /*Inhalt der Tabelle mit verschiedenen Optionen erstellen....*/
 gtk_table_attach_defaults(GTK_TABLE(table),button1, 0,1, 0,1);
 gtk_table_attach_defaults(GTK_TABLE(table), button2, 1,2, 1,2);


 gtk_container_add(GTK_CONTAINER(fenster),table);

 /*Zeigs uns.....*/
 gtk_widget_show_all(fenster);

 gtk_main();

 return 0;
}

Es gibt natürlich noch eine Menge weiterer Widget Konzepte. Alle hier aufzuzählen währe zu Umfangreich. Sie finden viele dieser Widgets Funktionen in der GTK-Referenz, welche meist schon anhand des Namens eindeutig zu verstehen sind. Wir werde natürlich viele von diesen im Laufe des Tutorials noch kennen lernen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf