![]() |
TOpenDialog, Datei mit gewählter Extension speichern
Hallo Leute,
habe ein Problem mit SaveDialog. Ich möchte die ausgewählte Extension an den Dateinamen anhängen, wenn der eingegebene Dateiname keine Erweiterung hat. z.B.: *.csv *.txt *.xlc als Auswahl wurde jetzt der Dateiname 'test' eingegeben und in der Combobox *.txt gewählt, so soll die Datei auch als test.txt gespeichert werden. Ich bekomme aber nicht raus, was für ne Extension gewählt wurde. FilterIndex wird ja nur beim Öffnen des Dialogs ausgelesen. Hat jemand nen Ansatz :?: MfG Thomas |
Re: TOpenDialog, Datei mit gewählter Extension speichern
Zitat:
|
Re: TOpenDialog, Datei mit gewählter Extension speichern
Wenn du als Filter immer nur eine Datei-Endung angegeben hast, dann funktioniert folgendes:
Delphi-Quellcode:
function GetExtension(const Filter: string; const Index: Integer): string;
var List: TStrings; begin Result := ''; List := TStringList.Create; try List.Delimiter := '|'; List.DelimitedText := Filter; Result := ExtractFileExt(List[Pred(Index*2)]); finally FreeAndNil(List); end; end; procedure TForm1.Button1Click(Sender: TObject); begin if SaveDialog1.Execute then ShowMessage(ChangeFileExt(SaveDialog1.FileName, GetExtension(SaveDialog1.Filter, SaveDialog1.FilterIndex))); end; |
Re: TOpenDialog, Datei mit gewählter Extension speichern
Hallo Stevie
danke für deinen Tip, aber ich habe ja mehrere Dateiendungen zur Auswahl (*.csv *.txt *.xlc). Die ausgewählte Extension (z.B.: *.xlc) will ich dann erkennen. Bei einigen Anwendungen wird sogar zur Laufzeit des Dialoges sofort die Extension an den eingegebenen Dateinamen angehangen, wenn man eine Endung auswählt. Fazit: Die Variante mit der DefaultExt ist für meine Anwendung unbrauchbar. Deine Lösung macht ja im Prinzip das selbe, sie gibt auch nur die 1.Extension (der auswählbaren) zurück. Ich denke jedenfalls, dass es so funktionieren soll, denn ich hab Delphi5Prof. und da musste ich die Trennung des Filter-Strings manuell vornehmen. Meine Variante von TStringList unterstützt "Delimiter" und "DelimitedText" noch nicht. Gibts andere Lösungsvorschläge für mein Problem? |
Re: TOpenDialog, Datei mit gewählter Extension speichern
Hallo Thomas,
Zitat:
Zitat:
MfG Stevie |
Re: TOpenDialog, Datei mit gewählter Extension speichern
Keine Ahnung ob ich dich richtig verstanden habe aber evtl. hilft dir
![]() ![]() |
Re: TOpenDialog, Datei mit gewählter Extension speichern
Zitat:
|
Re: TOpenDialog, Datei mit gewählter Extension speichern
:oops: uuppsss sorry Asche auf mein Haupt :pale:
also DOCH erst lesen dann schreiben . :roll: |
Re: TOpenDialog, Datei mit gewählter Extension speichern
So Stevie
habs nochma mit deiner Variante und der Explode-Funktion probiert. Es wird bei mir definitiv immer nur die erste mögliche Extension angehangen. Ich schicke hier mal den Code, damit wir den gleichen Stand haben:
Delphi-Quellcode:
Deine Funktion greift aber auch auf den FilterIndex zurück, welcher ja vom Dialog nicht verändert wird.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, AgOpenDialog, StdCtrls; type TStringDynArray = array of string; type TForm1 = class(TForm) Button1: TButton; AgSaveDialog1: TAgSaveDialog; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } function GetExtension(Filter: string; const Index: Integer): string; function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; end; var Form1: TForm1; implementation {$R *.DFM} function TForm1.Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; var SepLen: Integer; F, P: PChar; ALen, Index: Integer; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); ALen := Limit; SetLength(Result, ALen); Index := 0; P := PChar(S); while P^ <> #0 do begin F := P; P := AnsiStrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); if Index >= ALen then begin Inc(ALen, 5); SetLength(Result, ALen); end; SetString(Result[Index], F, P - F); Inc(Index); if P^ <> #0 then Inc(P, SepLen); end; if Index < ALen then SetLength(Result, Index); end; function TForm1.GetExtension(Filter: string; const Index: Integer): string; var List: TStrings; i:integer; Teile: TStringDynArray; begin Result := ''; List := TStringList.Create; try Teile:=Explode('|', Filter); for i:=0 to Length(Teile)-1 do List.Add(Teile[i]); Result := ExtractFileExt(List[Pred(Index*2)]); finally FreeAndNil(List); end; end; procedure TForm1.Button1Click(Sender: TObject); begin AGSaveDialog1.Filter:='Text-Dateien (*.txt)|*.TXT|Excel-Dateien (*.xls)|*.XLS|dBase-Dateien (*.dbf)|*.DBF|Bitmap-Dateien (*.bmp)|*.BMP|Meta-Dateien (*.wmf)|*.WMF'; if AgSaveDialog1.Execute then ShowMessage(ChangeFileExt(AgSaveDialog1.FileName, GetExtension(AgSaveDialog1.Filter, AgSaveDialog1.FilterIndex))); end; end. Guck mal bitte drüber... Danke. Thomas |
Re: TOpenDialog, Datei mit gewählter Extension speichern
Bei mir klappt's, allerdings benutzte ich nicht diesen TAgSaveDialog, sondern TSaveDialog!
Das - so vermute ich - ist dein Problem... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz