Delphi-PRAXiS

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/)
-   -   XE5 Firemonkey MessageBox/MessageDlg (https://www.delphipraxis.net/179940-xe5-firemonkey-messagebox-messagedlg.html)

Nils S. 12. Apr 2014 08:39

XE5 Firemonkey MessageBox/MessageDlg
 
Hallo zusammen,

ich habe mittlerweile festgestellt, dass es bei Firemonkey keine MessageBox mehr gibt, sondern nur noch den MessageDlg.
Kann man einen MessageDlg irgendwie modal anzeigen?
Oder gibt es eine Alternative?

Hat da jemand eine Idee oder Erfahrung?

himitsu 12. Apr 2014 10:21

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Gbit es da auch noch sowas wie CreateMessageDialog, bzw. MessageDlgIndirect, welches man selber via ShowModal anzeigen kann?

Bernhard Geyer 12. Apr 2014 11:22

AW: XE5 Firemonkey MessageBox/MessageDlg
 
MessageBox ist eine WinAPI-Funktion. Für eine plattformunabhänges Framework/Implementierung ist das ein NoGo.

Harry Stahl 12. Apr 2014 12:34

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Zitat:

Zitat von Nils S. (Beitrag 1255398)
Hallo zusammen,
ich habe mittlerweile festgestellt, dass es bei Firemonkey keine MessageBox mehr gibt, sondern nur noch den MessageDlg.
Kann man einen MessageDlg irgendwie modal anzeigen?

Der wird doch modal angezeigt. Beispiel:
Delphi-Quellcode:
 info := 'Wollen Sie die gewählte Rechnung wirklich löschen?';

  if not IsShiftKeyPressed then begin // Wenn Taste Shift gedrückt ist, nicht fragen
    if MessageDlg(info, TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes,TMsgDlgBtn.mbNo], 0) = mrNo then begin
      exit;
    end;
  end;

Nils S. 12. Apr 2014 15:00

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Danke schonmal für die Rückmeldungen.

Habe jetzt nochmal ein bisschen rum probiert.
Ich erzeuge den MessageDlg bei einem FormShow Ereignis
und habe jetzt beim Testen versehentlich mal zwei Dialoge anzeigen lassen.
Der Erste ist nicht modal, der zweite schon.

Wenn ich einen Dialog durch z.B. ein Click Ereignis erzeuge, dann ist er tatsächlich immer modal.

Kann ich das irgendwie umgehen?

Hintergrund ist, dass ich beim Sarten des Programmes den ConnectionString zu einer Datenbank festlege
und die Property Connected auf True setze.
Klappt das nicht, kommt eine Fehlermeldung und die ist dann nicht modal, weil sie bei dem FormShow Ereignis erzeugt wird.

Harry Stahl 12. Apr 2014 15:24

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Du kannst einen Timer verwenden, der zunächst nicht Enabled ist.

Den setzt Du beim OnShow der Form auf Enabled (wenn erforderlich) und im TimerEvent Disablest Du zuvor den Timer und zeigst dann Deine Nachricht an, die dann modal ist.

Nils S. 14. Apr 2014 11:33

AW: XE5 Firemonkey MessageBox/MessageDlg
 
An sowas in der Art habe ich dann auch gedacht, für ein workaround.
Ich werde das demnächst mal probieren und dann nochmal kurz Kund tun, ob es funktionert hat.

Danke schonmal.

Nils S. 15. Apr 2014 19:14

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Es hat natürlich, wie erwartet, funktioniert. :)

Danke nochmal.

Harry Stahl 15. Apr 2014 19:30

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Gerne.

Übrigens hier gleich der Hinweis: Einige Sachen funktionieren nach wie vor - auch in XE6 - erst, wenn die Form vollständig initialisiert wurde, also auch OnShow abgeschlossen ist.

Z.B. ein "Imageviewer1.bestfit" funktioniert nicht im OnCreate oder OnShow, sondern erst danach, also auch hier erst per WorkAround im Timer, wenn die Grafik schon eingepasst zum Start der Form angezeigt werden soll.

Das sollte vielleicht auch noch mal von EMBA geändert werden... (QC-Eintrag dazu hatte ich schon zu XE5 gemacht).

Nils S. 21. Apr 2014 11:35

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Ich habe nun noch eine Frage zu den MessageDlg in Firemonkey.
Wie funktioniert das mit case of?

In VCL habe ich es beispielsweise so gemacht:
Delphi-Quellcode:
case Application.MessageBox('Es wurden bereits Eingaben für einen' + #13 +
                                'neuen Benutzer gemacht.' + #13 +
                                'Sollen diese verworfen werden?',
                                MB_ICONWARNING or
                                MB_YESNOCANCEL or
                                MB_DEFBUTTON3) of
      IDYES:
      begin
        //mach was
      end;
      IDNO:
      begin
        //mach was anderes
      end;
      IDCANCEL:
      begin
        //mach noch was anderes
      end;
    end;
Wenn ich es in Firemonkey so mache:

Delphi-Quellcode:
case MessageDlg
        ('Es wurden bereits Eingaben für einen neuen Benutzer vorgenommen.' + #13 +
        'Sollen diese verworfen werden?',
        TMsgDlgType.mtConfirmation,
        [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo, TMsgDlgBtn.mbCancel],
        0,
        TMsgDlgBtn.mbCancel) of
        TMsgDlgBtn.mbYes:
        begin
          //mach was
        end;
        TMsgDlgBtn.mbNo:
        begin  
          //mach was anderes
        end;
        TMsgDlgBtn.mbCancel:
        begin
          //mach noch was anderes
        end;
Dann kommt beim Kompilieren die Fehlermeldung inkompatible Typen, Integer und TMsgDlgButton.
Wenn ich nun bei den verschiedenen Cases die Werte der Buttons, also 0, 1 und 3 für Yes, No und Cancel nehme, kommt beim Kompilieren zwar keine Fehlermeldung, aber der Code hat zur Laufzeit auch keine Funktion.

Wie bringe ich das zum Laufen?

Ok, bitte einfach die Frage vergessen, muss in dem Cases natürlich ein IDYes, IDNo und IDCancel verwenden...

Sir Rufo 21. Apr 2014 11:52

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Hast du schon in die Dokumentation geschaut?

Delphi-Referenz durchsuchenFMX.Dialogs.MessageDlg

Anscheinend nicht ;)

himitsu 21. Apr 2014 13:12

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Ich würde dort auch mal nach den ID-Konstanten suchen, oder nach den "neueren" mr-Konstanten. :gruebel:
(eventuell sind die Konstanten auch in einer Klasse/Record gekapselt)

MessageButton zum Auswählen der anzuzeigenden Buttons und MessageResult ModalResult als Ergebnis was gedrückt wurde. (ein Dialog ist eine modale Form)

Sir Rufo 21. Apr 2014 13:30

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Die Online-Hilfe sollte auf XE6 verweisen oder einfach auf die Angabe der Version verzichten, dann kommt immer die aktuellste Dokumentation

XE6: http://docwiki.embarcadero.com/Libra...ogs.MessageDlg
oder (immer aktuell): http://docwiki.embarcadero.com/Libra...ogs.MessageDlg

da stehen dann auch die ModalResult-Konstanten ;)

Nils S. 22. Apr 2014 15:21

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Ja, ich habe meinen Beitrag ja schon editiert, dass es logisch ist, dass ich IDYes, IDNo und IDCancel verwenden muss. Damit klappt das natürlich auch ohne Probleme.

Danke trotzdem. :)

Nils S. 27. Mai 2014 20:51

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Hallo zusammen,

nach einiger Zeit habe ich nun zu dem MessageDlg nochmal ein Problemchen.
Dieses sieht wie folgt aus:
Delphi-Quellcode:
  case MessageDlg('Text.',
    mtWarning,
    [mbYes, mbNo, mbHelp],
    0,
    mbNo) of
    idYes:
    begin
      {Mach was.
       Funktioniert ohne Probleme.}
    end;
    idHelp:
    begin
      {Mach was.
       Funktioniert nicht...}
    end;
  end;
Wenn ich den mbHelp zum Beispiel gegen mbIgnore oder mbCancel oder irgendeinen beliebigen anderen Button tausche und die idHelp dementsprechend natürlich auch,
fuktioniert auch dieser Fall.

Muss man bei einem mb/idHelp etwas besonderes machen oder berücksichtigen?

himitsu 27. Mai 2014 20:53

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Ich sehn da kein Problem. :gruebel:

