Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi SaveDialog auswerten? (https://www.delphipraxis.net/52805-savedialog-auswerten.html)

smart 4. Sep 2005 11:55


SaveDialog auswerten?
 
Wenn man mit
Delphi-Quellcode:
SaveDialog.Filter := 'Text- Dateien (*.txt)|*.txt|CSV- Dateien (*.csv)|*.csv';
2 Filter gesetzt hat, wie kann man nun auswerten welches Filter der Anwender geklickt hat?

Christian Seehase 4. Sep 2005 12:04

Re: SaveDialog auswerten?
 
Moin Smart,

schau Dir mal TSaveDialog.FilterIndex an.

smart 4. Sep 2005 12:12

Re: SaveDialog auswerten?
 
Zitat:

Zitat von Christian Seehase
Moin Smart,

schau Dir mal TSaveDialog.FilterIndex an.

Habe ich schon mit
Delphi-Quellcode:
If SaveDialog.FilterIndex = 2 Then SaveDialog.Filename := 'Namenlos.csv';
If SaveDialog.FilterIndex = 1 Then SaveDialog.Filename := 'Namenlos.txt';
Bzw:
Delphi-Quellcode:
If SaveDialog.FilterIndex = 1 Then SaveDialog.Filename := 'Namenlos.csv';
If SaveDialog.FilterIndex = 0 Then SaveDialog.Filename := 'Namenlos.txt'
versucht, klappt aber nicht. Was mache ich da falsch?.

Christian Seehase 4. Sep 2005 12:27

Re: SaveDialog auswerten?
 
Moin Smart,

die Indizes beginnen bei 1.
An welcher Stelle fragst Du dass denn ab?

Ggf. könnte auch das Ereignis OnTypeChange für Dich von Interesse sein.

smart 4. Sep 2005 12:36

Re: SaveDialog auswerten?
 
Zitat:

Zitat von Christian Seehase
Moin Smart,

die Indizes beginnen bei 1.
An welcher Stelle fragst Du dass denn ab?

An diese:
Delphi-Quellcode:
SaveDialog1.Title := 'Exportieren';
SaveDialog1.Filter := 'Text- Dateien (*.txt)|*.txt|CSV- Dateien (*.csv)|*.csv';
//  Abfrage
If SaveDialog1.FilterIndex = 2 Then SaveDialog1.Filename := 'Namenlos.csv';
If SaveDialog1.FilterIndex = 1 Then SaveDialog1.Filename := 'Namenlos.txt';
if SaveDialog1.Execute then
  Memo1.Lines.SaveToFile(Form1.SaveDialog1.Filename);
Du meinst in der OnTypeChange die Abfrage setzen, oder?

marabu 4. Sep 2005 12:57

Re: SaveDialog auswerten?
 
Hi smart,

normalerweise interessiert dich der Index gar nicht, da er vom common dialog berücksichtigt wird - die Endung wird korrekt beigesteuert, falls du sie bei der Eingabe des Dateinamens vergessen hast:

Delphi-Quellcode:
procedure TDemoForm.SaveButtonClick(Sender: TObject);
begin
  with SaveDialog do begin
    FilterIndex := 1;
    if Execute then
      ShowMessage(Format('(%d) %s', [FilterIndex, FileName]));
  end;
end;
In deinem Beispiel ist die FilterIndex-Abfrage eigentlich überflüssig...

Grüße vom marabu

SirThornberry 4. Sep 2005 13:10

Re: SaveDialog auswerten?
 
wenn du wissen willst welchen Filter der nutzer gewählt hat solltest du die Abfrage dementsprechend auch nach dem SaveDialog1.Execute machen.

Christian Seehase 4. Sep 2005 13:25

Re: SaveDialog auswerten?
 
Moin Marabu,

Zitat:

Zitat von marabu
die Endung wird korrekt beigesteuert, falls du sie bei der Eingabe des Dateinamens vergessen hast:

nein, wird sie nicht. ;-)
(ich habe das eben noch einmal ausprobiert)
Ggf. wird in dem Falle nur die DefaultExt angehängt.

marabu 4. Sep 2005 13:34

Re: SaveDialog auswerten?
 
Hi Chris,

wir machen da gänzlich verschiedene Erfahrungen. Mein Beispiel-Code, ergänzt um die Initialisierung, tut genau das, was ich beschrieben habe.

