Non LCL OpenFiledialog

Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Non LCL OpenFiledialog

Beitrag von corpsman »

Hallo alle,

Ich bin neu hier und hoffe das dies das Richtige Unterforum ist.

Ich habe bisher sehr viel unter Windows und Delphi 5 Pro gemacht. Nun Will ich aber auf Linux ( Ubuntu ) wechseln.

Das Problem ist natürlich das ich meine ganzen Alten Projekte Portieren will.

Und da gehts auch schon los.

Ich nutze sehr viel OpenGL, das zu Portieren geht mittels SDL. SDL wiederrum verlangt das ich ohne VCL ( LCL ) Arbeite unter Windows habe ich daher einen NonVCL OpenFiledialog / SaveFiledialog. Doch wenn ich nach Lazarus Linux und einem solchen Dialog suche, finde ich immer nur Beiträge, welche sich auf die IDE beziehen.

Kann mir jemand hier weiterhelfen und einen entsprechenden Code nennen ?
--
Just try it

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Non LCL OpenFiledialog

Beitrag von monta »

Herzlich Willkommen im Forum.

Schau mal hier nach:
http://www.freepascal.org/packages/gtk/ ... tents.html

Punkt 9.13 sollte in etwa das sein, was du brauchst.

Ansonsten ggf. mal schauen, wie Lazarus/FPC das macht, irgendwann wird da ja auch auf gtk zugegriffen.

//Nachtrag: Schau mal in deinem FPC-Verzeichnis unter examples\gtk2\filechooser, da hast du genau dafür zwei kleine Beispiele
Johannes

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Non LCL OpenFiledialog

Beitrag von corpsman »

Also,

examples\gtk2\filechooser

Gibts bei mir leider nicht, obwohl ich die neuese Lazarus version habe ( 0.9.24 beta )

Aber das andere Sample scheint brauchbar zu sein.

Zumindest kann ich es Compilieren und es schreibt mir die "geladenen" Dateien in die Konsole.

Werde nun versuchen das so um zu bauen wie ich das Brauche.

Denn eigentlich will ich das ja in der Art

Code: Alles auswählen

Var Filename:String;
Begin
  ..
  Filename := OpenDialog('*.*');
  if Filename <> '' then begin
    ..
  End;
  ..
End;


Bin mal gespannt ob ich das hinkriege ..
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Non LCL OpenFiledialog

Beitrag von corpsman »

So ich habe nun was zusammengeschustert.

Das Problem ist natürlich das ich keine Ahnung habe was ich da zusammenkopiert habe, deswegen geht die Filtermaske auch noch nicht.

Vielmehr befürchte ich aber eine Grundlegend Falsche Anwendung oder noch schlimmer Speicherlöcher.

Laut Debugger scheint der Dialog dafür aber zu funktionieren ;)

Die Frage ist ob das gtk_init(0,0) nicht auch irgendwo wieder Rückgängig gemacht werden sollte ??

Hier mal mein bisheriges Machwerk, Verbesserungsvorschläge sind erwünscht *g*

[EDIT]
Zu Früh gefreut, Zwar kriegt der Dialog es hin das er mir den Dateinamen gibt. Nur leider beendet sich der Dialog nicht, und Rauscht dann irgendwann sammt der Hauptanwendung ab :(

Code: Alles auswählen

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.
--
Just try it

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Non LCL OpenFiledialog

Beitrag von creed steiger »

corpsman hat geschrieben:Also,

examples\gtk2\filechooser

Gibts bei mir leider nicht,...



dann halt

/usr/share/fpcsrc/packages/gtk2/examples/filechooser
oder woauchimmer dein FPC liegt.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Non LCL OpenFiledialog

Beitrag von corpsman »

hab das andere Sample nun auch gefunden, aber im Prinzip steht da ja das selbe drin wie in dem Tutorial.

Zumindest, kann ich aus dem Sample keine weitere erkenntnis mehr ziehen, wieso der oben gepostete source einen Timeout erzeugt beim Beenden...
--
Just try it

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Non LCL OpenFiledialog

Beitrag von knight »

corpsman hat geschrieben:
Gibts bei mir leider nicht, obwohl ich die neuese Lazarus version habe ( 0.9.24 beta )


Die letzte stabile Version von Lazarus ist 0.9.26.

knight

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Non LCL OpenFiledialog

Beitrag von corpsman »

Hmm ich habe Lazarus halt via synaptic installiert.

wenn du mir verrätst wie ich die neueste version drauf machen kann, mach ich das gerne.

Ein einfaches runterladen der Datei "lazarus-ide_0.9.26-0_i386.deb" und doppelklick sagt mir : Error Dependency is not satisfiable : fp-compiler

und das obwohl ich die Datei fpc_2.2.2-3_all.deb installiert hab.

ich befürchte nur das mir das mit meinem Opendialog nicht arg viel weiterhelfen wird...

[Edit]

Also durch runterladen von allen *.deb Dateien die es da auf der Lazarus HP gibt. Habe ich es nun geschafft die ver 0.9.26 beta zu installieren und WOW die sieht super aus. Nur leider gibts noch einige Fehler :

1. Beim Starten von Lazarus bekomme ich nun immer die Fehlermeldung : "Unable to open package 'JPEGForLazarus'. This package was marked for installation."

2. Wenn ich die Unit Gtk2.pas einbinde , welche ich ja eingebunden habe. Dann bekomme ich einen Linker Fehler und das Programm lässt sich nicht mehr compilieren.
--
Just try it

Benutzeravatar
Garfield
Beiträge: 172
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
CPU-Target: 64Bit
Wohnort: Aken

Re: Non LCL OpenFiledialog

Beitrag von Garfield »

Corpsman hat geschrieben:[delphi]
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]);
[/delphi]

Das zweite Argument ist
[delphi]
GtkWindow *parent
[/delphi]
Dürfte wohl nicht 0 sein. \":?:\"

In dem FileChooser Example (C:\lazarus\fpc\2.2.3\source\packages\gtk2\examples\filechooser\simple.pas) gibt es diese procedure:
[delphi]
* 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]

Du solltest also
[delphi]
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]);
[/delphi]
einfügen
Gruß Garfield

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Non LCL OpenFiledialog

Beitrag von corpsman »

Also es ist nun gelöst.

Wenn ich am ende noch

Code: Alles auswählen

While gtk_events_pending() = 1 Do
    gtk_main_iteration_do(false);


Einfüge dann gehts 1a ;)
--
Just try it

Antworten