Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close; ?) (https://www.delphipraxis.net/190002-messagedlg-ueber-den-default-button-automatisch-schliessen-meincustomdialog-close%3B.html)

RandomDD 19. Aug 2016 09:39

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Wofür wäre diese Variable denn dann? Komme nicht ganz dahinter.

Den messageDlg muss ich leider über eine Message klicken, da er sonst nur geschlossen wird (Rückgabwert Cancel, 2), auch wenn der Button Cancel nicht existiert.

bra 19. Aug 2016 09:57

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Ich verstehe den Sinn nicht, einen MessageDlg anzuzeigen, der sich automatisch schließt - also nie angeklickt wird. Wäre es nicht sinnvoller, hier stattdessen ein Banner anzuzeigen?

Oder soll das eine Art Nagscreen sein, der nach x Sekunden zugeht, vom Benutzer aber auch schon vorher weggeklickt werden kann?

Luckie 19. Aug 2016 10:05

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Habe ich auch schon gesagt. Nur seine Antwort nicht ganz verstanden. In der Statusleiste einfach die letzte Benachrichtigung anzeigen. Fertig.

Benedikt Magnus 19. Aug 2016 10:30

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Zitat:

Zitat von RandomDD (Beitrag 1345246)
Wofür wäre diese Variable denn dann? Komme nicht ganz dahinter.

Den messageDlg muss ich leider über eine Message klicken, da er sonst nur geschlossen wird (Rückgabwert Cancel, 2), auch wenn der Button Cancel nicht existiert.

Du machst das nun so:
Delphi-Quellcode:
// Dialog erzeugen
MeinCustomMsgDialog := CreateMessageDialog(DlgText, mtInformation, [mbYes, mbNo], mbNo);
DialogDefaultButton := TButton(MeinCustomMsgDialog.ActiveControl);

// Default Button anklicken
if DialogDefaultButton.Handle <> 0 then
 SendMessage(DialogDefaultButton.Handle, BM_CLICK, 0, 0)
else
 DialogDefaultButton.Close;

//Auswertung von MeinCustomMsgDialog
case CreateMessageDialog.ShowModal of
  mbYes: MacheWasBeiJa;
  mbNo: MacheWasBeiNein;
end;
Ich meinte es so:
Delphi-Quellcode:
// Dialog erzeugen
MeinCustomMsgDialog := CreateMessageDialog(DlgText, mtInformation, [mbYes, mbNo], mbNo);

// Dialog schließen:
DialogWurdeAutomatischGeschlossen := true;
MeinCustomMsgDialog.Close;

//Auswertung von MeinCustomMsgDialog
case CreateMessageDialog.ShowModal of
  mbYes: MacheWasBeiJa;
  mbNo: MacheWasBeiNein;
  else if DialogWurdeAutomatischGeschlossen then MacheWasBeiAutomatischemSchließen;
end;
EDIT:
Aber natürlich ist der Vorschlag der anderen, das anders zu realisieren, z.B. über ein Banner, immer noch sinnvoller.

RandomDD 19. Aug 2016 10:44

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Das mit dem Banner halte ich für nicht sinnvoll. Es ist auch kein Nagscreen oder ähnliches.
Es ist einfach eine Nachricht, die angezeigt und bestätigt werden muss. Wird sie nicht innerhalb des Timeouts bestätigt, gilt die Aktion als abgebrochen.

Verstehe nicht, was daran nicht zu verstehen ist. :o

Luckie 19. Aug 2016 11:00

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Und wenn ich da eben mal nicht am Rechner bin, wenn der MessageDlg aufpoppt, muss ich die Aktion von vorne starten? Ich muss also die ganze Zeit auf den Bildschirm starren?

Irgendwie ist das Konzept nicht ganz rund für meine Augen.

RandomDD 19. Aug 2016 11:21

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Die Aktion dauert in etwa 10 bis 20 Millisekunden. So schlimm wird es also nicht sein :-D

Der Nutzen ist ganz einfach: wenn man die Software fernsteuert und warum auch immer nicht den Modus dafür eingeschaltet hat und dann ein Dialog aufpoppt, ist die Fernsteuerung nutzlos und kann nichts mehr ausrichten.

himitsu 19. Aug 2016 13:03

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Also, man kann den Dialog auch z.B. um eine "automatisch schließen"-CheckBox erweitern .

Ich lass auch einen Timer laufen, welcher im Knopf, bzw. in der Title-Caption den TimeOut anzeigt.
Bei Mausbewegung oder Tastenklick wird der TimeOut deakiviert.

Zum Schließen kann man das Click vom Button aufrufen, oder ModalResult der Form/Dialog setzen.
Delphi-Quellcode:
TButton(DialogDefaultButton).Click;
// oder
TButton(MeinCustomMsgDialog.FindComponent('OK')).Click;
// oder
MeinCustomMsgDialog.ModalResult := mrOK;
PS: Bie Buttons heißen so, wie die Parameter.
mbCancel -> Control.Name='Cancel' -> ModalResult:=mrCancel


Bei Dialogen via ShowMessage und Co. kommt es drauf an, ob die "neue" Dialog-API vom Windows oder die eigenen TMessageDialog-VCL-Klassen verwendet werden.
Dementsprechend muß der Code anders sein, also ob VCL oder Windows-Dialog-API.

Via Screen.Forms oder Screen.ActiveForm kommt man auch nachträglich an die VCL-Dialoge ran.

MeinCustomMsgDialog.ActiveControl:
Man kann auch in MeinCustomMsgDialog.Components den TButton/TCustomButton mit TButton().Default=True suchen ... das ist definitiv der Default-Button.

p80286 19. Aug 2016 13:35

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Zitat:

Zitat von RandomDD (Beitrag 1345270)
Die Aktion dauert in etwa 10 bis 20 Millisekunden. So schlimm wird es also nicht sein :-D

Der Nutzen ist ganz einfach: wenn man die Software fernsteuert und warum auch immer nicht den Modus dafür eingeschaltet hat und dann ein Dialog aufpoppt, ist die Fernsteuerung nutzlos und kann nichts mehr ausrichten.

Das was Du haben willst findet man https://de.wikipedia.org/wiki/Totmanneinrichtung
Nur, wenn eine Fernsteuerung (was immer das sein mag) möglich ist ohne den entsprechenden Modus (was darf man darunter verstehen) einzuschalten, solltest Du das Bedienkonzept Deiner Software einmal überdenken.

RandomDD 19. Aug 2016 13:40

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;
 
Zitat:

Nur, wenn eine Fernsteuerung (was immer das sein mag) möglich ist ohne den entsprechenden Modus (was darf man darunter verstehen) einzuschalten, solltest Du das Bedienkonzept Deiner Software einmal überdenken.
Der Modus aktiviert nicht die Fernsteuerung sondern er unterbindet das Anzeigen von Dialogen.

Zitat:

Bei Mausbewegung oder Tastenklick wird der TimeOut deakiviert.
Gute Erweiterung. Habe ich soeben auch hinzugefügt.
Delphi-Quellcode:
 procedure MeinCustomMsgDialogOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

 // ...

 MeinCustomMsgDialog.OnMouseMove := MeinCustomMsgDialogOnMouseMove;

 // ...

 procedure TMeineForm.MeinCustomMsgDialogOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 begin
  MeinCustomMsgDialogTimer.Enabled := False;
  MeinCustomMsgDialogCounterLabel.Visible := False;
 end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz