Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

int21h

GUI pod pascalem

Pro o tom vlastn pu? Asi proto, e abyste zskali prci jako programtor, tak u nikoho nezajm, e umte nahodit vesu pes assembler. Je poteba umt dnen trendy. N asopis sice nen o dnench trendech, ale je hlavn o pascalu. Chci ukzat, e pascal nen pozadu ani v tchto odvtvch.

Hlavnm rozdl mezi TurboPascalem a FreePascalem je ten, e FreePascal je programovac jazyk se vm vudy, podobn jako c, a TurboPascal je jen uebn uebn pomcka, kter vs uvede do svta programovn (i kdy nkdo v nm zstane navdy). Pokudmte v rukou FreePascal, tak se mete klidn pustit i do vytven GUI aplikac.

V tomto dle bych se chtl vysvtlit zkladn prci s GUI.


Nebudu se zabvat WinAPI, protoe je to fakt zbyten. Radji vm pedstavm Gtk (Gimp ToolKit), kter je penosn na vechny platformy a nabz stejn monosti jako WinAPI.

Potebujete tyto knihovny:
glib gtk gdk(grafika)
knihovna gdk se vyuv hlavn ke grafice (formty obrzk).

Dleit je, e gtk zavd nov datov typy.
Hlavn:
PGtkWidget - jakkoli objekt
pchar - to je pointer na char, take string (podobn z c)

A te teorie Gtk.

Gtk v pascalu a v c nen objektov! Proto to vypad tak sloit, ale

Hlavn okno se dl na boxy (containery). Boxy jsou vertikln a horizontln. Kad box me obsahovat objekty (i dal boxy) a tak mete postavit celou aplikaci.

Struktura pkladu, kter uvedu na konci je asi takov:

GtkWindow
+-GtkVBox
  +-GtkLabel
  +-GtkButton  
Nejlep je ve si navrhnout pedem na papr nebo njho graf. editoru.
Vborn jsou tak vvojov prosted jako Glade. I kdy Glade je dlan pmo na vytven projekt, j preferuji to, e si to nejdv navrhnu v Glade a pak to napu ve vim:) M vyhovuje, kdy si kd pu sm.
Nevm, jestli je Glade tak pro ostatn platformy ne Linux, ale ml by bt.

Dal vc co je nutn znt jsou signly (events,callbacks,signals). Kad objekt vyvol pi aktivaci njkou udlost. Tuto udlost meme odchytit a zpracovat.


Praxe:
Funkce budu popisovat rovnou v kdu:
program HelloWorld;


uses glib,gtk,gdk;


var window, {Hlavni okno}
    glabel, {Retezec}
    gbutton,{Tlacitko}
    vbox:   {Vertikalni Box}
     PGtkWidget;
    
{Tyto procedury preskocte a vratte se az budete u definovani signalu}
procedure quit(widget:PGtkWidget;event:PGdkEvent;data: pgpointer);cdecl;
{To vsecho widget posila: Co je zac, jakou udalosti byl vyvolan a data, ktera byla poslana}
begin
 gtk_main_quit(); {Jedina funkce, ktera dokaze vyskocit z hlavniho loopu. Nepouzivejte halt!}
end;
procedure hello(widget:PGtkWidget;event:PGdkEvent;data: pgpointer);cdecl;
begin
 writeln('hello');
end; 


Begin
 gtk_init(@argc, @argv); {Tohle je jasne z cecka}


 window:=gtk_window_new(GTK_WINDOW_TOPLEVEL);{Nove okno}
 gtk_widget_set_usize(PGtkWIDGET(window),125,90);{Neni to objektove, tak to vypada slozite}
 gtk_window_set_title(GTK_WINDOW(window), 'Test program');
 
 vbox:=gtk_vbox_new(true,0); {homogenous,spacing}
 gtk_container_add(PGtkCONTAINER(window),vbox); {A o tom to cely je}
 glabel:=gtk_label_new('');
 gtk_label_set_text(PGtkLABEL(glabel), 'Press button to exit');
 {Ted bude pridani glabel do vbox, ktery uz je ve window - strukturovanost}
 gtk_box_pack_start(PGtkBOX(vbox), glabel,true,true,0);{S temito paremetry si musite pohrat}
 GTK_WIDGET_SET_FLAGS(glabel,gtk_CAN_DEFAULT);{Priznam se, tady nevim o co tu jde}


 gbutton:=gtk_button_new_with_label('Hello, world!');
 gtk_widget_set_usize(PGtkWIDGET(gbutton),1, 1);
 gtk_box_pack_start(PgtkBOX(vbox), gbutton, true, true,0);
 GTK_WIDGET_SET_FLAGS(gbutton, gtk_CAN_DEFAULT);
 gtk_widget_grab_default(gbutton);
 
 gtk_widget_show_all(window); {Ukaze vse co widget obsahuje} {SIGNALY}
 {Ted jde do tuheho}
 gtk_signal_connect(Gtk_OBJECT(window), 'delete_event', GTK_SIGNAL_FUNC(@quit), NIL);
 {delete_event je ten krizek na okne. Nazvy vsech udalosti jdou nalezt k tutorialu gtk}
 {Posledni dva parametry jsou kterou funkci provest a pak pointer na data, ktera se maji funkci poslat}
 gtk_signal_connect(PGtkOBJECT(gbutton), 'clicked', GTK_SIGNAL_FUNC(@hello), NIL);


 gtk_main(); {A od ted se vsechno rozjede}
End.  

Jen pro zajmavost: tady je ten sam kd v c, perlu a pythonu

C
Tady se to vyuziva asi nejvic.
Vsimnete si, ze je to naprosto to same jako v pascalu
#include 
#include 


int quit(GtkWidget *widget,gpointer data) {
        gtk_main_quit();
        return 0;
}
        
int hello(GtkWidget *widget,gpointer data) {
        printf("Hello, world!");
        return 0;
}


int main(int argc,char *argv[]) {
        GtkWidget *window,*gbutton,*glabel,*vbox;
        
        gtk_init(&argc,&argv);


        window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_widget_set_usize(GTK_WIDGET(window),125,90);
        gtk_window_set_title(GTK_WINDOW(window),"Test program");


        vbox=gtk_vbox_new(TRUE,0);
        gtk_container_add(GTK_CONTAINER(window),vbox);
        glabel=gtk_label_new("Press button to exit");
        gtk_box_pack_start(GTK_BOX(vbox),glabel,TRUE,TRUE,0);


        gbutton=gtk_button_new_with_label("Hello, world!");
        gtk_widget_set_usize(gbutton,1,1);
        gtk_box_pack_start(GTK_BOX(vbox), gbutton,TRUE,TRUE,0);


        gtk_widget_show_all(window);
        
        gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(quit),NULL);
        gtk_signal_connect(GTK_OBJECT(gbutton),"clicked",GTK_SIGNAL_FUNC(hello),NULL);
        gtk_main();
        
        return 0;
}  

Perl
Tohle uz je uplne o necem jinem, protoze je to objektove.
#!/usr/bin/perl


use Gtk;


init Gtk;


my $window = new Gtk::Window("toplevel");
my $vbox = new Gtk::VBox(0,0);
my $glabel = new Gtk::Label("Press butoon to exit");
my $gbutton = new Gtk::Button("Hello, world!");


$window->set_usize(125,90);


$window->signal_connect("delete_event", &quit);
$gbutton->signal_connect("clicked", &hello);


$vbox->pack_start($glabel,1,1,0);
$vbox->pack_start($gbutton,1,1,0);
$window->set_title("Hello, world!");
$window->add($vbox);
$window->show_all();


main Gtk;


sub quit {
        Gtk->exit(0);
}


sub hello {
        print "Hello, world!";
}  

Python
A nakonec mj nejmilej.
#!/usr/bin/python


from gtk import *


def quit(*args):
        mainquit()


def hello(*args):
        print 'Hello, world'


window = GtkWindow(WINDOW_TOPLEVEL)
window.set_title("Test program")
window.set_usize(125,90);


vbox = GtkVBox(0,0);


glabel = GtkLabel("Press button to exit");
gbutton = GtkButton("Hello, World!")
vbox.pack_start(glabel,1,1,0);
vbox.pack_start(gbutton,1,1,0);


window.add(vbox);


window.connect("delete_event", quit)
gbutton.connect("clicked", hello)


window.show_all()


mainloop()  

Zvr

Tmito kdy jsem chtl ct, e pokud se naute pracovat s Gtk v pascalu nebo v c, tak u pro vs nebude dn problm napsat program v jazyce jinm. Nzvy funkc a objekt jsou vcemn podobn.

A jet nco. Radm vm: NEPOUVEJTE WINAPI!

2006-11-30 | BOby