Witam
Mam problem, musze napisac na przedwczoraj zadanie na uczelnie i zrobic to w pascalu w dowolnym toolkicie. Wybralem gtk ponad to co oferowal lazarus i juz jestem na polmetku, ale mam problem.
Gdy chce utworzyc dialog otwierania pliku zwraca mi niestety wyjatek EDivByZero : Division by zero
Przykladowy kod, z ktorego chcialem skorzystac i przepisalem go z c++ na pascala i wystepuje ten problem, a w c++'wej wersji nie:
program tomek;
uses gtk2, gdk2, glib2;
var etykieta, okno, przycisk, vbox : pGtkWidget;
procedure pokaz_dialog( widget : pGtkWidget; okno : pgpointer); cdecl;
var
dialog : pGtkWidget;
str : pgchar;
begin
dialog := gtk_file_chooser_dialog_new( 'Otwórz...', GTK_WINDOW( okno ), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nil );
if gtk_dialog_run( GTK_DIALOG( dialog ) ) = GTK_RESPONSE_ACCEPT
then begin
str := gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( dialog ) );
gtk_label_set_text( GTK_LABEL( etykieta ), str );
end;
gtk_widget_destroy( dialog );
end;
begin
gtk_init( @ argc, @ argv );
okno := gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
gtk_window_set_default_size( GTK_WINDOW( okno ), 200, 100 );
gtk_window_set_title( GTK_WINDOW( okno ), 'Kurs GTK+' );
przycisk := gtk_button_new_with_label( 'Dialog' );
etykieta := gtk_label_new( 'Tekst' );
vbox := gtk_vbox_new( FALSE, 3 );
gtk_container_add( GTK_CONTAINER( okno ), vbox );
gtk_box_pack_start( GTK_BOX( vbox ), etykieta, FALSE, FALSE, 0 );
gtk_box_pack_start( GTK_BOX( vbox ), przycisk, TRUE, TRUE, 0 );
gtk_container_set_border_width( GTK_CONTAINER( okno ), 15 );
gtk_signal_connect( GTK_OBJECT( przycisk ), 'clicked', G_CALLBACK( @pokaz_dialog ), gpointer ( okno) );
gtk_signal_connect( GTK_OBJECT( okno ), 'destroy', G_CALLBACK( @gtk_main_quit ), NULL );
gtk_widget_show_all( okno );
gtk_main();
end.
i tu inny przykladowy, ktory tez nie dziala
{ Converted from C to Pascal by Javier Ros <[email protected]> }
PROGRAM filesel;
USES glib, gdk, gtk;
{ ----------------------------file_ok_sel------------------------ }
PROCEDURE file_ok_sel( w : pGtkWidget ; fs : pGtkFileSelection ); cdecl;
(* Get the selected filename and print it to the console *)
BEGIN
writeln( gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)) );
END; { -------------------------file_ok_sel------------------------}
{ ---------------------------destroy----------------------------- }
PROCEDURE destroy( widget : pGtkWidget; data : gpointer ); cdecl;
BEGIN
gtk_main_quit();
END; { ------------------------destroy------------------------------}
{ ---------------------------Global Variables-------------------- }
VAR
filew : pGtkWidget ;
{ ---------------------------Main Program------------------------ }
BEGIN
gtk_init(@argc, @argv);
(* Create a new file selection widget *)
filew := gtk_file_selection_new('File selection');
gtk_signal_connect(GTK_OBJECT(filew), 'destroy',
GTK_SIGNAL_FUNC(@destroy), @filew);
(* Connect the ok_button to file_ok_sel function *)
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION (filew)^.ok_button), 'clicked',
GTK_SIGNAL_FUNC(@file_ok_sel), filew );
(* Connect the cancel_button to destroy the widget *)
gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(filew)^.cancel_button),
'clicked', GTK_SIGNAL_FUNC(@gtk_widget_destroy), GTK_OBJECT(filew));
(* Lets set the filename, as if this were a save dialog, and we are giving a default filename *)
gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), 'filesel.pas');
gtk_widget_show(filew);
gtk_main();
END. { ----------------Main Program--------------------- }
to nie sa moje kody, chcialem ich urzyc do napisania swojego programu, a dokladniej jego czesci. zalezy mi tylko na pobraniu sciezki do pliku
przepraszam za brak polskich znakow
czy moze mi ktos powiedziec skad ten blad i jak go naprawic (tzn. ten wyjatek dzielenia przez 0)
Poprawione tagi z kodem na Pascalowe. - olesio