Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   NonVCL OpenDialog (https://www.delphipraxis.net/129825-nonvcl-opendialog.html)

Garfield 1. Mär 2009 18:41

Re: NonVCL OpenDialog
 
Zitat:

Zitat von Corpsman
Delphi-Quellcode:
  dialog := gtk_file_chooser_dialog_new ('Open File',
                                                         0,
                                                         GTK_FILE_CHOOSER_ACTION_OPEN,
                                                         GTK_STOCK_OPEN, [GTK_RESPONSE_ACCEPT,
                                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                         NULL]);

Das zweite Argument ist
Delphi-Quellcode:
GtkWindow *parent
Dürfte wohl nicht 0 sein. :gruebel:

In dem FileChooser Example (C:\lazarus\fpc\2.2.3\source\packages\gtk2\example s\filechooser\simple.pas) gibt es diese procedure:
Delphi-Quellcode:
* File dialog-callback. *)
procedure dialog_callback (widget : PGtkWidget;
                           data  : gpointer); cdecl;
var
  dialog  : PGtkWidget;
  window  : PGtkWindow;
  action  : gint;
  filename : Pgchar;

begin
  { Get a pointer to the main window }
  window := g_object_get_data (G_OBJECT(widget), MAIN_WINDOW_KEY);

  action := gint (data);

  case action of
        ACTION_OPEN:
                begin
                  dialog := gtk_file_chooser_dialog_new ('Open File',
                                                         window,
                                                         GTK_FILE_CHOOSER_ACTION_OPEN,
                                                         GTK_STOCK_OPEN, [GTK_RESPONSE_ACCEPT,
                                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                         NULL]);

                end; { ACTION_OPEN}
        ACTION_SAVE:
                begin
                  dialog := gtk_file_chooser_dialog_new ('Save File',
                                                         window,
                                                         GTK_FILE_CHOOSER_ACTION_SAVE,
                                                         GTK_STOCK_SAVE, [GTK_RESPONSE_ACCEPT,
                                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                         NULL]);

                end; { ACTION_SAVE }
        else begin
                 { This should never happen }
                g_print ('Something is wrong here!!!.'#13#10);
                g_print ('No dialog created.'#13#10);
                {writeln crashes on my system running linux --- check why }
                exit;
             end;
  end; { case }


  if gtk_dialog_run (GTK_DIALOG (dialog)) = GTK_RESPONSE_ACCEPT then
  begin
     filename := gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
     g_print ('Filename %s selected.'#13#10, [filename]);
 //    writeln ('File ', filename, ' selected.');
 //  ToDO:
 //  writeln crashes... check why

     g_free (filename);
  end;

  gtk_widget_destroy (dialog);
end;
Du solltest also
Delphi-Quellcode:
var
  window  : PGtkWindow;
begin
  { Get a pointer to the main window }
  window := g_object_get_data (G_OBJECT(widget), MAIN_WINDOW_KEY);

  dialog := gtk_file_chooser_dialog_new ('Open File',
                                         window,
                                         GTK_FILE_CHOOSER_ACTION_OPEN,
                                         GTK_STOCK_OPEN, [GTK_RESPONSE_ACCEPT,
                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                         NULL]);
einfügen

igel457 1. Mär 2009 19:27

Re: NonVCL OpenDialog
 
Ich verstehe ehrlich gesagt nicht, warum du nicht die VCL/LCL verwendest. Die tut die ganze Arbeit mit dem OpenDialog nämlich schon für dich - das ist ja eben der Sinn von solchen Abstrahierungsebenen - und die paar Kilobyte, die deine Anwendung größer werden, sind ja wirklich kein Grund.

Zum Beispiel ist ja nicht wirklich gesagt, dass ich unter Linux GTK installiert habe. Verwendest du die LCL, kannst du mit einem Klick zum Beispiel auf QT ausweichen - oder willst du dafür auch noch einen OpenDialog implementieren?

Corpsman 2. Mär 2009 13:25

Re: NonVCL OpenDialog
 
Mir düngt ich habe vergessen zu schreiben wieso das ganze.

Also

Ich habe eigentlich eine OpenGL anwendung gebastelt.

Und diese will ich Platformunabhängig haben.

Das geht mittels SDL.

Aber alles SDL das ich habe funktioniert eben nur ohne VCL, bzw LCL.

Es kann gut sein das es ne Möglichkeit gibt wie man das machen kann das SDL mit VCL, bzw LCL läuft, wie das geht, weis ich aber leider nicht.

@Igel457

Ich nutze auch viel Lieber die VCL, LCL, und wenn ich wüste wie man SDL mit VCL, LCL zum laufen bringt, ich würde es machen.


@Garfield

Das Prob ist das ich mit SDL kein Pointer auf ein Main Fenster habe, und deswegen kann ich da auch nichts übergeben, und habe deswegen eine 0 übergeben.

Der Dialog wird ja geöffnet und gibt mir sogar die Filename zurück, die ich laden soll.

nur Leider schliest sich der Dialog eben nicht, und deswegen habe ich dann die Probleme.

Corpsman 2. Mär 2009 13:48

Re: NonVCL OpenDialog [Gelöst]
 
AHH endlich, ich habe des Rätsels Lösung

der Code

Delphi-Quellcode:
  While gtk_events_pending() = 1 Do
    gtk_main_iteration_do(false);
Am ende eingefügt löst das Problem und alles läuft 1a.

Igels einwand bleibt zwar bestehen, aber mir gehts darum das es überhaupt unter Linux geht.

igel457 2. Mär 2009 15:33

Re: NonVCL OpenDialog
 
Zitat:

@Igel457
Ich nutze auch viel Lieber die VCL, LCL, und wenn ich wüste wie man SDL mit VCL, LCL zum laufen bringt, ich würde es machen.
Das geht ganz einfach: Du darfst bei Lazarus nur nicht das Application.Initialize am Anfang des Programms vergessen und sonst kannst du deinen bisherigen Code verwenden. Dann kannst du direkt ohne irgendwelche Umwege einen OpenDialog erstellen und verwenden. Siehe: http://andorra.cvs.sourceforge.net/v...w=markup#l_186


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz