Thakn you,

Marco van de Voort wrote:

GTK1 was debugged for Windows because lazarus used it at first. However
Lazarus switched to plain win32 later, so I don't think GTK2 on windows is
too well debugged in relation with FPC, and I know nobody that uses GTK2
with FPC on Windows.


I do :) -- it seems much better than 1.2, an I was too lazy
to learn C fluently :(

Well, I used my GTK 2 code on Windows and there were no problems at all. And note that I initially wrote and tested that code on Linux, not on Windows.


I do the same.

In summary, there are no "known general problems" with GTK 2 + Win32 + FPC. Everything should work just as under X-Windows under Unices.

Janusz: I think that you must reveal in more details where are your problems. Show us some piece of code etc.


  Here it is. You may do not like that code, I do not like it too much,
  but it works. It is rather old code, many times patched and ported.
  I am not able to isolate pure GTK+ code from this bundle in a short time.

  Here I put only the crucial few lines, that invoke new gtkCombo,
  attach a list to it and mount it to outer non-gtk structure.

  The problem is that immediately after gtk_combo_new(), the result has
  in W32 its Entry field equal to NULL. So, no explicit operation could
  be done on that field, although the widget is visible, clickable etc.

  I am using gtk2-2.4.0-1 under redhat, 2.4.14-3 under fedora (they are
  OK), and 2.4.14 under w2k and wine. Using old GTK1.2, no problem is reported.

program sample;
uses
  formica;  // nonstandard, but the most important piece given below.
            // this is high-level api that abstracts from interface
            // details
var
  h: dlghandle;  // == pointer
  items: array[1..5] of shortstring;
const
  current_field: integer = 0;

begin

  formicainit('A sample application');  // calls gtk_init();

  items[1] := 'field 1';
  items[2] := 'field 2';
  items[3] := 'field 3';
  items[4] := 'field 4';
  items[5] := 'last field';
  current_field := 3;

writeln('before: --------------');
writeln(current_field, ': "', items[current_field], '"');

  h := createdialog('A sample dialog'); // calls gtk_dialog_new();
  DefListField(h, 'A sample combo list:', 5, @items, current_field);  // below
  executedialog(h, nil, nil, nil);  // calls loop with gtk_main_iteration
                                    // as many times as needeed

writeln('after: ---------------');
writeln(current_field, ': "', items[current_field], '"'); writeln('thanks ---------------');

end.

{
  most important piece defines combo widget in dialog
}
function DefListField(h: DlgHandle; const msg: string; n: index; keyvalues: 
pstringlist; var ikey: index): boolean;
var
  __p: pchar;
  i: index;
begin
  with pDialogForm(h)^ do begin
    itemTail^ := NewPDlgItem;
    with itemTail^^ do begin
      itemtype := idftype_combo;

      itemsrc_co := @ikey;
      itemvalue_co := ikey;

      ItemLabel := DefLabelWithText(Msg);

      itemBox := pgtkbox(gtk_hbox_new(FALSE, 8));
      gtk_box_pack_start(PgtkBox(itemBox), PGtkWidget(ItemLabel), false, false, 
0);

      if (n>0) then begin

        itemCombo := pgtkcombo(gtk_combo_new());
// FALSE in UX, TRUE in WINDOWS
writeln('is Entry nil? ', itemcombo^.entry=nil);
        itemlist_co := nil;

        for i := 1 to n do begin
          __p := str2pchar(keyvalues^[i]);
          itemList_co := g_list_append(itemlist_co, __p);
          { this entry must be passed to the list; do not "strDispose(__p);" 
now! }
        end;

        gtk_combo_set_popdown_strings(itemcombo, itemList_co);
        if (ikey>0) then begin
          __p := Str2PChar(keyvalues^[ikey]);
          gtk_entry_set_text(pgtkentry(itemcombo^.entry), __p);
          strDispose(__p);
        end else
          gtk_entry_set_text(pgtkentry(itemcombo^.entry), '<???>'#0);

        gtk_combo_set_value_in_list(itemcombo, true, false);
        gtk_entry_set_editable(pgtkentry(itemcombo^.entry), false);

        gtk_box_pack_start(pgtkbox(itembox), pgtkwidget(itemCombo), false, 
false, 0);
        gtk_widget_show(pgtkwidget(itemCombo));

      end else
        gtk_entry_set_text(pgtkentry(itemcombo^.entry), '<???>'#0);

      itemnrows_co := n;

      gtk_box_pack_start(PGtkBox(Window^.vbox), PGtkWidget(itemBox), false, 
false, 0);
    end;
    itemTail := @itemTail^^.itemNext;
    result := true;
  end;
end;


(* here is my log from linux

[EMAIL PROTECTED] siren]$ ../../bin/gtk/sample
before: --------------
3: "field 3"
Dialog created: "A sample dialog"
is Entry nil? FALSE
Dialog: executing
after: ---------------
5: "last field"
thanks ---------------
[EMAIL PROTECTED] siren]$
*)

(* here is the same from w32 (wine, not windows -- I cut wine logs,
   but there is no difference between wine and true w2k

F:\devel\src\siren>..\..\bin\gtkw2\sample.exe
before: --------------
3: "field 3"
Dialog created: "A sample dialog"
is Entry nil? TRUE

(sample.exe): Gtk-CRITICAL **: file gtkentry.c: line 3642 (gtk_entry_set_text): 
assertion `GTK_IS_ENTRY (entry)' failed

(sample.exe): Gtk-CRITICAL **: file gtkentry.c: line 3777 
(gtk_entry_set_editable): assertion `GTK_IS_ENTRY (entry)' failed
Dialog: executing

(sample.exe): Gtk-CRITICAL **: file gtkentry.c: line 3797 (gtk_entry_get_text): 
assertion `GTK_IS_ENTRY (entry)' failed

An unhandled exception occurred at $00422031 :
EAccessViolation : Access violation
F:\devel\src\siren>

*)

Is that common for GTKCombo under Windows?

With regards,


                                       Jan Je/lowicki
                                       [EMAIL PROTECTED]
-----------------------------------------------------------------
Department of Mathematics       Katedra Matematyki
University of Agriculture       Akademia Rolnicza we Wroc/lawiu
Wroc/law, POLAND
-----------------------------------------------------------------

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to