Here it is (as attachment, hopefully the list processor doesn't strip it
off):


unit browser192;

{$define debug}
interface
uses sysutils, glib, gdk, gtk, unix;

const
        SEP: char = ';';
        QT: char = '"';

type
        TCustomer = class
                Name: AnsiString;
                FirstName: AnsiString;
                Street: AnsiString;
                Zip: Ansistring;
                City: AnsiString;
                Phone: AnsiString;
                function asCSV: AnsiString;
        end;
                
        TPropagateCallback = procedure(data: TCustomer);
        
        CustomerBrowserClass = class of TCustomerBrowser;

        TCustomerBrowser = class
        public
                dialog: pGtkWidget; { access for caller granted }

                constructor create(callback: TPropagateCallback);
                destructor destroy; override;
                function execute: boolean;
        private
                btnOkay: pGtkWidget;
                btnCancel: pGtkWidget;
                headline: pGtkWidget;
                scroll: pGtkWidget;
        end;
                
procedure onCustOkay(data : pGtkCList ); cdecl;

var
        cbPropagate     : TPropagateCallback;
        _me                     : pGtkWidget;

implementation


function TCustomer.asCSV: AnsiString;
begin
        result := 
                        SEP + QT + Name + QT +
                        SEP + QT + FirstName + QT +
                        SEP + QT + Street + QT +
                        SEP + QT + ZIP + QT +
                        SEP + QT + City + QT +
        SEP + QT + Phone + QT;
end;

procedure onCustOkay(data : pGtkCList ); cdecl;
var
        src: TCustomer;
begin
        src := TCustomer.create;
        src.Name := 'The Name';
        src.FirstName := 'FirstName';
        {$ifdef debug} writeln(src.asCSV); {$endif}
        
        { propagate selected entry }
        cbPropagate(src);

        gtk_widget_destroy(_me);

end; { onCustOkay }

constructor TCustomerBrowser.create(callback: TPropagateCallback);
begin
        inherited create;

        cbPropagate := callback;
        
        dialog := gtk_dialog_new();
        gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
        gtk_window_set_position(pGtkWindow(dialog), GTK_WIN_POS_CENTER);
        gtk_widget_set_usize(dialog, 500, 400);
        gtk_container_set_border_width(pGTKCONTAINER(dialog), 24);
        _me := dialog;

        headline := gtk_label_new(PChar('Any Headline'));

        gtk_box_pack_start( pGtkBox(GTK_DIALOG(dialog)^.vbox) , headline, FALSE, 
FALSE, 5);

        { --- button OK --- }
        btnOkay := gtk_button_new_with_label('do call back');
        
        { transport data to caller via callback on 'OK' }
        gtk_signal_connect_object (GTK_OBJECT (btnOkay), 'clicked',
                        GTK_SIGNAL_FUNC (@onCustOkay), nil);
                        
        gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)^.action_area),
                        btnOkay);

end;

destructor TCustomerBrowser.destroy;
begin
        { nothing yet }
end;

function TCustomerBrowser.execute: boolean;
begin
        result := FALSE;
        gtk_widget_show_all (dialog);
end;

END.
program main192;
{$mode objfpc}
uses sysutils, glib, gdk, gtk, browser192;
        
var
        window : pGtkWidget;
        c          : pGtkWidget;
        br         : TCustomerBrowser;


procedure destroy(widget : pGtkWidget ; data: pgpointer ); cdecl;
begin
        if assigned(br) then br.free;
        gtk_main_quit();
end;

procedure setCustDataCallback(data: TCustomer); cdecl;
begin
        writeln('callback: Name is '+data.Name);
end;

procedure showCustomerBrowser(btn: pGtkButton; data: gpointer); cdecl;
begin
        writeln('showCustomerBrowser start');
        br := TCustomerBrowser.create(@setCustDataCallback);
        writeln('browser created');
        br.execute;
end;

BEGIN

        gtk_init (@argc, @argv);

        window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
        c := gtk_button_new_with_label('show browser');
        gtk_container_add(GTK_CONTAINER(window), c);
        gtk_signal_connect(GTK_OBJECT(c), 'clicked',
                                           GTK_SIGNAL_FUNC(@showCustomerBrowser), NIL);
        
        gtk_signal_connect (pGTKOBJECT(window), 'destroy',
                                                GTK_SIGNAL_FUNC (@destroy), NULL);
        gtk_widget_show_all(window);
        gtk_widget_show (window);

        gtk_main ();
        
END.

Reply via email to