« Programmation GTK2 en Pascal/GtkComboBox » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Didier (discussion | contributions)
+ Exemple
Didier (discussion | contributions)
m →‎Programme exemple : cop/col intempestif
Ligne 128 : Ligne 128 :
[[Image:Programmation GTK2 en Pascal - gtk029-1.png]]
[[Image:Programmation GTK2 en Pascal - gtk029-1.png]]


Après saisie d'un texte et clic sur le bouton :
Après sélection de l'item « bleu » et clic sur le bouton :


[[Image:Programmation GTK2 en Pascal - gtk029-1.png]]
[[Image:Programmation GTK2 en Pascal - gtk029-1.png]]

Version du 8 mars 2005 à 23:09

Programmation GTK2 en Pascal

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)

Présentation

Le 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

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

Utilisation de base (mode texte sans modèle)

Création

La 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

Il 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

Il 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

Cette 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).

Programme exemple

Comme 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 GtkHScale
  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 :

Utilisation complète (avec modèle)

<à développer>

Listes déroulantes : GtkComboBox ~ GtkComboBoxEntry