@Soner: Im Prinzip wäre es möglich, mit GTK nach Mime-Typen zu Filtern. Der "gtk_file_chooser" unterstützt dies.
Hier mal eine kleine Demo für GTK2 und GTK3. Benötigt nur noch einen Button auf dem Formular.
Da müsste man noch feilen, aber es ist mal ein "Proof of Concept ".
Der Dialog zeigt so nur "image" Typen an, egal ob mit oder ohne Erweiterung, wahlweise auch "text" Typen.
Man muss auch nicht alle erdenklichen Formate eingeben, "image/*" reicht.
Das kann vielleicht mal ganz praktisch sein.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls
{$ifdef LCLGTK3}
, LazGtk3, gtk3widgets
{$endif}
{$ifdef LCLGTK2}
, gtk2
{$endif} ;
type
{ TMimeOpenDialog }
TMimeOpenDialog = class(TOpenDialog)
private
protected
{$if defined(LCLGTK2) or defined(LCLGTK3)}
function DoExecute: boolean; override;
{$ifend}
public
end;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
fMopd: TMimeOpenDialog;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
if fMopd.Execute then ShowMessage(fMopd.Files.Text);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
fMopd := TMimeOpenDialog.Create(Self);
fMopd.Options:=fMopd.Options+[ofAllowMultiSelect];
end;
{ TMimeOpenDialog }
{$ifdef LCLGTK2}
function TMimeOpenDialog.DoExecute: boolean;
var
FC: PGtkFileChooser;
PFiltImg, PFiltTxt: PGtkFileFilter;
begin
if HandleAllocated then
begin
FC := PGtkFileChooser(Handle);
PFiltImg := gtk_file_filter_new;
gtk_file_filter_set_name(PFiltImg,'All Image Files');
gtk_file_filter_add_mime_type(PFiltImg, 'image/*');
gtk_file_chooser_add_filter(FC, PFiltImg);
PFiltTxt := gtk_file_filter_new;
gtk_file_filter_set_name(PFiltTxt,'All Text Files');
gtk_file_filter_add_mime_type(PFiltTxt, 'text/*');
gtk_file_chooser_add_filter(FC, PFiltTxt);
Result := inherited DoExecute;
gtk_file_chooser_remove_filter(FC,PFiltImg);
PFiltImg := nil;
gtk_file_chooser_remove_filter(FC,PFiltTxt);
PFiltTxt := nil;
end;
end;
{$endif}
{$ifdef LCLGTK3}
function TMimeOpenDialog.DoExecute: boolean;
var
FC: PGtkFileChooser;
PFiltImg, PFiltTxt: PGtkFileFilter;
begin
if HandleAllocated then
begin
FC := PGtkFileChooser(TGtk3Dialog(Handle).Widget);
PFiltImg:=gtk_file_filter_new;
PFiltImg^.set_name('All Image Files');
PFiltImg^.add_mime_type('image/*');
FC^.add_filter(PFiltImg);
PFiltTxt:=gtk_file_filter_new;
PFiltTxt^.set_name('All Text Files');
PFiltTxt^.add_mime_type('text/*');
FC^.add_filter(PFiltTxt);
Result:=inherited DoExecute;
FC^.remove_filter(PFiltImg);
PFiltImg := nil;
FC^.remove_filter(PFiltTxt);
PFiltTxt := nil;
end;
end;
{$endif}
end.