![]() |
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 ? |
Re: NonVCL OpenDialog
|
Re: NonVCL OpenDialog
Liste der Anhänge anzeigen (Anzahl: 1)
Oder sowas vill.
|
Re: NonVCL OpenDialog
Cool thx,
ich installiere noch ubuntu und dann kann ichs testen und berichten ;). |
Re: NonVCL OpenDialog
Oder hier:
![]() |
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 ... |
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. |
Re: NonVCL OpenDialog
D.h. hier ist keiner der mir das für Linux verraten kann ?
|
Re: NonVCL OpenDialog
Das geht wohl über Widgets. Zum Beispiel GtkWidget, wxWidget, Qt
![]() ![]() ![]() ![]() ![]() ![]() |
Re: NonVCL OpenDialog
Thx werde die Tuts mal versuchen,
Mittlerweile hab ich noch nen 2.Post zu dem thema beim ![]() 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. |
Re: NonVCL OpenDialog
Zitat:
Delphi-Quellcode:
Dürfte wohl nicht 0 sein. :gruebel:
GtkWindow *parent
In dem FileChooser Example (C:\lazarus\fpc\2.2.3\source\packages\gtk2\example s\filechooser\simple.pas) gibt es diese procedure:
Delphi-Quellcode:
Du solltest also
* 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;
Delphi-Quellcode:
einfügen
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]); |
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? |
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. |
Re: NonVCL OpenDialog [Gelöst]
AHH endlich, ich habe des Rätsels Lösung
der Code
Delphi-Quellcode:
Am ende eingefügt löst das Problem und alles läuft 1a.
While gtk_events_pending() = 1 Do
gtk_main_iteration_do(false); Igels einwand bleibt zwar bestehen, aber mir gehts darum das es überhaupt unter Linux geht. |
Re: NonVCL OpenDialog
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz