Programmation GTK2 en Pascal/GtkSpinButton
Programmation GTK2 en Pascal |
|
Présentation
modifierLe contrôle GtkSpinButton permet de gérer la saisie d'une valeur numérique compris entre deux bornes. Il se présente comme une zone de texte dans laquelle on peut saisir un nombre à laquelle est accolée deux flèches qui permettent d'incrémenter ou de décrémenter la valeur.
Hiérarchie
modifierHiérarchie |
GObject └─GtkObject └─GtkWidget └─GtkEntry └─GtkSpinButton |
Utilisation de base
modifierCréation
modifierComme pour les curseurs (GtkHScale et GtkVScale), il y a deux méthodes pour créer un GtkSpinButton
.
La première nécessite la création préalable d'un ajustement :
function gtk_spin_button_new(adjustment : PGtkAdjustment; climb_rate : gdouble; digits : guint) : PGtkWidget;
Le paramètre climb_rate
qui doit être compris entre 0,0 et 1,0 est la valeur d'accélération quand on appuie longtemps sur une des flèches. À 0, la vitesse de défilement des nombres est constante, à 1,0 elle s'accélère à mesure qu'on laisse longtemps la flèche enfoncée.
Le paramètre digits
indique combien de décimales doivent être affichées.
La deuxième fonction permet d'indiquer tout de suite les bornes de saisie :
function gtk_spin_button_new_with_range(min : gdouble; max : gdouble; step : gdouble) : PGtkWidget;
Le paramètre step
est le pas d'incrément ou de décrément de la valeur.
Affichage de la valeur
modifierLe nombre de décimales peut-être modifié directement :
procedure gtk_spin_button_set_digits(spin_button : PGtkSpinButton; digits : guint);
Valeur saisie
modifierLa valeur peut-être modifiée par l'utilisateur en tapant sur les touches numériques ou à la souris en cliquant sur les flèches. Par programme, on peut également avec la fonction :
procedure gtk_spin_button_set_value(spin_button : PGtkSpinButton; value : gdouble);
Le paramètre value
est la nouvelle valeur.
Quelle que soit la méthode de mise-à-jour, à chaque modification, le signal « value_changed » est émis.
Pour récupérer la valeur saisie, il y a les fonctions, selon le format désiré :
function gtk_spin_button_get_value_as_float(spin_button : PGtkSpinButton) : gdouble; function gtk_spin_button_get_value_as_int(spin_button : PGtkSpinButton) : gint;
Programme exemple
modifierComme exemple, nous allons créer une fenêtre comportant un GtkSpinButton
, un GtkButton
et un GtkLabel
. Quand on cliquera sur le bouton, on affichera le texte du GtkSpinButton
dans le GtkLabel
.
Voilà le fichier gtk028.pas
:
program gtk028; uses glib2, gtk2; type TFenetrePrincipale = record pFenetre : PGtkWidget; pVBox : PGtkWidget; pChampEntree : PGtkWidget; pBouton : PGtkWidget; pLabel : PGtkWidget; end; PFenetrePrincipale = ^TFenetrePrincipale; procedure OnBtnClick(APWidget : PGtkwidget; AData : pgpointer); cdecl; var pFenPrinc : PFenetrePrincipale; Valeur : GDouble; 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 GtkSpinButton Valeur := gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(pFenPrinc^.pChampEntree)); Texte := g_strdup_printf('%f', [Valeur]); // 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), 'Gtk028 : GtkSpinButton'); 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 GtkSpinButton pFenPrinc^.pChampEntree := gtk_spin_button_new_with_range(0, 100, 0.1); // Nombre de décimales gtk_spin_button_set_digits(GTK_SPIN_BUTTON(pFenPrinc^.pChampEntree), 2); gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pChampEntree, 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 gtk028
après quelques clics et appuie sur « entrée » :
Saisie de données : GtkEntry ~ GtkHScale ~ GtkVScale ~ GtkSpinButton |