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

Contenu supprimé Contenu ajouté
Didier (discussion | contributions)
Création début
 
Didier (discussion | contributions)
Suite (+ programme exemple)
Ligne 64 :
 
Une fois que tous les boutons ont été définis, il faut le dire à notre fonction de création. Pour cela, il suffit de terminer la liste des paramètres par NULL.
 
=== Ajout d'éléments dans la zone de travail ===
La majeure partie des éléments de la boîte de dialogue sont maintenant créés. Il reste cependant à ajouter les éléments de la zone de travail pour que la boîte soit complète. Une fois que ceux-ci sont créés, il suffit de les ajouter dans la boîte de dialogue avec la fonction <code>gtk_box_pack_start</code>.
 
La question est maintenant de savoir comment passer la <code>GtkVBox</code> en paramètre à la fonction <code>gtk_box_pack_start</code>. Nous allons tout simplement utiliser l'opérateur -> pour l'élément GtkDialog de cette manière :
 
GTK_DIALOG(nom_de_la_fenêtre)^.vbox;
 
La boîte de dialogue est maintenant complète.
 
=== Affichage de la boîte de dialogue ===
L'affichage de la boîte de dialogue comporte deux étapes. Tout d'abord, il faut demander d'afficher tout le contenu de la <code>GtkVBox</code> qui est inclut dans la boîte de dialogue avec la fonction <code>gtk_widget_show_all</code>.
Ensuite il faut afficher la boîte de dialogue elle-même et attendre la réponse de l'utilisateur avec cette fonction :
 
function gtk_dialog_run(dialog : PGtkDialog) : gint;
 
Le paramètre de cette fonction étant de type <code>PGtkDialog</code> il faut utiliser la fonction de conversion GTK_DIALOG().
 
Cette fonction affiche l'intégralité de la boîte de dialogue, mais rentre aussi dans une boucle récursive qui ne s'arrêtera que lorsque l'utilisateur cliquera sur un des boutons de retour. La valeur de retour correspond à la valeur associée au bouton cliqué. Si, par hasard, l'utilisateur quitte la boîte de dialogue en cliquant sur la croix de celle-ci, <code>gtk_dialog_run</code> renvoie <code>GTK_DELETE_EVENT</code>.
 
Une fois la valeur de retour connue, il ne reste plus qu'à agir en conséquence.
 
== Programme exemple ==
L'exemple de ce chapitre est constitué d'une fenêtre principale dans laquelle nous allons ajouter un GtkButton et un GtkLabel. Lorsque l'utilisateur clique sur le GtkButton, une boîte de dialogue apparaîtra et demandera à l'utilisateur de saisir son nom.
Cette boîte de dialogue sera constituée d'une GtkEntry, d'un GtkButton "OK" et d'un GtkButton "Annuler". Si l'utilisateur clique sur "OK" le contenu de la GtkEntry sera copié dans le GtkLabel de la fenêtre principale tandis que s'il clique sur "Annuler" on affichera "Vous n'avez rien saisi." dans le GtkLabel.
 
Voici le fichier <code>gtk003.pas</code>, pour faire simple il a été utilisé des variables globales ce qui n'est pas forcément à conseiller :
 
program gtk003;
uses glib2, gtk2;
var
pWindow : PGtkWidget;
pLabel : PGtkWidget;
procedure LancerBoite;
var
pBoite : PGtkWidget;
pChampSaisie : PGtkWidget;
Nom : PGChar;
begin
// Creation de la boîte de dialogue
// - 1 bouton Valider (« Ok »)
// - 1 bouton Annuler
pBoite := gtk_dialog_new_with_buttons('Saisie du nom',
GTK_WINDOW(pWindow),
GTK_DIALOG_MODAL,
GTK_STOCK_OK, [GTK_RESPONSE_OK,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
NULL]);
// Creation de la zone de saisie
pChampSaisie := gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(pChampSaisie), 'Saisissez votre nom');
// Insertion de la zone de saisie dans la boîte de dialogue
// Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)^.vbox), pChampSaisie, TRUE, FALSE, 0);
// Affichage des éléments de la boîte de dialogue
gtk_widget_show_all(GTK_DIALOG(pBoite)^.vbox);
// On lance la boîte de dialogue et on récupère la réponse
case gtk_dialog_run(GTK_DIALOG(pBoite)) of
// L'utilisateur valide
GTK_RESPONSE_OK : begin
Nom := gtk_entry_get_text(GTK_ENTRY(pChampSaisie));
gtk_label_set_text(GTK_LABEL(pLabel), Nom);
end;
// L'utilisateur annule
GTK_RESPONSE_CANCEL, GTK_DELETE_EVENT : begin
gtk_label_set_text(GTK_LABEL(pLabel), 'Vous n''avez rien saisi !');
end;
else begin
gtk_label_set_text(GTK_LABEL(pLabel), 'Réponse inattendue !');
end;
end;
// Destruction de la boîte de dialogue
gtk_widget_destroy(pBoite);
end;
procedure OnDestroy(widget : PGtkwidget; data : pgpointer); cdecl;
begin
gtk_main_quit;
end;
var
pVBox : PGtkWidget;
pBouton : PGtkWidget;
begin
gtk_init(@argc, @argv);
pWindow := gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
gtk_window_set_title(GTK_WINDOW(pWindow), 'Fenêtre principale');
gtk_signal_connect(pGTKOBJECT(pWindow), 'destroy', GTK_SIGNAL_FUNC(@OnDestroy), NULL);
// Création de la GtkVBox
pVBox := gtk_vbox_new(TRUE, 0);
gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
// Création du bouton
pBouton := gtk_button_new_with_label('Cliquez ici pour saisir votre nom');
gtk_box_pack_start(GTK_BOX(pVBox), pBouton, FALSE, TRUE, 0);
// Création du label
pLabel := gtk_label_new(NULL);
gtk_box_pack_start(GTK_BOX(pVBox), pLabel, FALSE, FALSE, 0);
// Connexion du signal « clicked » pour ouvrir la boîte de dialogue
g_signal_connect(pGTKOBJECT(pBouton), 'clicked', GTK_SIGNAL_FUNC(@LancerBoite), NULL);
gtk_widget_show_all(pWindow);
gtk_main;
end.