TSaveDialog Dateinamenerweiterung

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
wennerer
Beiträge: 505
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

TSaveDialog Dateinamenerweiterung

Beitrag von wennerer »

Hallo an Alle,
ich benutze in einem kleinem Programm TSaveDialog zum Speichern. Da ich in verschiedenen Formaten (*.bmp,*.jpg,*.ico) speichern möchte muss ich im Dialog eine Auswahl treffen. Als Standard habe ich *.png definiert und als Filename "Unbenannt.png" eingetragen. Dies funktioniert auch alles einwandfrei, ich kann auch in den verschiedenen Formaten speichern. Was ich nicht hin bekommen (und ich google schon länger) ist das beim Filename der im Editfeld steht die Dateinamenerweiterung angezeigt wird. Also wenn ich z.Bsp. *.bmp anwähle soll Unbenannt.bmp im Editfeld stehen. Hab auch schon mit OnTypChange herum probiert, komme ich aber nicht weiter. Mein System Lazarus 1.6 und Ubuntu 16.04LTS.
Bin für jeden Tipp dankbar.
Viele Grüße!

Code: Alles auswählen

 
  SaveDialog1                  := TSaveDialog.Create(self);
  SaveDialog1.Title           := 'Datei Speichern Unter';
  SaveDialog1.Options      := [ofoverwriteprompt,ofpathmustexist];
  SaveDialog1.FileName   := 'Unbenannt.png';
  SaveDialog1.DefaultExt  := '.png';
  SaveDialog1.Filter          := 'PNG- Dateien (*.png)|*.png|Bitmap- Dateien (*.bmp)|*.bmp|Bild- Datei (*.jpg)|*.jpg|Icons (*.ico)|*.ico';
  SaveDialog1.OnTypeChange := @TypChange;
 

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TSaveDialog Dateinamenerweiterung

Beitrag von Warf »

Denk nicht so kompliziert ;)
Die Option ofExtensionDifferent übernimmt das für dich, denn ungeachtet des Namens, der für mich das gegenteil bedeutet, enforced diese Option die ausgewählte Dateierweiterung

wennerer
Beiträge: 505
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TSaveDialog Dateinamenerweiterung

Beitrag von wennerer »

Hi Warf,
danke für deine Antwort. Habe die Option gleich mal probiert. Die Anzeige im Eingabefeld ändert sich aber leider nicht. Vielleicht denke ich aber wirklich zu kompliziert. Ich habe mir eben mal in verschiedenen Programmen wie z. Bsp. LibreOffice den Speichern Unter Dialog angesehen. Dort steht als Vorgabe nur Unbenannt in der Eingabezeile (ohne .odt) und bei Auswahl einer anderen Erweiterung wird auch nichts dazu geschrieben.
Viele Grüße!

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TSaveDialog Dateinamenerweiterung

Beitrag von Warf »

Soweit ich weiß, wenn keine Erweiterung angegeben hast wird sie nicht visuell hinzugefügt, aber wenn im FileName wird bei Klick auf OK die Erweiterung hinzugefügt

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TSaveDialog Dateinamenerweiterung

Beitrag von Timm Thaler »

Das ist doch normales Verhalten. Wenn ich in anderen Programmen einen Dateinamen eingebe und den Dateityp wechsle, steht die Extension auch nicht unbedingt hinter dem Namen, wird aber beim Bestätigen mit Ok mit übergeben.

Also lass es einfach so.

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: TSaveDialog Dateinamenerweiterung

Beitrag von wp_xyz »

Ist es realistisch überhaupt möglich, dass Dateinamen ohne Endung in die Eingabezeile gelangen? Durch Klicken in der Dateiliste nicht, denn dort stehen sie ja mit Endung und werden genauso in die Eingabezeile übernommen. Durch Eintippen eines Dateinamens? Im Prinzip ja, aber nach dem Eintippen des Dateinamens folgt ENTER bzw Klick auf OK, um den Dialog zu beenden, und da bleibt kein Bedarf mehr, die Endung anzuhängen, weil sich der Dialog sofort schließt.

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TSaveDialog Dateinamenerweiterung

Beitrag von Warf »

wp_xyz hat geschrieben:Ist es realistisch überhaupt möglich, dass Dateinamen ohne Endung in die Eingabezeile gelangen? Durch Klicken in der Dateiliste nicht, denn dort stehen sie ja mit Endung und werden genauso in die Eingabezeile übernommen. Durch Eintippen eines Dateinamens? Im Prinzip ja, aber nach dem Eintippen des Dateinamens folgt ENTER bzw Klick auf OK, um den Dialog zu beenden, und da bleibt kein Bedarf mehr, die Endung anzuhängen, weil sich der Dialog sofort schließt.


Wie gesagt mit der Option ExtensionDifferent kümmert sich der OpenDialog intern. Wenn keine dateiendung angegeben wurde, wird sie intern hinzugefügt und ist in der FileName property enthalten

