Entwickler-Ecke
Dateizugriff - Problem mit Dialog Speichern: Ja, Nein, Abbrechen
Mr.Retsim - So 27.02.11 03:25
Titel: Problem mit Dialog Speichern: Ja, Nein, Abbrechen
Hallo allerseits,
Ich schreibe grade ein Paintprogramm in Delphi, nun habe ich aber ein kleines Problem und ich blicke da einfach nicht durch, so simpel es auch zu sein scheint...
Wenn man auf "Neues Blatt" klickt, dann öffnet sich ein Dialog der nachfragt ob das Bild gespeichert werden soll: Ja Nein Abbrechen
Hier der Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.BtNeuClick(Sender: TObject); begin if MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbyes, mbno, mbcancel], 0) = mrYes then begin If Savepicturedialog.execute then begin Bmp1.SaveToFile(SavePictureDialog.FileName); end
else if MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbyes, mbno, mbcancel], 0) =mrNo then
begin Bmp1.Canvas.Brush.Color:=clWhite; Bmp1.Canvas.FillRect(Rect(0,0,Bmp1.Width,Bmp1.Height)); Paintbox1.Invalidate; Bmp1.Canvas.Brush.Color:=Farbe; end; end; end; |
Nun das Problem: Die Abfrage funktioniert einwandfrei, wenn ich auf Ja klicke, läuft alles gut, sobald ich aber auf Nein klicke passiert nichts...
Irgendwie schaffe ich es nicht die beiden Events zu vernüpfen
Vielen Dank im Voraus für eure Hilfe!!!
MfG
Mr.Retsim
Bergmann89 - So 27.02.11 07:32
Hey,
meinst du in etwa so?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| procedure TForm1.BtNeuClick(Sender: TObject);
procedure ClearImage; begin Bmp1.Canvas.Brush.Color:=clWhite; Bmp1.Canvas.FillRect(Rect(0,0,Bmp1.Width,Bmp1.Height)); Paintbox1.Invalidate; Bmp1.Canvas.Brush.Color:=Farbe; end;
var Finished: Boolean; begin repeat case MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbYes, mbNo, mbCancel], 0) case mrYes: begin if SavePictureDialog.Execute then begin BMP1.SaveToFile(SavePictureDialog.FileName); ClearImage; Finished := True; end else Finished := False; end; mrNo: begin ClearImage; Finished := True; end; mbCancel: begin Finished := True; end; end; until Finished; end; |
ungetestet, aber sollte funktionieren...
MfG Bergmann.
Mr.Retsim - So 27.02.11 15:08
Wow!
an eine case of Struktur hatte ich gar nicht gedacht, aber jetzt funktioniert es: mit folgenden modifikationen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| /laden eines neuen Blatts procedure TForm1.BtNeuClick(Sender: TObject); procedure ClearImage; begin Bmp1.Canvas.Brush.Color:=clWhite; Bmp1.Canvas.FillRect(Rect(0,0,Bmp1.Width,Bmp1.Height)); Paintbox1.Invalidate; Bmp1.Canvas.Brush.Color:=Farbe; end;
var Finished: Boolean; begin repeat case MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbYes, mbNo, mbCancel], 0) of mrYes: begin if SavePictureDialog.Execute then begin BMP1.SaveToFile(SavePictureDialog.FileName); ClearImage; Finished := True; end else Finished := False; end; mrNo: begin ClearImage; Finished := True; end; end;
until Finished; end; |
einmal ein "of" eingefügt, und das Abbrechen Event weggemacht, denn das wird von dem Dialog automatisch ausgeführt.
Vielen Dank
jaenicke - So 27.02.11 15:24
Lokale nicht initialisierte Variablen sind etwas Schönes...
Was machst du denn, wenn Finished zufällig False ist am Anfang? :roll:
// EDIT: Hatte zuerst nicht gesehen, dass hier schlicht die Variable nicht initialisiert ist.
Davor sollte eigentlich auch der Compiler mit einer Warnung warnen... :roll:
Bergmann89 - So 27.02.11 18:16
Hey,
@jaenicke: deshalb hatte ich ja im case-Block auch noch das mrCancel mit drin, sodass egal bei welchem Zweig das Finished gesetzt wird.
@Mr.Retsim: warum hast du das wieder raus genommen? Das hatte schon nen Sinn, dass das da mit drin steht. Besser ist natürlich, du nimmst gleich ein else:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| case MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbYes, mbNo, mbCancel], 0) of else Finished := True; end; |
beim dem
of hab ich mich verschrieben, es war schon spät :roll: aber normalerweiße sollte das mit in die Zeile von dem
case (siehe oben). Du musst dir unbedingt nen besseren Schreibstil angewöhnen, sonst kommst du früher oder später in Schwierigkeiten. Dazu gibts
hier [
http://www.delphi-treff.de/object-pascal/delphi-styleguide/] den StyleGuide.
€: gut mein Schreibstil is auch nich unbedingt der genormte, aber ich komm so besser klar^^ hab den Code im Beitrag oben mal angepasst, so das er jetzt der Norm entspricht.
MfG Bergmann.
Mr.Retsim - So 27.02.11 18:49
Hallo, ja danke
also das Cancel gibt mir immer eine Fehlermeldung, aber das ist eigentlich egal, weil es funktioniert, ich habe es nämlich ausgiebig getestet.
Und ja hast auch recht, des Schreibstil ist nicht schön, habs aber schon angepasst, damit es schöner aussieht :)
Danke
Bergmann89 - So 27.02.11 19:04
Hey,
wie funktioniert es? so wie du es oben hast? Dann funktioniert es aber nur, wenn du Finished von Anfang an auf True steht. Das muss aber nicht immer der fall sein. Probier mal folgendes:
Dialog: Ja --> SpeichernDialog öffnet
Abbrechen --> SpeichernDialog wird nicht richtig ausgeführt und Finished wird auf False gesetzt
Dialog wird erneut geöffnet: Abbrechen --> nichts wird gemacht, aber Finished steht noch auf False und die Schleife wird nicht beendet
deshalb muss das entweder die Abfrage auf Cancel oder halt das else mit da rein ;)
MfG Bergmann.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!