[edit]
Selbst da nicht, als vorhin noch ein Code zu sehen war.

Nils S. 27. Mai 2014 21:01

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Da hat die Tasenkombination Tab-->Enter den Beitrag etwas zu früh abgeschickt...
jetzt habe ich das Problem oben vernünftig gepostet.

:lol:

himitsu 27. Mai 2014 21:16

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Ja, mußt du X'D

Du gibst dem Parameter "HelpIndex" einen Wert mit und wenn du in deinem Programm eine Hilfedatei registriert hast, dann wird der entsprechende Hilfeindex geladen, so als wenn du F1 drücken würdest.


Alternativ kann man via Applicatopn.OnHelp oder TApplicationEvents auf deinen HelpIndex reagieren.


PS: Leider ist noch keiner auf die saublöde Idee gekommen und hat endlich mal die Dialog-Parameter überladen, vorallem da es seit massig Jahren auch noch den HelpContext gibt und keiner mehr eine index-, sondern eine kontextbasierende Hilfe aufbaut. :wall:

Nils S. 27. Mai 2014 21:22

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Kann ich nicht einfach ein weiteres Dialogfeld anzeigen lassen?
Mehr will ich doch gar nicht...:/

himitsu 27. Mai 2014 21:36

AW: XE5 Firemonkey MessageBox/MessageDlg
 
NeinJaVielleicht.

Ich weiß jetzt nicht wie das im FireMonkey aussieht, aber in der VCL ist MessageDlg nur ein Wrapper und wenn man da genügend Ebenen rein geht, dann kommt man irgendwann zu einer Funktion, welche einem den VCL-Dialog zusammenbastelt und dann die TForm-Instanz zurückgibt.

Dort könnte man dann z.B. via FindComponent den Hilfe-Button suchen, sein OnClick-Ereignis dranhängen und dann zeigt man nun nur noch mit ShowModal den Dialog an.


Oder du nimmst einen anderen Button (der wie gewünscht funktioniert) und tauscht bei Diesem die Caption.




Der Grund: Der Hilfebutton beendet den Dialog nicht.
Er zeigt die Hilfe an, damit man sich besser enscheiden kann, was man nun für einen Button eigentlich klicken will.

Nils S. 28. Mai 2014 19:51

AW: XE5 Firemonkey MessageBox/MessageDlg
 
Na das ist ja alles eine Bastelei...:lol:

Also da ich ungern halbe Sachen mache habe ich mich nun stundenlang belesen und ausprobiert und bin mitlerweile soweit,
dass ich eine Hilfe mit dem HTML Help Workshop erstellt habe und mit einiger bastelarbeit und vorgefertigten Units das ganze in mein Projekt implementieren kann.
Ich kann nun sogar mit einer Procedure
Delphi-Quellcode:
Application.HelpContext(0);

Die Hilfe aufrufen, nur leider ist sie leer.
Wenn ich die gleiche Hilfe aber per Doppelklick starte, hat diese einen Inhalt.

F1 hat keune Funktion und auch über das Attribut "HelpCtx" des MessageDlg wird die Hilfe nicht aufgerufen.
Was ist das für ein merkwürdiges Phänomen? Woran könnte das liegen?

[edit]
Also ich habe jetzt festgestellt, dass
Delphi-Quellcode:
Application.HelpContext(0);

in jedem Fall zu dem Aufruf einer Hilfe führt, egal ob die angegebene .chm-Datei gefunden wurde oder nicht.

Aber das Programm findet die Datei, die ich angebe.
Deswegen verstehe ich nicht, warum nicht darauf zugegriffen wird.

attila71 11. Jul 2019 13:25

AW: XE5 Firemonkey MessageBox/MessageDlg
 
MessageDlg('ANNULLO L''OPERAZIONE ?', System.UITypes.TMsgDlgType.mtInformation,
[
System.UITypes.TMsgDlgBtn.mbYes,
System.UITypes.TMsgDlgBtn.mbNo,
System.UITypes.TMsgDlgBtn.mbCancel
], 0,
procedure(const AResult: System.UITypes.TModalResult)
begin
case AResult of
mrYES:
BEGIN
// PREMUTO SI

END;
mrNo:
// PREMUTO NO

mrCancel:
// PREMUTO ANNULLA NON FACCIO NULLA
;
end;
end);


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:47 Uhr.

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