Programmation GTK2 en Pascal/GtkComboBox
Programmation GTK2 en Pascal |
|
Présentation
modifierLe contrôle GtkComboBox permet de gérer une liste déroulante sur action de l'utilisateur. Après le choix d'une ligne de la liste, celle-ci se referme.
Ce contrôle est disponible à partir de la version 2.4 de Gtk+.
Auparavant c'était le contrôle GtkCombo
qui était utilisé. Il est toujours utilisable pour assurer la compatibilité mais n'est plus conseillé pour les nouvelles créations.
Hiérarchie
modifierHiérarchie |
GObject └─GtkObject └─GtkWidget └─GtkContainer └─GtkBin └─GtkComboBox |
Utilisation de base (mode texte sans modèle)
modifierCréation
modifierLa fonction de création d'une liste déroulante texte est simple :
function gtk_combo_box_new_text : PGtkWidget;
Ajout de texte dans la liste déroulante
modifierIl y a plusieurs fonctions possibles selon qu'on veuille ajouter ou insérer du texte :
procedure gtk_combo_box_append_text(combo_box : PGtkComboBox; text : Pgchar); procedure gtk_combo_box_insert_text(combo_box : PGtkComboBox; position : gint; text : Pgchar); procedure gtk_combo_box_prepend_text(combo_box : PGtkComboBox; text : Pgchar);
Suppression de texte
modifierIl suffit d'indiquer le numéro de ligne que l'on souhaite supprimer :
procedure gtk_combo_box_remove_text(combo_box : PGtkComboBox; position : gint);
Récupération de la sélection de l'utilisateur
modifierCette fonction permet de récupérer le texte choisi par l'utilisateur (à partir de la version 2.6 de Gtk+) :
function gtk_combo_box_get_active_text(combo_box : PGtkComboBox) : Pgchar;
ATTENTION : Cette fonction n'est pas définie dans les en-têtes Gtk+ Pascal. Il faut donc ajouter le prototype dans le source où on veut l'utiliser (cf l'exemple ci-dessous).
Sinon il y a une fonction qui permet de récupérer le numéro de l'item sélectionné :
function gtk_combo_box_get_active(combo_box : PGtkComboBox) : gint;
Le premier item a le numéro 0. Si aucun item n'est sélectionné, la fonction renvoie -1.
La fonction inverse permet de se positionner sur un item particulier :
procedure gtk_combo_box_set_active(combo_box : PGtkComboBox; index : gint);
Programme exemple
modifierComme exemple, nous allons créer une fenêtre comportant un GtkComboBox, un GtkButton et un GtkLabel. Le but sera d'afficher le texte sélectionné du GtkCombobox dans le GtkLabel. Cette opération s'effectuera lorsque l'utilisateur cliquera sur le bouton (interception du signal « clicked »).
Voilà le fichier gtk029.pas
:
program gtk029; uses glib2, gtk2; // Défaut de la gtk2 pascal : il manque cette fonction pourtant présente dans la bibliothèque function gtk_combo_box_get_active_text(combo_box:PGtkComboBox):PGChar;cdecl; external gtklib name 'gtk_combo_box_get_active_text'; type TFenetrePrincipale = record pFenetre : PGtkWidget; pVBox : PGtkWidget; pListeDer : PGtkWidget; pBouton : PGtkWidget; pLabel : PGtkWidget; end; PFenetrePrincipale = ^TFenetrePrincipale; procedure OnBtnClick(APWidget : PGtkwidget; AData : pgpointer); cdecl; var pFenPrinc : PFenetrePrincipale; Texte : PGChar; begin // Récuperation des données de la fenêtre principale (qui sont dans AData) pFenPrinc := PFenetrePrincipale(AData); // Récuperation du texte contenu dans le GtkComboBox Texte := gtk_combo_box_get_active_text(GTK_COMBO_BOX(pFenPrinc^.pListeDer)); // Modification du texte contenu dans le GtkLabel gtk_label_set_text(GTK_LABEL(pFenPrinc^.pLabel), Texte); g_free(Texte); end; var pFenPrinc : PFenetrePrincipale; begin pFenPrinc := g_malloc(SizeOf(TFenetrePrincipale)); gtk_init(@argc, @argv); pFenPrinc^.pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(pFenPrinc^.pFenetre), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(pFenPrinc^.pFenetre), 320, 200); gtk_container_set_border_width(GTK_CONTAINER(pFenPrinc^.pFenetre), 4); gtk_window_set_title(GTK_WINDOW(pFenPrinc^.pFenetre), 'Gtk029 : Combobox'); gtk_signal_connect(pGTKOBJECT(pFenPrinc^.pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL); pFenPrinc^.pVBox := gtk_vbox_new(TRUE, 0); gtk_container_add(GTK_CONTAINER(pFenPrinc^.pFenetre), pFenPrinc^.pVBox); // Création du GtkComboBox pFenPrinc^.pListeDer := gtk_combo_box_new_text; // Chargement de la liste déroulante gtk_combo_box_append_text(GTK_COMBO_BOX(pFenPrinc^.pListeDer), 'Bleu'); gtk_combo_box_append_text(GTK_COMBO_BOX(pFenPrinc^.pListeDer), 'Rouge'); gtk_combo_box_append_text(GTK_COMBO_BOX(pFenPrinc^.pListeDer), 'Jaune'); gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pListeDer, TRUE, FALSE, 0); pFenPrinc^.pBouton := gtk_button_new_with_label('Copier'); gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pBouton, TRUE, FALSE, 0); g_signal_connect(pGTKOBJECT(pFenPrinc^.pBouton), 'clicked', GTK_SIGNAL_FUNC(@OnBtnClick), gpointer(pFenPrinc)); pFenPrinc^.pLabel := gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pLabel, TRUE, FALSE, 0); gtk_widget_show_all(pFenPrinc^.pFenetre); gtk_main; g_free(pFenPrinc); end.
Voilà ce que donne l'exécution du programme gtk029
:
Après sélection de l'item « bleu » et clic sur le bouton :
On peut légèrement modifier l'exemple pour utiliser les fonctions get
et set_active
. À l'initialisation, on sélectionne un item (le n° 2) et au clic sur le bouton, on affiche le numéro d'item sélectionné.
Extrait du programme gtk030.pas
qui est recopié sur celui ci-dessus. Dans la fonction OnBtnClick
, on a :
[...] // Récuperation du numéro d'item sélectionné Texte := g_strdup_printf('%d', [gtk_combo_box_get_active(GTK_COMBO_BOX(pFenPrinc^.pListeDer))]); [...]
Et dans la partie principale, après le chargement de la liste déroulante, on ajoute :
[...] gtk_combo_box_set_active(GTK_COMBO_BOX(pFenPrinc^.pListeDer), 1); [...]
Utilisation complète (avec modèle)
modifier<à développer>
Listes déroulantes : GtkComboBox ~ GtkComboBoxEntry |