Programmation GTK2 en Pascal/GtkSpinButton
Programmation GTK2 en Pascal |
|
Présentation
[modifier | modifier le wikicode]Le 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
[modifier | modifier le wikicode]Hiérarchie |
GObject └─GtkObject └─GtkWidget └─GtkEntry └─GtkSpinButton |
Utilisation de base
[modifier | modifier le wikicode]Création
[modifier | modifier le wikicode]Comme 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
[modifier | modifier le wikicode]Le nombre de décimales peut-être modifié directement :
procedure gtk_spin_button_set_digits(spin_button : PGtkSpinButton; digits : guint);
Valeur saisie
[modifier | modifier le wikicode]La 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
[modifier | modifier le wikicode]Comme 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 |