Autor Beitrag
Mr.Retsim
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ausblenden 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:
//laden eines neuen Blatts
procedure TForm1.BtNeuClick(Sender: TObject);
//Ein Dialog öffnet sich, der nachfragt ob das Bild gespeichert werden soll: Ja  Nein  Abbrechen
begin
if MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbyes, mbno, mbcancel], 0)
= mrYes then
  //Prozedur des Speicherns
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

 //Die Paintbox wird mit einem weißen Rechteck "übermalt"
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: So 27.02.11 07:32 
Hey,

meinst du in etwa so?
ausblenden volle Höhe 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);

  //Methode um das Bild zu leeren
  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 
    //User fragen
    case MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbYes, mbNo, mbCancel], 0case
      //je nach Auswahl entscheiden
      mrYes: 
        begin //wenn ja gedrückt wurde
          if SavePictureDialog.Execute then 
          begin //SaveDialog öffnen
            BMP1.SaveToFile(SavePictureDialog.FileName); //wenn erfolgreich geöffnet: Bild speichern
            ClearImage; //Bild leeren
            Finished := True; //Finished auf True um Schleife zu verlassen
          end 
          else 
            Finished := False; //wenn nicht erfolgreich geöffnet, dann Finished auf False um Schleife neu auszuführen
        end;
      mrNo: 
        begin //wenn nein gedrückt wurde
          ClearImage; //Bild leeren
          Finished := True; //und Finished auf True im Schlaife zu verlassen
        end;
      mbCancel: 
        begin //wenn abbrechen gedrückt wurde
          Finished := True; //nur Finished auf True um Schleife zu verlassen und keine Änderungen vornehmen
        end;
    end;
  until Finished; //wenn Finished True ist wird die Schleife verlassen, ansonsten wir der Dialog erneut aufgerufen
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: So 27.02.11 15:08 
Wow!
an eine case of Struktur hatte ich gar nicht gedacht, aber jetzt funktioniert es: mit folgenden modifikationen:
ausblenden volle Höhe 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);
//Methode um das Bild zu leeren
  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
    //User fragen
    case MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbYes, mbNo, mbCancel], 0)
      //je nach Auswahl entscheiden
      of mrYes: begin //wenn ja gedrückt wurde
        if SavePictureDialog.Execute then begin //SaveDialog öffnen
          BMP1.SaveToFile(SavePictureDialog.FileName); //wenn erfolgreich geöffnet: Bild speichern
          ClearImage; //Bild leeren
          Finished := True; //Finished auf True um Schleife zu verlassen
        end else Finished := False; //wenn nicht erfolgreich geöffnet, dann Finished auf False um Schleife neu auszuführen
      end;
      mrNo: begin //wenn nein gedrückt wurde
        ClearImage; //Bild leeren
        Finished := True; //und Finished auf True im Schlaife zu verlassen
      end;
            end;

  until Finished; //wenn Finished True ist wird die Schleife verlassen, ansonsten wir der Dialog erneut aufgerufen
end;


einmal ein "of" eingefügt, und das Abbrechen Event weggemacht, denn das wird von dem Dialog automatisch ausgeführt.

Vielen Dank
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
case MessageDlg('Möchtest du dieses Bild speichern?', mtConfirmation, [mbYes, mbNo, mbCancel], 0of
  //je nach Auswahl entscheiden
  {...}
else //wenn nicht Ja und nicht Nein gedrückt wurde
  Finished := True; //nur Finished auf True um Schleife zu verlassen und keine Änderungen vornehmen
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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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^^