Autor Beitrag
Airtrox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109


Delphi 7
BeitragVerfasst: 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:
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:
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
  { Create the Dialog }
  { Dialog erzeugen }
  aMsgDlg := CreateMessageDialog(Msg, DlgType, Buttons);
  captionIndex := 0;
  { Loop through Objects in Dialog }
  { Über alle Objekte auf dem Dialog iterieren}
  for i := 0 to aMsgDlg.ComponentCount - 1 do
  begin
   { If the object is of type TButton, then }
   { Wenn es ein Button ist, dann...}
    if (aMsgDlg.Components[i] is TButton) then
    begin
      dlgButton := TButton(aMsgDlg.Components[i]);
      if CaptionIndex > High(Captions) then Break;
      { Give a new caption from our Captions array}
      { Schreibe Beschriftung entsprechend Captions array}
      dlgButton.Caption := Captions[CaptionIndex];
      Inc(CaptionIndex);
    end;
  end;
  Result := aMsgDlg.ShowModal;
end;


Meine Abfrage:
ausblenden 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
      ...    //beim Schließen wird automatisch diese Abfrage ausgeführt
    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



BeitragVerfasst: Sa 19.12.09 15:00 
Dein Problem liegt in deiner Logik. Warum löst denn bei dir Abbrechen eine Aktion aus?
Airtrox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109


Delphi 7
BeitragVerfasst: Sa 19.12.09 15:29 
Ich habe meine Abfrage mal so überprüft (Kein Cancel mehr):

ausblenden 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
      ...    //beim Schließen wird automatisch diese Abfrage ausgeführt
      ok := true;
    end;

  if ok then ...


Aber das hat das selbe zur Folge.
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Sa 19.12.09 15:31 
du setzt ok in jedem fall auf true. Da frage ich mich, welchen Sinn hat diese Abfrage?

ausblenden Delphi-Quelltext
1:
if ok then...					
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 19.12.09 15:32 
Warum prüfst du auf mrOK, wenn du die Schaltflächen mrYes und mrNo hast?
Airtrox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109


Delphi 7
BeitragVerfasst: 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 :oops:
Leider hab ich dafür immer noch keine Lösung gefunden, wie ich den X Button "unschädlich" machen kann.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 19.12.09 20:24 
Nimm einfach ne neue Form, die kannst du dir ganz nach Wunsch bauen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.12.09 23:19 
user profile iconAirtrox hat folgendes geschrieben Zum zitierten Posting springen:
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 mbCancel hat damit nichts zu tun? :shock:

Cancel heißt nun einmal abbrechen, und wenn der Benutzer den Dialog abbricht, was sollte denn sonst passieren als dass abgebrochen zurückgegeben wird? :gruebel:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109


Delphi 7
BeitragVerfasst: Sa 19.12.09 23:45 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Fassen wir zusammen: Der Benutzer wollte abbrechen, aber mbCancel hat damit nichts zu tun? :shock:

Ganz genau :) Der Cancel Button (umbeschriftet) wurde "missbraucht", was ich nun aber geändert habe.
Das mit case war eine Spitzenidee :D manchmal sieht man den Wald vor lauter Bäumen eben nicht...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.12.09 23:50 
user profile iconAirtrox hat folgendes geschrieben Zum zitierten Posting springen:
Der Cancel Button (umbeschriftet) wurde "missbraucht"
Dann hättest du auch dessen ModalResult Wert ändern können, damit dieser nicht mehr mrCancel zurückgibt. ;-)