{ This file extracted from the GTK 1.2 tutorial. Section 4.3 Converted from C to Pascal by Thomas E. Payne } program Tut4_3; {$mode objfpc} uses glib,gdk,gtk,sysutils; function delete_event (widget : pGtkWidget ; event: pGdkEvent; data: pgpointer ): integer; cdecl; begin gtk_main_quit(); delete_event:=0; end; { * Make a new hbox filled with button-labels. Arguments for the * variables we're interested are passed in to this function. * We do not show the box, but do show everything inside. } function make_box(homogeneous: boolean; spacing : LONGINT; expand : boolean; fill : boolean; padding : LONGINT ):pGtkWidget; cdecl; var box, button : pGtkWidget; //GtkWidget is the storage type for widgets padstr : string; ppadstr : PAnsiChar; begin //* Create a new hbox with the appropriate homogeneous //* and spacing settings */} box := gtk_hbox_new (homogeneous, spacing); //* Create a series of buttons with the appropriate settings */ button := gtk_button_new_with_label ('gtk_box_pack'); gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); gtk_widget_show (button); button := gtk_button_new_with_label ('(box,'); gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); gtk_widget_show (button); button := gtk_button_new_with_label ('button,'); gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); gtk_widget_show (button); //* Create a button with the label depending on the value of //* expand. */} if (expand = TRUE) then button := gtk_button_new_with_label ('TRUE,') else button := gtk_button_new_with_label ('FALSE,'); gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); gtk_widget_show (button); //* This is the same as the button creation for "expand" //* above, but uses the shorthand form. */} if fill then button := gtk_button_new_with_label ('TRUE,') else button := gtk_button_new_with_label ('FALSE,'); gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); gtk_widget_show (button); padstr := InttoStr(padding)+');'; ppadstr := stralloc(length(padstr)+1); strpcopy(ppadstr,padstr); button := gtk_button_new_with_label (ppadstr); gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); gtk_widget_show (button); make_box := box; end; //make_box var window,button,box1,box2,separator,label_,quitbox : pGtkWidget; which : integer; begin //* Our init, don't forget this! :) */ gtk_init (@argc, @argv); if (argc <> 2) then begin writeln (stderr, 'usage: packbox num, where num is 1, 2, or 3.'); //* This just does cleanup in GTK and exits with an exit status of 1. */ gtk_exit (1); end; which := StrtoInt(argv[1]); //use params //* Create our window */ window := gtk_window_new (GTK_WINDOW_TOPLEVEL); //* You should always remember to connect the destroy signal to the //* main window. This is very important for proper intuitive //* behavior */ gtk_signal_connect (pGTKOBJECT (window), 'delete_event', GTK_SIGNAL_FUNC (@delete_event), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); //* We create a vertical box (vbox) to pack the horizontal boxes into. //* This allows us to stack the horizontal boxes filled with buttons one //* on top of the other in this vbox. */ box1 := gtk_vbox_new (FALSE, 0); //* which example to show. These correspond to the pictures above. */ case which of 1: begin //* create a new label_. */ label_ := gtk_label_new ('gtk_hbox_new (FALSE, 0);'); //* Align the label_ to the left side. We'll discuss this function and //* others in the section on Widget Attributes. */ gtk_misc_set_alignment (GTK_MISC (label_), 0, 0); //* Pack the label_ into the vertical box (vbox box1). Remember that //* widgets added to a vbox will be packed one on top of the other in //* order. */ gtk_box_pack_start (GTK_BOX (box1), label_, FALSE, FALSE, 0); //* Show the label_ */ gtk_widget_show (label_); //* Call our make box function - homogeneous = FALSE, spacing = 0, //* expand = FALSE, fill = FALSE, padding = 0 */ box2 := make_box (FALSE, 0, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* Call our make box function - homogeneous = FALSE, spacing = 0, //* expand = FALSE, fill = FALSE, padding = 0 */ box2 := make_box (FALSE, 0, TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* Args are: homogeneous, spacing, expand, fill, padding */ box2 := make_box (FALSE, 0, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* Creates a separator, we'll learn more about these later, //* but they are quite simple. */ separator := gtk_hseparator_new (); //* Pack the separator into the vbox. Remember each of these //* widgets are being packed into a vbox, so they'll be stacked //* vertically. */ gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); gtk_widget_show (separator); //* Create another new label, and show it. */ label_ := gtk_label_new ('gtk_hbox_new (TRUE, 0);'); gtk_misc_set_alignment (GTK_MISC (label_), 0, 0); gtk_box_pack_start (GTK_BOX (box1), label_, FALSE, FALSE, 0); gtk_widget_show (label_); //* Args are: homogeneous, spacing, expand, fill, padding */ box2 := make_box (TRUE, 0, TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* Args are: homogeneous, spacing, expand, fill, padding */ box2 := make_box (TRUE, 0, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* Another new separator. */ separator := gtk_hseparator_new (); //* The last 3 arguments to gtk_box_pack_start are: //* expand, fill, padding. */ gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); gtk_widget_show (separator); end; 2: begin //* Create a new label, remember box1 is a vbox as created //* near the beginning of main() */ label_ := gtk_label_new ('gtk_hbox_new (FALSE, 10);'); gtk_misc_set_alignment (GTK_MISC (label_), 0, 0); gtk_box_pack_start (GTK_BOX (box1), label_, FALSE, FALSE, 0); gtk_widget_show (label_); //* Args are: homogeneous, spacing, expand, fill, padding */ box2 := make_box (FALSE, 10, TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* Args are: homogeneous, spacing, expand, fill, padding */ box2 := make_box (FALSE, 10, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); separator := gtk_hseparator_new (); //* The last 3 arguments to gtk_box_pack_start are: //* expand, fill, padding. */ gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); gtk_widget_show (separator); label_ := gtk_label_new ('gtk_hbox_new (FALSE, 0);'); gtk_misc_set_alignment (GTK_MISC (label_), 0, 0); gtk_box_pack_start (GTK_BOX (box1), label_, FALSE, FALSE, 0); gtk_widget_show (label_); //* Args are: homogeneous, spacing, expand, fill, padding */ box2 := make_box (FALSE, 0, TRUE, FALSE, 10); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* Args are: homogeneous, spacing, expand, fill, padding */ box2 := make_box (FALSE, 0, TRUE, TRUE, 10); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); separator := gtk_hseparator_new (); //* The last 3 arguments to gtk_box_pack_start are: expand, fill, padding. */ gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); gtk_widget_show (separator); end; 3: begin //* This demonstrates the ability to use gtk_box_pack_end() to //* right justify widgets. First, we create a new box as before. */ box2 := make_box (FALSE, 0, FALSE, FALSE, 0); //* Create the label_ that will be put at the end. */ label_ := gtk_label_new ('end'); //* Pack it using gtk_box_pack_end(), so it is put on the right //* side of the hbox created in the make_box() call. */ gtk_box_pack_end (GTK_BOX (box2), label_, FALSE, FALSE, 0); //* Show the label_. */ gtk_widget_show (label_); //* Pack box2 into box1 (the vbox remember ? :) */ gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); //* A separator for the bottom. */ separator := gtk_hseparator_new (); //* This explicitly sets the separator to 400 pixels wide by 5 pixels //* high. This is so the hbox we created will also be 400 pixels wide, //* and the "end" label_ will be separated from the other labels in the //* hbox. Otherwise, all the widgets in the hbox would be packed as //* close together as possible. */ gtk_widget_set_usize (separator, 400, 5); //* pack the separator into the vbox (box1) created near the start //* of main() */ gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); gtk_widget_show (separator); end; end; //case //* Create another new hbox.. remember we can use as many as we need! */ quitbox := gtk_hbox_new (FALSE, 0); //* Our quit button. */ button := gtk_button_new_with_label ('Quit'); //* Setup the signal to destroy the window. Remember that this will send //* the "destroy" signal to the window which will be caught by our signal //* handler as defined above. */ gtk_signal_connect_object (pGTKOBJECT (button), 'clicked', GTK_SIGNAL_FUNC (@gtk_main_quit), GTK_OBJECT (window)); //* Pack the button into the quitbox. //* The last 3 arguments to gtk_box_pack_start are: //* expand, fill, padding. */ gtk_box_pack_start (GTK_BOX (quitbox), button, TRUE, FALSE, 0); //* pack the quitbox into the vbox (box1) */ gtk_box_pack_start (GTK_BOX (box1), quitbox, FALSE, FALSE, 0); //* Pack the vbox (box1) which now contains all our widgets, into the //* main window. */ gtk_container_add (GTK_CONTAINER (window), box1); //* And show everything left */ gtk_widget_show (button); gtk_widget_show (quitbox); gtk_widget_show (box1); //* Showing the window last so everything pops up at once. */ gtk_widget_show (window); //* And of course, our main function. */ gtk_main (); //* Control returns here when gtk_main_quit() is called, but not when //* gtk_exit is used. */ //return(0); end.