Autor |
Beitrag |
Mr.Retsim
      
Beiträge: 16
|
Verfasst: So 27.02.11 03:25
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
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: So 27.02.11 07:32
Hey,
meinst du in etwa so?
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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
Zuletzt bearbeitet von Bergmann89 am So 27.02.11 18:22, insgesamt 2-mal bearbeitet
Für diesen Beitrag haben gedankt: Mr.Retsim
|
|
Mr.Retsim 
      
Beiträge: 16
|
Verfasst: So 27.02.11 15:08
Wow!
an eine case of Struktur hatte ich gar nicht gedacht, aber jetzt funktioniert es: mit folgenden modifikationen:
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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?
// EDIT: Hatte zuerst nicht gesehen, dass hier schlicht die Variable nicht initialisiert ist.
Davor sollte eigentlich auch der Compiler mit einer Warnung warnen... 
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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  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 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Mr.Retsim 
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
|