Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Save-Dialog (https://www.delphipraxis.net/39894-save-dialog.html)

publes 8. Feb 2005 19:32


Save-Dialog
 
Mich beschäftigt gerade folgendes Problem....

procedure TForm1.Button1Click(Sender: TObject);
begin
GridzuExcel(stringGrid1, 'Meine Grid Daten', 'f:\daten.xls')
end;


GridzuExcel ist eine eigene Procedure die auch funzt.....

Arbeite ich nach obigem Schema klappt alles wunderbar, nur schaffe ich es einfach nicht einen
Save-Dialog mit einzuarbeiten.

SaveDialog1.Execute

ist mir klar..... aber wie geht's weiter???

Möchte durch den Save-Dialog flexibel sein, was den Speicherort und den Speichernamen angeht.

alcaeus 8. Feb 2005 19:34

Re: Save-Dialog
 
Hallo publes,

So:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
    GridzuExcel(stringGrid1, 'Meine Grid Daten', SaveDialog1.FileName)
end;
Execute ist eine Funktion, welche True zurueck liefert, falls auf "Speichern" geklickt wurde.

Greetz
alcaeus

publes 8. Feb 2005 19:56

Re: Save-Dialog
 
So richtig muss ich das jetzt nicht verstehen...oder?????

Bin halt ein Anfänger und gebe das auch zu!!!!

alcaeus 8. Feb 2005 19:57

Re: Save-Dialog
 
Zitat:

Zitat von publes
So richtig muss ich das jetzt nicht verstehen...oder?????

Was genau hast du nicht verstanden? Falls Execute true zurueckliefert (also der SaveDialog mit "Speichern" bestaetigt wurde), dann wird gespeichert. In SaveDialog1.FileName steht der ausgewaehlte DateiName. Weiteres sagt dir auch die Online-Hilfe

Greetz
alcaeus

weißer Zwerg 8. Feb 2005 20:45

Re: Save-Dialog
 
Hallo!

Ich hatte auch mit saveDialog einige Probleme. Aber mit einem Beispiel hat es dann geklappt!

Man macht sich zum Beispiel einen Button "Speichern". Dafür erstellt man ein Ereignis, dass dann auftritt, wenn der Button gedrückt wurde. Anschließend ruft man die Execute-Methode auf - dadurch erhält man das typische Dialog-Feld. Wenn der Anwender seine Eingabe gemacht hat (auf Speichern geklickt hat), gibt die Execute-Methode true zurück. Man kann nun die Datei an dem vorgegebenen Ort speichern (das Feld Filename von SaveDialog).

Delphi-Quellcode:
if (frmForm1.SaveDialog1.Execute = true) then
begin
  // hier könnte man selber speichern
end;
MfG wZ

publes 9. Feb 2005 10:11

Re: Save-Dialog
 
Super besten Dank............

Chegga 9. Feb 2005 10:40

Re: Save-Dialog
 
Hi,

@ publes:

Nächstes mal bitte den Delphi-Code Button verwenden.

Also aus:

procedure TForm1.Button1Click(Sender: TObject);
begin
GridzuExcel(stringGrid1, 'Meine Grid Daten', 'f:\daten.xls')
end;

wird:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
GridzuExcel(stringGrid1, 'Meine Grid Daten', 'f:\daten.xls')
end;
Thanks :zwinker:

Zitat:

Zitat von weißer Zwerg
Delphi-Quellcode:
if (frmForm1.SaveDialog1.Execute = true) then

Das ...Execute = true ist unnötig. :wink:
(Dann brauchst du auch keine Klammern.)

MfG Marc

Erwin Pälzig 12. Mär 2015 16:19

AW: Save-Dialog
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle zusammen.

Ich denke hier passt meine Frage ganz gut.
Es geht um die Eingabe von integer Werten für Variablen, welche anschließend in einem Textdokument abgespeichert werden.

Hier der Quellcode:
Delphi-Quellcode:
unit Unit17;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
    TForm17 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit5Change(Sender: TObject);
    procedure Edit4Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit6Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form17: TForm17;
  ts,Te,ER,RE,th, Di: integer;

implementation

{$R *.dfm}

procedure TForm17.Edit1Change(Sender: TObject);
begin
  Edit1.Text:=IntToStr(ts); //bei Programmstart wird jede Eingabe zu Null, da alle initierten Werte auf 0 gesetzt werden
end;

procedure TForm17.Edit2Change(Sender: TObject);
begin
 Edit2.Text:=IntToStr(Te); //bei Programmstart wird jede Eingabe zu Null, da alle initierten Werte auf 0 gesetzt werden
end;

procedure TForm17.Edit3Change(Sender: TObject);
begin
  Edit3.Text:=IntToStr(ER); //bei Programmstart wird jede Eingabe zu Null, da alle initierten Werte auf 0 gesetzt werden
end;

procedure TForm17.Edit4Change(Sender: TObject);
begin
 Edit4.Text:=IntToStr(RE); //bei Programmstart wird jede Eingabe zu Null, da alle initierten Werte auf 0 gesetzt werden
end;

procedure TForm17.Edit5Change(Sender: TObject);
begin
 Edit5.Text:=IntToStr(th); //bei Programmstart wird jede Eingabe zu Null, da alle initierten Werte auf 0 gesetzt werden
end;

procedure TForm17.Edit6Change(Sender: TObject);
begin
 Edit6.Text:=IntToStr(Di); //bei Programmstart wird jede Eingabe zu Null, da alle initierten Werte auf 0 gesetzt werden
end;


{******** Export Data ********}
procedure TForm17.Button1Click(Sender: TObject);
var
 textis : textfile;  //  -> lokale Initialisierung der zu Speichernden Parameter in textfile  (textis.txt existiert im Ornder in dem Programm ist)
 savepath : string; //  -> lokale Initialisierung des Speicherpfades
 SaveDialog1 :TSaveDialog; // -> ist Save dialog variable
begin

 if SaveDialog1.execute then // -> Darstellung des Dateiöffnungs Dialogs (Quelle www.Delphibasics.co.uk)
 begin
  savepath := SaveDialog1.Files[0]; // (?)
  assignfile(textis,savepath); // Versuch der Öffnung von textist aus Dateipfad savepath
  rewrite(textis); // -> Einschreiben der Daten in Textdokument textis
  writeln(textis, 'Time(s) Web Temperature(C) Evap Rate(g/m2s) Residual Solvent(%) Coat Thickness(m) Diffusivity(m2/s) ');
  write(textis, ts); // Einschreiben des ts
  write(textis,' '); // Einschreiben des Freizeischen
  write(textis,Te); // Einschreiben der Te
  write(textis,' '); // Einschreiben des Freizeischen
  write(textis,ER); // Einschreiben der ER
  write(textis,' '); // Einschreiben des Freizeischen
  write(textis,RE); // Einschreiben des RE
  write(textis,' '); // Einschreiben des Freizeischen
  write(textis,th); // Einschreiben der th
  write(textis,' '); // Einschreiben des Freizeischen
  write(textis,Di); // Einschreiben des Di
  write(textis,#13#10); // (?)1*  The "#13#10" part represents a carriage-return + line-feed combination. The "#13" is the ASCII equivalent to the CR (carriage return) value; #10 represents LF (line feed).
  end;
  closefile(textis); // -> Schließen des Textdokuments
end;
end.
Was ich verstehe, warum bei Eingabe von Werten in die Edit-Bereiche, die Werte auf 0 springen.
Die Frage ist, warum bei Betätigung des Buttons die folgende Fehlermeldung erscheint? (Siehe Anhang)

Vielen Dank für eure Unterstützung!

mkinzler 12. Mär 2015 16:23

AW: Save-Dialog
 
In welcher Zeile?

Erwin Pälzig 12. Mär 2015 16:26

AW: Save-Dialog
 
Zitat:

Zitat von mkinzler (Beitrag 1293248)
In welcher Zeile?

Hallo mkinzler.

Meldung kommt, wenn Code komplett compiliert wurde und danach Button1Click erfolgt.
Grüße.

mkinzler 12. Mär 2015 16:28

AW: Save-Dialog
 
Dann Setzte dort mal einen Breakpoint und führe dann Zeile für Zeile aus

DeddyH 12. Mär 2015 16:31

AW: Save-Dialog
 
Man muss den SaveDialog erst erzeugen, bevor man ihn benutzt.

mkinzler 12. Mär 2015 16:34

AW: Save-Dialog
 
Und dieser nicht als Komponente auf der Form liegt.

BadenPower 12. Mär 2015 16:35

AW: Save-Dialog
 
Ich sehe ein
Delphi-Quellcode:
SaveDialog1.execute
in der Button1Click-Procedure, aber kein
Delphi-Quellcode:
SaveDialog1: TSaveDialog;
in der Typdeklaration von "TForm17"


EDIT:
Schon wieder zu langsam

DeddyH 12. Mär 2015 16:38

AW: Save-Dialog
 
Markus, selbst wenn er auf der Form läge, würde er nicht angesprochen, sondern die lokale Variable ;)

BadenPower 12. Mär 2015 16:41

AW: Save-Dialog
 
Zitat:

Zitat von DeddyH (Beitrag 1293257)
Markus, selbst wenn er auf der Form läge, würde er nicht angesprochen, sondern die lokale Variable ;)

Richtig, hab ich aber auch übersehen, dass "SaveDialog1" in der Click-Prozedur deklariert ist.

mkinzler 12. Mär 2015 16:41

AW: Save-Dialog
 
Dann würde aber eine Instanz existieren, was hier scheinbar nicht der Fall ist.

Oha eine lokale Variable

Erwin Pälzig 12. Mär 2015 16:46

AW: Save-Dialog
 
Zitat:

Zitat von BadenPower (Beitrag 1293255)
Ich sehe ein
Delphi-Quellcode:
SaveDialog1.execute
in der Button1Click-Procedure, aber kein
Delphi-Quellcode:
SaveDialog1: TSaveDialog;
in der Typdeklaration von "TForm17"

EDIT:
Schon wieder zu langsam

Also fakt ist, im eigentlichen Programm, ist ebenfalls
Delphi-Quellcode:
type
SaveDialog1 :TSaveDialog;
initialisiert, nur es kommt zu folgende Fehlermeldung:
Unit17.pas(93): W1036 Variable 'SaveDialog1' ist möglicherweise nicht initialisiert worden

Danke für eure zahlreiche Hilfe!

DeddyH 12. Mär 2015 16:47

AW: Save-Dialog
 
Kommentier doch mal die lokale Variable aus.

himitsu 12. Mär 2015 17:24

AW: Save-Dialog
 
Zitat:

Zitat von Erwin Pälzig (Beitrag 1293249)
Zitat:

Zitat von mkinzler (Beitrag 1293248)
In welcher Zeile?

Meldung kommt, wenn Code komplett compiliert wurde und danach Button1Click erfolgt.

Darum gibt es den Debugger der zeigt z.B. in welcher Zeile es "knallt", bzw. man kann seinen Code Befehl für Befehl ausführen.

Du hast nur eine lokale Variable SaveDialog1, also mußt du entweder mit TSaveDialog.Create dafür eine Instanz erstellen,
oder den TOpenDialog auf die Form ziehen/legen (hier muß die lokale Variable natürlich weg).

Dann, sind die globalen Variablen sowas von schlecht.
Die gehören in das Private der Formklasse und dann sollten sie ordentliche Namen bekommen, damit man "leicht" erkennt was die eigentlich machen.

Kommentare sind schoin wichtig, aber "sinnlose" Kommentare behindern nur und man übersieht "wichtige" Kommentare.
Vorallem "Einschreiben des ts" und "Einschreiben des Freizeischen" sind extrem kontraproduktiv, denn genau das geschriebene sieht man sofort an den Befehlen.
Wenn einer ständig twittert "bin aufgestanten ... hab rechten Schuh angezogen ... hab linken Schuh angezogen ... mach die Tür auf ... geh auf's klo ... mach tür zu ... *kacken* ...." dann liest keiner mehr das "bin gestorben" .... 800 Zeilen später ... zwischen den 100 "bin am sterben"-Zeilen.

BadenPower 12. Mär 2015 17:36

AW: Save-Dialog
 
Zitat:

Zitat von Erwin Pälzig (Beitrag 1293263)
Also fakt ist, im eigentlichen Programm, ist ebenfalls
Delphi-Quellcode:
type
SaveDialog1 :TSaveDialog;
initialisiert, nur es kommt zu folgende Fehlermeldung:
Unit17.pas(93): W1036 Variable 'SaveDialog1' ist möglicherweise nicht initialisiert worden

Das ist "deklariert" und nicht "initialisiert";

Erwin Pälzig 12. Mär 2015 17:47

AW: Save-Dialog
 
Ok, Danke soweit.

Also habe nun eine einfachere Variante gefunden.

Delphi-Quellcode:
begin
  assignfile(textis,'textis.txt')
  rewrite(textis);
  ...
Falls die oberen Dialogausschnitte als nicht brauchbar escheinen, können sehr gerne die Moderatoren die letzteren Abschnitte löschen.
Danke für eure Hilfe.

BadenPower 12. Mär 2015 17:58

AW: Save-Dialog
 
Zitat:

Zitat von Erwin Pälzig (Beitrag 1293274)
Also habe nun eine einfachere Variante gefunden.

Jetzt hast Du Dir aber die Möglichkeit genommen den Speicherort und die Datei auszuwählen.

Du musst doch nur die Komponente TSaveDialog auf Dein Formular legen und vorher die unnötigen "SaveDialog1"-Variablen entfernen.


Poste noch einmal die ganze Unit, damit wir Dir zeigen können, was Du falsch gemacht hast.

himitsu 12. Mär 2015 18:06

AW: Save-Dialog
 
Zitat:

Zitat von BadenPower (Beitrag 1293277)
Jetzt hast Du Dir aber die Möglichkeit genommen den Speicherort und die Datei auszuwählen.

Noch schlimmer.

Relative Pfade sollte man grundsätzlich niemals verwenden, denn wo soll denn diese Datei denn nun liegen?
Und nein, es ist nicht das Programmverzeichnis ... wenn doch, dann ist es nur "zufällig" heute mal so.

Erwin Pälzig 13. Mär 2015 23:25

AW: Save-Dialog
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von BadenPower (Beitrag 1293277)
Zitat:

Zitat von Erwin Pälzig (Beitrag 1293274)
Also habe nun eine einfachere Variante gefunden.

Jetzt hast Du Dir aber die Möglichkeit genommen den Speicherort und die Datei auszuwählen.

Du musst doch nur die Komponente TSaveDialog auf Dein Formular legen und vorher die unnötigen "SaveDialog1"-Variablen entfernen.


Poste noch einmal die ganze Unit, damit wir Dir zeigen können, was Du falsch gemacht hast.

Hallo BadenPower,
Danke für deinen Hinweis.

Delphi-Quellcode:
unit Unit17;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;//Dialogs;

type
    TForm17 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit5Change(Sender: TObject);
    procedure Edit4Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit6Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form17: TForm17;
  ts,Te,ER,Re,th, Di: integer;

implementation

{$R *.dfm}

procedure TForm17.Edit1Change(Sender: TObject);
begin
  Edit1.Text:=IntToStr(ts);
end;

procedure TForm17.Edit2Change(Sender: TObject);
begin
 Edit2.Text:=IntToStr(Te);
end;

procedure TForm17.Edit3Change(Sender: TObject);
begin
 Edit3.Text:=IntToStr(ER);
end;

procedure TForm17.Edit4Change(Sender: TObject);
begin
 Edit4.Text:=IntToStr(RE);
end;

procedure TForm17.Edit5Change(Sender: TObject);
begin
 Edit5.Text:=IntToStr(th);
end;

procedure TForm17.Edit6Change(Sender: TObject);
begin
 Edit6.Text:=IntToStr(Di);
end;


{******** Export Data ********}
procedure TForm17.Button1Click(Sender: TObject);
var
 textis : textfile;  //  -> (textis.txt existiert im Ornder in dem Programm ist)
 savepath : string;
begin
 if SaveDialog1.execute=true then
  begin
   //assignfile(textis,'textis.txt');
   assignfile(textis,savepath);
   rewrite(textis);
   writeln(textis, 'Ts(s) WT(C) ERate(g/m2s) RS(%) CThick(m) Dif(m2/s) ');
   write(textis, ts);
   write(textis,' ');
   write(textis,Te);
   write(textis,' ');
   write(textis,ER);
   write(textis,' ');
   write(textis,RE);
   write(textis,' ');
   write(textis,th);
   write(textis,' ');
   write(textis,Di);
   write(textis,#13#10);
  end;
  closefile(textis);
end;
end.
Nun kann ich den Speicherort festlegen und Datei auswählen, jedoch kommt es zu einer Fehlermeldung. (Siehe Anhang)
Vielen dank für deine Hilfe.

Grüße

Sir Rufo 13. Mär 2015 23:34

AW: Save-Dialog
 
Ist dein Internet kaputt oder warum suchst du nicht mal nach der Fehlernummer? Dazu gibt es sogar mind. einen Beitrag hier im Forum.

Und der Debugger würde dir hier auch helfen ... und eine Angabe, an welcher Stelle der Fehler kommt wäre auch sehr nett gewesen.

Dalai 13. Mär 2015 23:45

AW: Save-Dialog
 
Ich empfehle dringend, mal mit dem Debugger durch den Code zu steppen (F7 und F8) und dabei ein Auge auf die Inhalte der Variablen zu haben. Dann fällt auch gleich auf, dass die ersten Zeilen der Methode Button1Click so niemals funktionieren können.

MfG Dalai

p80286 14. Mär 2015 09:08

AW: Save-Dialog
 
Nun sagt ihm schon, daß er mit
Delphi-Quellcode:
savepath:=savedialog1.filename;
weiter kommt.

Wie wenn nicht so, soll denn der ausgewählte Dateiname an
Delphi-Quellcode:
assign
weiter gereicht werden?
(multichoice und filenamelist ignorieren wir jetzt mal)

übrigens könntest Du das auch etwas verkürzen
Delphi-Quellcode:
textis : textfile; // -> (textis.txt existiert im Ornder in dem Programm ist)
  savefile : string;
  satz : string;
begin
  if SaveDialog1.execute=true then
  begin
    savefile:=Savedialog1.Filename;
    assignfile(textis,savefile);
    rewrite(textis);
    writeln(textis, 'Ts(s) WT(C) ERate(g/m2s) RS(%) CThick(m) Dif(m2/s) ');
    satz:=inttostr(ts)+' '+inttostr(te)+' '+inttostr(er)+' '+inttostr(re)+' '+inttostr(th)+' '+inttostr(di);
    writeln(textis,satz);
    closefile(textis);
  end;
oder noch knapper:
Delphi-Quellcode:
    assignfile(textis,savefile);
    rewrite(textis);
    writeln(textis, 'Ts(s) WT(C) ERate(g/m2s) RS(%) CThick(m) Dif(m2/s) ');
    writeln(format('%d %d %d %d %d %d',[ts,te,er,re,th,di]));
    closefile(textis);
Das ist übrigens kein Grund sich nicht mit dem Debugger auseinander zu setzen.

Gruß
K-H

himitsu 14. Mär 2015 12:15

AW: Save-Dialog
 
Delphi-Quellcode:
writeln(textis, format(...
, sonst heult gleich wieder jemand.

p80286 15. Mär 2015 00:07

AW: Save-Dialog
 
:oops:
geschlampt

K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr.

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