Delphi-Quellcode:
procedure TDemoForm.FormCreate(Sender: TObject);
begin
  SaveDialog.Filter := 'Alle Dateien (*.*)|*.*'
    + '|Text-Dateien (*.txt)|*.txt'
    + '|CSV-Dateien (*.csv)|*.csv';
end;
Ratlose Grüße vom marabu

marabu 4. Sep 2005 13:47

Re: SaveDialog auswerten?
 
Zitat:

Zitat von SirThornberry
wenn du wissen willst welchen Filter der nutzer gewählt hat solltest du die Abfrage dementsprechend auch nach dem SaveDialog1.Execute machen.

Ach du Schreck, smart will den Filename initialisieren!?

Wenn das so ist, dann würde ich das so machen:

Delphi-Quellcode:
SaveDialog.FileName := 'Namenlos';
Alles andere macht ja der common dialog. Wenn man die Erweiterung vorgibt, dann schaltet man den internen Mechanismus aus. Bei vorhandenem .txt wird diese Erweiterung verwendet, auch wenn der User per FilterIndex .csv ausgewählt hat.

marabu

Christian Seehase 4. Sep 2005 13:51

Re: SaveDialog auswerten?
 
Moin Marabu,

:gruebel:

also ich habe jetzt einmal ganz von Vorne begonnen.
Ein TSaveDialog, ein Button und Deine beiden Routinen (Copy&Paste)
Als "Kirsche auf der Sahne" habe ich dann auch noch Deine Benennungen übernommen. ;-)

Programmstart (F9)

Als erstes bin ich dann in C:\temp gegangen, und habe als Dateinamen test3 eingegeben, sowie den Filter für Text-Dateien ausgewählt.
ShowMessage liefert mir:

---------------------------
Project2
---------------------------
(2) C:\temp\test3
---------------------------
OK
---------------------------

bei dem anderen Filter sieht es dann, abgesehen von der (3) dann genauso aus.

Und das, wo wir auch noch beide mit D7 arbeiten :?


[EDIT]
Zitat:

Zitat von marabu
dann schaltet man den internen Mechanismus aus. Bei vorhandenem .txt wird diese Erweiterung verwendet, auch wenn der User per FilterIndex .csv ausgewählt hat.

Im Allgemeinen aber nur dann, wenn eine bereits im System registrierte Erweiterung vorgegeben wird.
[/EDIT]

marabu 4. Sep 2005 14:32

Re: SaveDialog auswerten?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Chris,

habe mir eben meine letzten Haare ausgerissen und ein wenig auf den Nägeln gekaut, aber die Ausgabe meines Programmes bestätigt mir meine Erfahrungen. Hier mein Code. Die Auflösung des Rätsels würde mich interessieren.

Freundliche Grüße vom marabu


Sorry Heike, aber das fällt doch noch nicht unter thread hijacking - oder?

Christian Seehase 4. Sep 2005 14:51

Re: SaveDialog auswerten?
 
Moin Marabu,

Du hast geschummelt ;-)

Ursprünglich fehlte die Zuweisung an TSaveDialog.Filename (siehe oben).
Ist beim Aufruf von SaveDialog Filename nicht leer, funktioniert es mit der Endung.
Sobald man aber "vergisst" einen Wert vorzugeben, oder das eventuell auch nicht will klappt es nicht mehr.
Wenn kein Filter ausgewählt wird (Alle Dateien bleibt stehen) erhält man sogar einen ungültigen Dateinamen (Endung: .*.txt)

marabu 4. Sep 2005 15:24

Re: SaveDialog auswerten?
 
Hi Chris,

ich habe nicht bewusst geschummelt, sondern nur versucht die Intention von smart umzusetzen. Letzten Endes wollte ich nur auf die internen Funktionen hinweisen.
Mit allem, was dieser thread jetzt an Informationen enthält, sollte smart in der Lage sein ein bombensicheres und benutzerfreundliches Save-Command für ihr Projekt zu basteln.

Zufriedene Grüße vom marabu

smart 6. Sep 2005 08:39

Re: SaveDialog auswerten?
 