wennerer
Beiträge: 505
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TSaveDialog Dateinamenerweiterung

Beitrag von wennerer »

Vielen Dank allen nochmal für eure Antworten.
Ich habe jetzt nochmal in mehreren Programmen den SpeichernUnter Dialog angesehen und es funktioniert eigentlich überall so wie bei mir jetzt. Ich schreibe ins Editfeld den Dateinamen ohne Endung und kann dann ohne Probleme die neue passende Endung auswählen.
Um zu verstehen wie ich überhaupt darauf gekommen bin muss ich noch kurz erklären was ich machen will. Ich öffne zum Beispiel eine Bitmap-Datei und möchte diese im jpg-Format speichern. Wenn ich jetzt bei der Bitmap-Datei speichern unter mache und im Editfeld des Dialogs steht der Dateiname mit .bmp kann ich nicht als jpg speichern. Ich mus dann erst im Editfeld die Erweiterung handisch löschen und dann geht das Speichern im neuen Format. Wie schon gesagt das ist aber offensichtlich in anderen Programmen (zumindest in Ubuntu) genau so.
Meine Lösung ist jetzt eben wie schon gesagt das ich vor dem Aufruf von SaveDialog die Erweiterung wegnehme und Filename setze.

Code: Alles auswählen

 
 SaveDialog1.FileName:= ChangeFileExt(ExtractFileName(MeinPfad),'');
 SaveDialog1.Execute;
 

Viele Grüße
Bernd

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: TSaveDialog Dateinamenerweiterung

Beitrag von MacWomble »

Es gibt doch:

ExtractFileNameWithoutExt(const AFilename: string): string;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

cle
Beiträge: 30
Registriert: Mi 31. Jan 2018, 11:54
OS, Lazarus, FPC: Winux (L trunc FPC 3.3.1)
CPU-Target: 64Bit

Re: TSaveDialog Dateinamenerweiterung

Beitrag von cle »

Ich habe das vor einigen Jahren mit Delphi unter Win98 so gelöst

Code: Alles auswählen

 
procedure TForm1.SaveDialog1TypeChange(Sender: TObject);
var
  whandle : HWND;
  flname : String;
begin
  whandle := GetParent(SaveDialog1.Handle);
  flname := ExtractFilename(SaveDialog1.FileName);
  case SaveDialog1.FilterIndex of
     1 : flname := ChangeFileExt(flname, '.bla');
     2 : flname := ChangeFileExt(flname, '.blabla');   
  end;
  SendMessage(whandle, CDM_SETCONTROLTEXT, 1152, lParam(PChar(flname)));
end;
 


Keine Ahnung, ob das mit neueren Win-Versionen noch funktioniert, ist aber vielleicht ein Ansatz für die Suche.
Gruß
Alex

wennerer
Beiträge: 505
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TSaveDialog Dateinamenerweiterung

Beitrag von wennerer »

Hallo Alex,
ja genau so was hätte ich mir vorgestellt. Hab auch schon in die Richtung rumprobiert. Habe aber leider keine Ahnung wie so was in Ubuntu aussehen könnte oder ob sendmessage in Linux überhaupt funktioniert. Trotzdem vielen Dank.
Viele Grüße
Bernd

cle
Beiträge: 30
Registriert: Mi 31. Jan 2018, 11:54
OS, Lazarus, FPC: Winux (L trunc FPC 3.3.1)
CPU-Target: 64Bit

Re: TSaveDialog Dateinamenerweiterung

Beitrag von cle »

Ja, habe zu spät gesehen, dass du es für Linux brauchst (das Alter, du weißt ;) )
Im Zweifelsfall kann man sich natürlich auch einen eigenen Dialog schreiben. Das habe ich gerade beim Double Commander (ein Freepascal Projekt) beim Erstellen eines gepackten Archives gesehen. Dort wird die Dateiendung je nach Auswahl von Zip, Rar etc. automagisch geändert.

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: TSaveDialog Dateinamenerweiterung

Beitrag von wp_xyz »

cle hat geschrieben:Dort wird die Dateiendung je nach Auswahl von Zip, Rar etc. automagisch geändert.

Es ist ja gut zu sehen, dass ähnlich wie ich auch andere Leute die Posts nicht genau genug lesen, aber bevor das hier wieder ausufert: die Lösung von Warf gaaaanz oben im 2. Post macht genau das.

cle
Beiträge: 30
Registriert: Mi 31. Jan 2018, 11:54
OS, Lazarus, FPC: Winux (L trunc FPC 3.3.1)
CPU-Target: 64Bit

Re: TSaveDialog Dateinamenerweiterung

Beitrag von cle »

Nein, die Option ändert die Dateiendung vielleicht beim Speichern automatisch, aber die Anzeige im Dialog bleibt gleich. Und genau diese Änderung will Bernd ja.

Antworten