Delphi-PRAXiS

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)

Corpsman 26. Feb 2009 10:14


NonVCL OpenDialog
 
Hossa,

Ich möchte eine Anwendung Schreiben die sowohl unter Lazarus / Linux als auch unter Win / Delphi5 Läuft.

Meine Anwendung Arbeitet mit OpenGL, also habe ich mich entschieden das ganze mittels SDL zu machen.

Die Anwendung steht auch schon, und OpenGL ist Kein problem.

Das Problem ist nur das bedingt durch SDL alles NonVCL läuft. Und nun will ich natürlich auch Dateien aus meinem Programm heraus laden.

Das Problem ist Klar TOpenDialog ist Teil der VCL und damit nun nicht mehr Verfügbar.

Wie Kriege ich also nun einen OpenDialog ?

Weiteres Problem der Dialog sollte gleich unter beiden Betriebsystemen laufen, zur not kann ich aber noch mittels Compilerswitches auf 2 unterschiedliche Dialoge ausweichen.

Die Suchfunktion hat unter "nonvcl opendialog" leider nur 3 Beiträge gefunden und alle 3 sind nicht Brauchbar :(

Ist da drausen jemand der mir weiterhelfen kann ?

himitsu 26. Feb 2009 10:24

Re: NonVCL OpenDialog
 
schau mal in meinen FileSplitter, da ist ein NonVCL-Opendialog drin.

[add]
siehe MSDN-Library durchsuchenGetOpenFileName

turboPASCAL 26. Feb 2009 10:36

Re: NonVCL OpenDialog
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oder sowas vill.

Corpsman 26. Feb 2009 11:20

Re: NonVCL OpenDialog
 
Cool thx,

ich installiere noch ubuntu und dann kann ichs testen und berichten ;).

Luckie 26. Feb 2009 12:31

Re: NonVCL OpenDialog
 
Oder hier: http://delphitutorials.michael-puff.de

Corpsman 27. Feb 2009 11:02

Re: NonVCL OpenDialog
 
Hmm, der OpenDialog von Turbopascal tut 1a, allerdings nur unter Windows.

Nu bin ich noch auf der Suche nach einer Ubuntu variante ...

himitsu 27. Feb 2009 11:20

Re: NonVCL OpenDialog
 
jupp, da wird ja auch die WinAPI verwendet und die ist, wie der Name schon sagt, Windows :stupid:

Aber vermutlich hat Ubuntu(Linux) da auch eine passende API dafür ... heißt bestimmt nur anders und mit etwas anderen Parametern.

Corpsman 27. Feb 2009 13:40

Re: NonVCL OpenDialog
 
D.h. hier ist keiner der mir das für Linux verraten kann ?

Garfield 28. Feb 2009 19:03

Re: NonVCL OpenDialog
 
Das geht wohl über Widgets. Zum Beispiel GtkWidget, wxWidget, Qt

http://www.gtk.org/features.html
http://www.wxwidgets.org/
http://www.qtsoftware.com/

http://wwwuser.gwdg.de/~kboehm/ebook/27_kap21_w6.html
http://developer.gimp.org/api/2.0/gtk/GtkWidget.html
http://doc.trolltech.com/4.3/qdialog.html

Corpsman 1. Mär 2009 08:24

Re: NonVCL OpenDialog
 
Thx werde die Tuts mal versuchen,

Mittlerweile hab ich noch nen 2.Post zu dem thema beim Lazarusforum gemacht.

Mein Code den ich bisher habe Funktioniert soweit auch schon, das er den Dialog öffnet und ich die File bekomme, nur beendet sich der dialog leider nicht. Ich kriege dann irgendwann nen Timeout und dann kachelt die ganze anwendung ab.

unter Win ists kein Thema da gehts.

Delphi-Quellcode:
unit uOpendialog;
 
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
 
interface
 
uses
{$IFDEF FPC}
  Glib2, Gdk2, Gtk2,
{$ELSE}
 
{$ENDIF}
  Classes, SysUtils;
 
Function OpenFile(Filter:String):String;
 
implementation
 
Function OpenFile(Filter:String):String;
var
  dialog  : PGtkWidget;
  filename : Pgchar;
begin
  Result := '';
  gtk_init (0,0);
  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]);
  if gtk_dialog_run (GTK_DIALOG (dialog)) = GTK_RESPONSE_ACCEPT then
  begin
     filename := gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
     result := Filename;
     g_free (filename);
  end;
  gtk_widget_destroy (dialog);
end;
 
end.

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:45 Uhr.

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