Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TOpenDialog, Datei mit gewählter Extension speichern (https://www.delphipraxis.net/33260-topendialog-datei-mit-gewaehlter-extension-speichern.html)

Thomas78 4. Nov 2004 06:57


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

Bernhard Geyer 4. Nov 2004 07:26

Re: TOpenDialog, Datei mit gewählter Extension speichern
 
Zitat:

Zitat von Thomas78
Hat jemand nen Ansatz :?:

Setz das Property Default-Extension. Dann hat die Datei AFAIK immer eine Extension.

Stevie 4. Nov 2004 10:58

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;

Thomas78 5. Nov 2004 07:59

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?

Stevie 5. Nov 2004 08:08

Re: TOpenDialog, Datei mit gewählter Extension speichern
 
Hallo Thomas,
Zitat:

Zitat von Thomas78
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.

So meinte ich das nicht. Es gibt Fälle, wo für einen Filter mehrere Erweiterungen angeboten werden (z.B. *.jpg; *.jpeg) und dann würde meine Lösung nicht funzen!
Zitat:

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.
Such mal in der Code-Lib nach der Funktion Explode, ich meine, die wird die beim String-Zerlegen helfen.

MfG
Stevie

TeronG 5. Nov 2004 09:28

Re: TOpenDialog, Datei mit gewählter Extension speichern
 
Keine Ahnung ob ich dich richtig verstanden habe aber evtl. hilft dir Delphi-Referenz durchsuchenExtractFileExt bzw. Delphi-Referenz durchsuchenChangeFileExt weiter.

Stevie 5. Nov 2004 09:31

Re: TOpenDialog, Datei mit gewählter Extension speichern
 
Zitat:

Zitat von TeronG
Keine Ahnung ob ich dich richtig verstanden habe aber evtl. hilft dir Delphi-Referenz durchsuchenExtractFileExt bzw. Delphi-Referenz durchsuchenChangeFileExt weiter.

Guck mal, was im dritten Post von oben steht. :zwinker:

TeronG 5. Nov 2004 09:37

Re: TOpenDialog, Datei mit gewählter Extension speichern
 
:oops: uuppsss sorry Asche auf mein Haupt :pale:
also DOCH erst lesen dann schreiben . :roll:

Thomas78 5. Nov 2004 12:13

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:
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.
Deine Funktion greift aber auch auf den FilterIndex zurück, welcher ja vom Dialog nicht verändert wird.

Guck mal bitte drüber... Danke.

Thomas

Stevie 5. Nov 2004 12:22

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 12:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz