Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Speichern wen Text verändert wurde


Delete - Sa 13.03.10 01:10
Titel: Speichern wen Text verändert wurde
Hallo
Ich hab es jetzt hinbekommen das beim Schließen abgefragt wird ob man Speichern will oder nicht, allerdings kommt das immer. Ich will wen beim Synedit Text was geändert wurde das es dann kommt. Ist das möglich?
lg


elundril - Sa 13.03.10 02:07

Hallo,

jede dieser großen Textkomponenten (RichEdit, Memo, SynEdit usw) haben die Eigenschaft Modified. Also mit


Delphi-Quelltext
1:
2:
  if SynEdit.Modified then
    //was auch immer


kannst du abfragen ob der Text verändert wurde (Beim speichern natürlich immer Modified auf false setzen, sonst bringts ja nix. ;))

lg elundril


Delete - Sa 13.03.10 03:43

Ich Benutze jezt diesen Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if SynEdit1.Modified then

if saveDialog1.Execute

  then ShowMessage('Datei gespeichert unter : '+saveDialog1.FileName)
  else ShowMessage('Speichern nicht erfolgreich');


Sobald in Synedit was geändert wurde, und ich Beenden will kommt zwar der Speicher Dialog und die Message das Erfolgreich gespeichert wurde, aber es Speichert nichts ab.
Lg


Xentar - Sa 13.03.10 04:14

Du solltst vielleicht auch was speichern, statt einfach nur die Meldung anzuzeigen..

Edit:
Ich kenn die Komponente nicht, aber sowas wie SynEdit.SaveToFile oder SynEdit.Lines.SaveToFile oder so gibt es bestimmt...


Delete - Sa 13.03.10 04:39

Könnt ihr mir pls diesen Code verbessern?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var Dateiname : string;
begin
if SynEdit1.Modified then
Dateiname := SaveDialog1.FileName;
    SynEdit1.Lines.SaveToFile(Dateiname);
if saveDialog1.Execute

  then ShowMessage('Datei gespeichert unter : '+saveDialog1.FileName)
  else ShowMessage('Speichern nicht erfolgreich');

