| Autor |
Beitrag |
Airtrox
      
Beiträge: 109
Delphi 7
|
Verfasst: Sa 19.12.09 14:21
Ich habe mal wieder ein Problem, mit den Messageboxen:
Ich möchte die Funktion unten bei einem Klick aufrufen lassen und je nach Buttonklick (Captions verändert) soll eine Überprüfung stattfinden. Das Problem ist nun, dass in dieser Funktion die Buttons mbOK und mbCancel verwendet werden. Beim Klick auf X wird automatisch der Wert für mbCancel genommen, obwohl es damit nichts zu tun hat und die Abfrage von mbCancel stattfindet. Das hat den Nachteil, dass der User (obwohl er abbrechen wollte durch den X Klick) trotzdem eine Abfrage ausgelöst hat.
Die Funktion:
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:
| function MyMessageDialog(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; Captions: array of string): Integer; var aMsgDlg: TForm; i: Integer; dlgButton: TButton; CaptionIndex: Integer; begin aMsgDlg := CreateMessageDialog(Msg, DlgType, Buttons); captionIndex := 0; for i := 0 to aMsgDlg.ComponentCount - 1 do begin if (aMsgDlg.Components[i] is TButton) then begin dlgButton := TButton(aMsgDlg.Components[i]); if CaptionIndex > High(Captions) then Break; dlgButton.Caption := Captions[CaptionIndex]; Inc(CaptionIndex); end; end; Result := aMsgDlg.ShowModal; end; |
Meine Abfrage:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if MyMessageDialog('Sicher?', mtConfirmation, mbOKCancel, ['Na los!', 'Etwas langsamer']) = mrOk then begin ... end else begin ... end; |
Wie kann man das passend ändern, sodass der Klick auf X auf wirklich alles abbricht(ohne Abfragen auszulösen)?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.12.09 15:00
Dein Problem liegt in deiner Logik. Warum löst denn bei dir Abbrechen eine Aktion aus?
|
|
Airtrox 
      
Beiträge: 109
Delphi 7
|
Verfasst: Sa 19.12.09 15:29
Ich habe meine Abfrage mal so überprüft (Kein Cancel mehr):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var ok : bool; begin ok := false; if MyMessageDialog('Sicher?', mtConfirmation, [mbyes, mbNo], ['Na los!', 'Etwas langsamer']) = mrOK then begin ... ok := true; end else begin ... ok := true; end;
if ok then ... |
Aber das hat das selbe zur Folge.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 19.12.09 15:31
du setzt ok in jedem fall auf true. Da frage ich mich, welchen Sinn hat diese Abfrage?
Delphi-Quelltext
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.12.09 15:32
Warum prüfst du auf mrOK, wenn du die Schaltflächen mrYes und mrNo hast?
|
|
Airtrox 
      
Beiträge: 109
Delphi 7
|
Verfasst: Sa 19.12.09 15:39
an Luckie: bei mrYes sieht das genauso aus.
an FinnO: Ich will die Abfrage nur einmal ausführen. Wenn ich die Meldung 2 mal haben wollte, würde ich einfach 2 if Anweisungen machen bzw, else if. Ich dachte mir, dass beim X drücken nichts passiert und ok falsch bleibt, aber ist natürlich Unsinn, wenn ich drüber nachdenke
Leider hab ich dafür immer noch keine Lösung gefunden, wie ich den X Button "unschädlich" machen kann.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 19.12.09 20:24
Nimm einfach ne neue Form, die kannst du dir ganz nach Wunsch bauen.
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 19.12.09 23:19
Airtrox hat folgendes geschrieben : | | Beim Klick auf X wird automatisch der Wert für mbCancel genommen, obwohl es damit nichts zu tun hat und die Abfrage von mbCancel stattfindet. Das hat den Nachteil, dass der User (obwohl er abbrechen wollte durch den X Klick) trotzdem eine Abfrage ausgelöst hat. |
Fassen wir zusammen: Der Benutzer wollte abbrechen, aber mb Cancel hat damit nichts zu tun?
Cancel heißt nun einmal abbrechen, und wenn der Benutzer den Dialog abbricht, was sollte denn sonst passieren als dass abgebrochen zurückgegeben wird?
Wie du das ändern kannst: In deiner MyMessageDialog Funktion musst du ja nur den Handler für OnCloseQuery von aMsgDlg ändern auf eine Prozedur, die CanClose auf false setzt. Oder einfach den Button bei aMsgDlg deaktivieren. Oder OnClose auf eine Prozedur setzen, die ModalResult auf etwas anderes als mrCancel setzt.
Zudem funktioniert die Abfrage mit if nicht, wenn du auf mehr als zwei Möglichkeiten prüfen willst. Da wäre case besser geeignet.
|
|
Airtrox 
      
Beiträge: 109
Delphi 7
|
Verfasst: Sa 19.12.09 23:45
jaenicke hat folgendes geschrieben : | Fassen wir zusammen: Der Benutzer wollte abbrechen, aber mbCancel hat damit nichts zu tun?  |
Ganz genau  Der Cancel Button (umbeschriftet) wurde "missbraucht", was ich nun aber geändert habe.
Das mit case war eine Spitzenidee  manchmal sieht man den Wald vor lauter Bäumen eben nicht...
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 19.12.09 23:50
|
|