Programmation GTK2 en Pascal/GtkComboBoxEntry

Un livre de Wikilivres.

Cette page est considérée comme une ébauche à compléter . Si vous possédez quelques connaissances sur le sujet, vous pouvez les partager en éditant dès à présent cette page (en cliquant sur le lien « modifier »).

Ressources suggérées : Aucune (vous pouvez indiquer les ressources que vous suggérez qui pourraient aider d'autres personnes à compléter cette page dans le paramètre « ressources » du modèle? engendrant ce cadre)

Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkComboBoxEntry permet de gérer une liste déroulante sur action de l'utilisateur combinée avec un champ de saisie. Soit l'utilisateur choisi dans une liste, soit il saisit une valeur.

Ce contrôle est disponible à partir de la version 2.4 de Gtk+.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBin
                  └─GtkComboBox
                      └─GtkComboBoxEntry

Utilisation de base (mode texte sans modèle)[modifier | modifier le wikicode]

Création[modifier | modifier le wikicode]

La fonction de création d'une liste déroulante texte est simple :

function gtk_combo_box_entry_new_text : PGtkWidget;

Ajout de texte dans la liste déroulante[modifier | modifier le wikicode]

On va utiliser les mêmes fonctions que pour la liste déroulante sans saisie (GtkComboBox) : gtk_combo_box_append_text, gtk_combo_box_insert_text et gtk_combo_box_prepend_text.

Récupération de la sélection de l'utilisateur[modifier | modifier le wikicode]

On va en fait utiliser la fonction du champ de saisie (GtkEntry) : gtk_entry_get_text.

Programme exemple[modifier | modifier le wikicode]

Comme exemple, nous allons créer une fenêtre comportant un GtkComboBoxEntry, un GtkButton et un GtkLabel. Le but sera d'afficher le texte sélectionné du GtkComboboxEntry dans le GtkLabel, que celui-ci soit saisi ou choisi dans la liste. Cette opération s'effectuera lorsque l'utilisateur cliquera sur le bouton (interception du signal « clicked »).

Voilà le fichier gtk031.pas (à 95 % identique à celui du gtk029.pas) :

program gtk031;

uses glib2, gtk2;

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_entry_get_text(GTK_ENTRY(GTK_BIN(pFenPrinc^.pListeDer)^.child));

  // Modification du texte contenu dans le GtkLabel 
  gtk_label_set_text(GTK_LABEL(pFenPrinc^.pLabel), 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), 'Gtk031 : ComboboxEntry');
  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_entry_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 gtk031 après saisie d'un nom et du clic sur le bouton « Copier » :

Utilisation complète (avec modèle)[modifier | modifier le wikicode]

<à développer>

Listes déroulantes : GtkComboBox ~ GtkComboBoxEntry