Ich check es nimmer :(
Da kommt immer eine Fehler meldung das der angegebene Pfad nicht gefunden werden kann


jfheins - Sa 13.03.10 08:24

Es ist eben nur fast sinnvoll erst zu speichern (.SaveToFile) und dann erst abzufragen, wohin gespeichert werden soll (.execute)

Btw.: Wenn du mal suchst, findest du ganz bestimmt Beispiele für den korrekten Gebrauch von dem Savedialog.


ALF - Sa 13.03.10 09:48

hi, versuchs mal so!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if SynEdit1.Modified then
begin
  if MessageDlg('Daten wurden geändert...! Speichern ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
     SynEdit1.SaveToFile(Dateiname);//wobei der Dateiname und Ort vom laden in synedit bekannt sein sollte!
 
  SynEdit1.Modified := false;

end;


Wobei man dies auch zum zwischenspeichern nehmen kann! (eigene Procedure)

Gruss ALf


ffgorcky - Sa 13.03.10 11:01

Also ich denke mal, dass es so in etwa gehen müsste:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var Dateiname : string;
begin
if SynEdit1.Modified then
   begin
   if MessageDlg('Sie haben etwas geändert'+#13#10+' - also dies Datei neu abspeichern ?', mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
       if SaveDialog1.execute then
           begin
           Dateiname := SaveDialog1.FileName;
           SynEdit1.Lines.SaveToFile(Dateiname);
           ShowMessage('Datei gespeichert unter : '+saveDialog1.FileName);
           end
       else
           ShowMessage('Speichern wegen Abbruch nicht erfolgreich');     
   end;
end;


Edit:
Du könntest dann auch in Deinen else-Zweig noch ein Action:=caNone; mit einfügen, wenn Du nicht möchtest, dass sich das Programm dann so einfach schließt, wenn man den Speichern-Dialog einfach so abgebrochen hat. Dann müsstest Du die beiden Befehle aber natürlich in begin und end; einrahmen.


Delete - Sa 13.03.10 12:40

Oke das hier ist jetzt mein Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var Dateiname: string;
begin
  if SynEdit1.Modified then
  if MessageDlg('Daten wurden geändert...! Speichern ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  else
    SynEdit1.Lines.SaveToFile(Dateiname);

  SynEdit1.Modified := false;

   end;

Wenn ich auf Beenden geh kommt nichts nur wen was verändert ist.
Aber wen ich dan auf ja klicken will kommt immer:
Das System kann den angegebenen Dateipfad nicht finden.
Wie mach ich es das dan das Speichern unter Feld kommt?
lg


platzwart - Sa 13.03.10 12:42

Das geht mit SaveDialog1.execute ...


ALF - Sa 13.03.10 12:47

schau mal was ich geschrieben habe!!!!
Zitat:
//wobei der Dateiname und Ort vom laden in synedit bekannt sein sollte!


und Du löschtst den Dateiename in

Delphi-Quelltext
1:
2:
3:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var Dateiname: string;
begin

was soll man dazu sagen!

oder schau dir das von user profile iconffgorcky an!
Gruss Alf


Delete - Sa 13.03.10 13:03

Wen ich das von user profile iconffgorcky nimm kommt beim Compilieren immer
[Error] es.pas(8522): Too many actual parameters
[Error] es.pas(8533): Statement expected but 'PROCEDURE' found
[Fatal Error] helper.dpr(272): Could not compile used unit 'es.pas'


ALF - Sa 13.03.10 13:12

Das kommt von c+p :evil:
ohne zu lesen und zu verstehen
schau dir den Dialog an!!


Blackheart666 - Sa 13.03.10 13:23

Wie man an diesem und den anderen Threads von Meier1990 sieht fehlem ihm sämtliche Grundlagen.
Meist haben sich aber Mitglieder gefunden die ihm Copy & Paste Code zur Verfügung stellen.
Am besten würde helfen nur Stichworte in den Raum zu stellen, das würde dafür sorgen mal die Delphi Hilfe zu benutzen und Eigeninitiative zu zeigen.
Mein Rat an Meier1990, entweder Grundlagen lernen oder ein anderes Hobby zulegen.


Delete - Sa 13.03.10 16:23

Anders Hobby suchen hmm Nö
Grundlagen Lernen no time leider
aber ich habs geschafft geht alles


bole - Sa 13.03.10 16:35

ich denke Du würdest sogar Zeit sparen wenn Du erst die Grundlagen lernst. Deine Programme wären in einem Bruchteil der Zeit fertig!


Delete - Sa 13.03.10 16:40

Ja vllt stimmts auch.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var Dateiname : string;
    ClickedBtn: Word;
begin
if SynEdit1.Modified then
   begin
    ClickedBtn := MessageDlg('Wollen sie ihr Script Speichern?', mtConfirmation, [mbAbort, mbYes, mbNo], 0);
  if ClickedBtn = id_yes then
       if SaveDialog1.execute then
           begin
           Dateiname := SaveDialog1.FileName;
           SynEdit1.Lines.SaveToFile(Dateiname);
           ShowMessage('Datei gespeichert unter : '+saveDialog1.FileName);
           end
       else
           ShowMessage('Speichern wegen Abbruch nicht erfolgreich');
           end
           if ClickedBtn := id_abort then
           begin
           Form11.ShowModal;
           end;


Wieso geht der Abort Button nicht?
Lg


ALF - Sa 13.03.10 16:43

Antort:
Keine Zeit um Grundlagen zu lernen, lesen und verstehen
würde ja sonst gern helfen :rofl:
Gruss Alf


ffgorcky - Mi 24.03.10 21:37

Wenn Du Dein Programm weiter laufen lassen möchtest, wenn Du den Abort-Button gedrückt hast, dann müsstest Du das doch nur entsprechend abfragen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  
if SaveDialog1.execute then
       if ClickedBtn = id_yes then
           begin
           Dateiname := SaveDialog1.FileName;
           SynEdit1.Lines.SaveToFile(Dateiname);
           ShowMessage('Datei gespeichert unter : '+saveDialog1.FileName);
           end
       else if ClickedBtn = id_no then
           begin
           ShowMessage('Sie wollten wohl doch nicht speichern...');
           end
       else if ClickedBtn := id_abort then
           begin
           Form11.ShowModal;
           end;
denke mal, dass [us]ALF[/us] dass so gesagt hat, weil Du in Deiner IF-Abfrage Deine begin und end nicht richtig gesetzt hast.
Vor dem ShowMessage('Speichern wegen Abbruch nicht erfolgreich');
fehlt meiner Ansicht nach bei Deinem Quelltext noch ein begin.
---------------------------------------------------------------------------------------------------------------------------------------------
Wobei ich jetzt so gerade überlege, dass bei einem abort doch Der SaveDialog nicht als executed gilt - oder irre ich da jetzt?

PS: user profile iconALF, ich hoffe mal, dass er diese Frage jetzt durchs selbst in Bücher einlesen sowieso schon beantworten konnte, weil wir ihn so eine Zeit da jetzt "im Stich gelassen" haben - aber das Thema ist ja immer noch offen...