[GELÖST] Problem mit FindAllFiles

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von theo »

Soner hat geschrieben:
Mi 8. Jun 2022, 18:18
Ich kenne MIME-Types. Aber das löst mein Problem mit dem Dateidialog nicht.
Stimmt, das ist inkonsequent.
Dabei wäre es ja nicht schwierig, die Dateien nach dem "übergeordneten" MIME Typen (z.B. image) zu filtern:

Code: Alles auswählen

uses process;

procedure TForm1.Button1Click(Sender: TObject);
var
  S, Verz: string;
  SL: TStringList;
  i: integer;
begin
  SL := TStringList.Create;
  SL.NameValueSeparator := ':';
  Verz := '~/Bilder/';
  if RunCommand('/bin/bash', ['-c', 'file --mime-type -F ":"  ' + Verz + '*'], S) then
  begin
    SL.Text := S;
    Memo1.Lines.BeginUpdate;
    for i := 0 to SL.Count - 1 do
      if Pos('image/', Sl.ValueFromIndex[i]) > 0 then Memo1.Lines.Add(Sl.Names[i]);
    Memo1.Lines.EndUpdate;
  end;
  SL.Free;
end;      

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von Soner »

theo hat geschrieben:
Mi 8. Jun 2022, 18:58
Soner hat geschrieben:
Mi 8. Jun 2022, 18:18
Ich kenne MIME-Types. Aber das löst mein Problem mit dem Dateidialog nicht.
Stimmt, das ist inkonsequent.
Dabei wäre es ja nicht schwierig, die Dateien nach dem "übergeordneten" MIME Typen (z.B. image) zu filtern:

Code: Alles auswählen

uses process;

procedure TForm1.Button1Click(Sender: TObject);
var
  S, Verz: string;
  SL: TStringList;
  i: integer;
begin
  SL := TStringList.Create;
  SL.NameValueSeparator := ':';
  Verz := '~/Bilder/';
  if RunCommand('/bin/bash', ['-c', 'file --mime-type -F ":"  ' + Verz + '*'], S) then
  begin
    SL.Text := S;
    Memo1.Lines.BeginUpdate;
    for i := 0 to SL.Count - 1 do
      if Pos('image/', Sl.ValueFromIndex[i]) > 0 then Memo1.Lines.Add(Sl.Names[i]);
    Memo1.Lines.EndUpdate;
  end;
  SL.Free;
end;      
Danke für den Tipp. Ich habe es notiert und ich werde es ausprobieren, wenn ich mit Linux unterwegs bin.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 8. Jun 2022, 17:56
Wo Linux und Windoof noch einen riessen Unterschied hat. Das einte OS ignoriert gross und Kleinschreibung. So wie bei C und Pascal.
Das hat nichts mit Windows vs. Linux zu tun, sondern mit dem Dateisystem. Wenn du in Windows ein Ext einbindest (mit dem passenden Treiber geht das), dann hast du da genauso Dateien mit unterschiedlicher Schreibweise. Und auch NTFS ist case-sensitive, wenn man Dateien im POSIX Space, statt im Win32 Space anlegt (wurde zum Beispiel von Interix bzw. Subsystem for Unix Applications, dem Vorgänger von WSL genutzt). Und heutzutage erlaubt es NTFS per Verzeichnis einzustellen, ob es case-sensitive oder case-preserving sein soll. Ext4 erlaubt dies übrigens auch seit ein paar Jahren. Und dann ist da noch HFS+, welches von macOS genutzt wird, welches ebenfalls case-preserving ist.
FPC Compiler Entwickler

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von theo »

@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. :wink:

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.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von theo »

Eigentlich wäre es für GTK ganz einfach in den normalen Dialog einzubauen.

mimedialog.png
mimedialog.png (73.6 KiB) 1876 mal betrachtet

Ich habe mal einen Feature Request gemacht:
https://gitlab.com/freepascal.org/lazar ... sues/39790

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von Winni »

Hi!

Das ist sehr praktisch, da die Liste der Filter in OpenDialog immer länger wird.

Es kommen neue dazu wie z.B. webp und die alten - wie pcx - wollen nicht vergessen werden.

Es sei aber drauf hingewiesen, dass graphische Programme oder Bibliotheken den zuständigen Filter zum Laden meistens anhand des Suffixes entscheiden - so der Gimp und BGRAbitmap.

Winni

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von theo »

Winni hat geschrieben:
Fr 10. Jun 2022, 15:26
Es sei aber drauf hingewiesen, dass graphische Programme oder Bibliotheken den zuständigen Filter zum Laden meistens anhand des Suffixes entscheiden - so der Gimp und BGRAbitmap.
Natürlich ist es in der Praxis so, dass man nur die Dateien zu Öffnen anbieten will, welche man auch anzeigen/bearbeiten kann.
Deshalb ist das pauschale "image/*" sicher nicht immer die richtige Lösung.

Ein Vorteil liegt aber darin, dass z.B. mit "image/png" ggf. auch Bilddateien ohne Suffix in der Liste angezeigt werden.

Und nein, das mit Gimp stimmt nicht. Gimp kann problemlos ein Bild ohne Dateinamenserweiterung öffnen.
Die MIME-Datenbank ist unter Linux-Desktop ein Standard und wird von vielen Anwendungen genutzt.
https://www.freedesktop.org/wiki/Specif ... info-spec/

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von Winni »

theo hat geschrieben:
Fr 10. Jun 2022, 17:11

Und nein, das mit Gimp stimmt nicht. Gimp kann problemlos ein Bild ohne Dateinamenserweiterung öffnen.
Hi!

Endlich mal ne Verbesserung in der Software!

Früher konnte man den Gime bei Dateien ohne Endung aufs Kreuz legen.

Da war ich nicht auf der Höhe der Zeit.

Winni

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von theo »

Die Vorschläge für GTK wurden akzeptiert.
Man kann also künftig mit GTK 'image/*' oder 'image/jpeg' als OpenDialog Filter benutzen (kann man ganz normal im Filter Editor eintragen).

https://gitlab.com/freepascal.org/lazar ... 484e619e04

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: [GELÖST] Problem mit FindAllFiles

Beitrag von Soner »

Danke, das ist super.

Antworten