Vielen Dank für Eure umfangreiche Hilfe. Ich hatte gedacht, dass man den Dateiname mit Endung in der Dialogbox sehen könnte. Das scheint wohl nicht zu gehen.:-(
Vielen Dank nochmal.

smart 6. Sep 2005 10:38

Re: SaveDialog auswerten?
 
Also, irgendwie bin ich zu dumm dafür. Habe jetzt den Code auf meine Verhältnisse angepasst. Klapp aber nicht. Die Endungen werden nicht hinzugefügt.
Delphi-Quellcode:
SaveDialog1.Title := 'Exportieren';
SaveDialog1.Filter := 'Alle Dateien (*.*)|*.*'
    + '|Text-Dateien (*.txt)|*.txt'
    + '|CSV-Dateien (*.csv)|*.csv';
  with SaveDialog1 do begin
    FilterIndex := 1;
    FileName := 'NamenLos';
    if Execute then
      Memo1.Lines.SaveToFile(FileName);
  end;
Es wird immer nur NamenLos gespeichert. Was mache ich da falsch? Hat Einer von Euch einen Tipp?

marabu 6. Sep 2005 10:55

Re: SaveDialog auswerten?
 
Hast du denn den FilterIndex interaktiv verändert? Bleibt er auf 1 stehen, dann wird natürlich keine Endung beigesteuert.

Grüße vom marabu

smart 6. Sep 2005 11:20

Re: SaveDialog auswerten?
 
Zitat:

Zitat von marabu
Hast du denn den FilterIndex interaktiv verändert? Bleibt er auf 1 stehen, dann wird natürlich keine Endung beigesteuert.
Grüße vom marabu

Ja klar. Klappt aber nicht. Ich habe es mal mit Delphi 2005 versucht. Gleicher Fehler. Der Fehler muss am Code liegen.

marabu 6. Sep 2005 12:01

Re: SaveDialog auswerten?
 
Delphi-Quellcode:
begin
  SaveDialog1.Title := 'Exportieren';
  SaveDialog1.Filter := 'Alle Dateien (*.*)|*.*'
    + '|Text-Dateien (*.txt)|*.txt'
    + '|CSV-Dateien (*.csv)|*.csv';
  with SaveDialog1 do begin
    FilterIndex := 1;
    FileName := 'NamenLos';
    DefaultExt := 'txt'; // schau mal hier
    if Execute then
      Memo1.Lines.SaveToFile(FileName);
  end;
end;
Nu geht das...

marabu

smart 6. Sep 2005 12:35

Re: SaveDialog auswerten?
 
Das hätte ich mir auch nie träumen lassen, dass man an so ein dummen SaveDialog Stunden verbringen kann. Hab vielen Dank @marabu, für die Hilfe.

neptuntriton 21. Mär 2011 16:03

AW: SaveDialog auswerten?
 
Also das ist ein Bug in der Implementierung.

Ich hab mir mit einem WorkAround geholfen. Ich Hänge eine Prozedur in dass OnTypeChange Event des Dialogs ein. Zu diesem Zeitpunkt stimmt der Index nämlich noch. Dann merke ich mir den Index indem ich ihn in "den" Tag befördere.

siehe Quellcode

Delphi-Quellcode:

// zunächst der Handler er speichert den echten Index einfach in der Tag Variablen zwischen
procedure TMainGUI.ReactOnTypeChange(Sender: TObject);
begin
  if Sender is TFileSaveDialog then begin
    TFileSaveDialog(Sender).Tag := TFileSaveDialog(Sender).FileTypeIndex;
  end;
end;


procedure TMainGUI.Messdatenspeichern1Click(Sender: TObject);
var
  LocSaveDialog : TFileSaveDialog;
  AFileTypeItem : TFileTypeItem;
begin
  LocSaveDialog        := TFileSaveDialog.Create(Self);
  with LocSaveDialog do begin
    OnTypeChange := ReactOnTypeChange;

    AFileTypeItem := FileTypes.Add;
    with AFileTypeItem do begin
      DisplayName := 'OpenDocumentSpreadSheet';
      FileMask   := '*.ods';
    end;

    AFileTypeItem := FileTypes.Add;
    with AFileTypeItem do begin
      DisplayName := 'CommaSeparatedValue';
      FileMask   := '*.csv';
    end;

    if Execute then begin
      // Old Code
      // case FileTypeIndex of
      // New Code
      case LocSaveDialog.Tag of
      1 : begin
         ...
         end;
      2 : begin
         ...
         end;
      end;
    end;
  end;
end;
Hack the planet

Neppi


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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