TOpenDialog, Filter

Antworten
Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TOpenDialog, Filter

Beitrag von Mathias »

Bei folgenden Code werden alle Text-Dateien aufgelistet.

Code: Alles auswählen

  OpenDialog1.InitialDir:='test';
  OpenDialog1.DefaultExt:='txt';
  OpenDialog1.Execute;


Egal ob *.txt; *.Txt, *.TXT .

Weise ich aber einen Filter zu, wird nur noch *.txt aufgelistet.

Code: Alles auswählen

OpenDialog1.Filter:='Text-Dateien|*.txt';


Gut, ich könnte es so machen:

Code: Alles auswählen

OpenDialog1.Filter:='Text-Dateien|*.TXT;*.txt'


Aber dann müsste ich 8 verschiedene Schlüssel berücksichtigen.

Gibt es dafür etwas einfacheres ?

ZB.

Code: Alles auswählen

FindAllFiles('.'*.TXT'); 
listet auch alle auf, egal wie geschrieben.

Das Problem ist natürlich nur unter Linux vorhanden, da Windows keine Unterschied zwischen gross und klein macht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: TOpenDialog, Filter

Beitrag von theo »

Mathias hat geschrieben:Gibt es dafür etwas einfacheres ?

Nicht dass ich wüsste.
Unter Unix sind die Dateinamenserweiterungen sowieso alle klein afaics.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TOpenDialog, Filter

Beitrag von Mathias »

Unter Unix sind die Dateinamenserweiterungen sowieso alle klein afaics.

In der Regel schon. aber leider halten sich nicht alle daran.


Mit FileExists stehe ich auch an.
Ich versuche es jetzt so zum umgehen, ist aber sicher auch keine saubere Lösung. :?

Code: Alles auswählen

function MyFileExists(s: UnicodeString): boolean;
var
  SL: TStringList;
begin
  SL := FindAllFiles('.',s, False);
  Result := (SL.Count > 0);
  SL.Free;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  if MyFileExists('PrOjEcT1.lPi') then begin
    ShowMessage('Datei vorhanden');
  end else begin
    ShowMessage('Datei nicht vorhanden');
  end;
end


Ich bin an einem Konverter von Windows umzuschreiben, welcher CD-Coverdateien kopiert/konvertiert.
Dabei werden 'Front.jpg' gesucht, geladen, konvertiert und in 'folder.jpg' gespeichert.
Nur ist 'front.jpg' nicht immer gleich geschrieben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: TOpenDialog, Filter

Beitrag von aro »

Ich habe das gleiche Problem. Nach dem WINDOWS10 beim letzten Update mal einfach mein komplettes Nutzerverzeichnis gelöscht hat habe Ich komplett auf Linux umgestellt.
Nun schreibe ich einen Ersatz für Atmel Studio 7 aber für Linux.

Es gibt eigentlich nur eine Lösung als erstes prüfen ob Datei mit der Schreibweise vorhanden ist. Wenn ja dann ist alles gut.
Wenn nicht dann Dateinamen in Kleinbuchstaben wandeln.
alle Dateien im Zielverzeichnis Durchsuchen

try
if FindFirst(ImportPfad + '*.asm', faAnyFile and not faDirectory, sr) = 0 then
repeat

In sr.Name werden dann in jeder Schleife eine Datei in der aktuellen Schreibweise
gefunden. Mit LowerCase() kopierst Du sr.Name in einen neuen String.
Die Strings kannst Du vergleichen. Bei Gleichheit hast Du die richtige Datei gefunden.
Die aktuelle Schreibweise hast Du in sr.Name.

Nun irgend eine Aktion durchführen.
break;

until FindNext(sr) <> 0;
finally
FindClose(sr);
end;

und dann die nächste Datei suchen.

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: TOpenDialog, Filter

Beitrag von PascalDragon »

Mathias hat geschrieben:
Do 31. Dez 2015, 16:46
Gibt es dafür etwas einfacheres ?
Die Dialoge werden vom jeweiligen Widgetset (im Fall von Linux GTK oder Qt) bereitgestellt und die arbeiten da eben Case Sensitive. Es sollte aber theoretisch gehen folgenden Filter zu verwenden: <i>Text Dateien (*.txt)|*.txt;*.TXT;*.Txt</i>
Mathias hat geschrieben:
Do 31. Dez 2015, 16:46
ZB.

Code: Alles auswählen

FindAllFiles('.'*.TXT'); 
listet auch alle auf, egal wie geschrieben.
FindAllFiles behandelt das eben speziell.
FPC Compiler Entwickler

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TOpenDialog, Filter

Beitrag von Sieben »

Siehe auch noch diesen kürzlichen Thread hier:

viewtopic.php?f=18&t=13103

Antworten