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/)
-   -   Delphi Firemonkey und OnModalBegin/OnModalEnd (https://www.delphipraxis.net/192604-firemonkey-und-onmodalbegin-onmodalend.html)

sintronic86 4. Mai 2017 09:03

Firemonkey und OnModalBegin/OnModalEnd
 
Hallo Community,

wieder einmal habe ich eine Frage zum Thema Firemonkey.

Ich nutze schon seit langem die
Delphi-Quellcode:
TApplicationEvents
in der VCL. Dort benutzer ich immer die Events
Delphi-Quellcode:
OnModalBegin
und
Delphi-Quellcode:
OnModalEnd
um das Fenster, welches ein anderes aufruft, abzudunkeln. Ich finde diesen Effekt echt super.

Nun habe ich ein Firemonkey-Projekt und möchte dort den selben Effekt erziehlen.

Leider gibt es dort (scheinbar) weder
Delphi-Quellcode:
TApplicationEvents
noch eine andere Möglichkeit auf die oben beschriebenen Events zu zugreifen.

Hat einer von euch eine Idee, wie man das trotzdem bewerkstelligen kann?


Vielen Dank und beste Grüße
Björn

Der schöne Günther 4. Mai 2017 12:00

AW: Firemonkey und OnModalBegin/OnModalEnd
 
Ich habe für genau den gleichen Effekt immer das ShowModal() meiner Formular-Basisklasse überschrieben, die Events habe ich nie gebraucht.

Edit: Oh, FMX.Forms.TCommonCustomForm.ShowModal() ist leider überhaupt nicht virtuell. Also auch keine Option.

PS: Auf FMX wäre vielleicht der TFrameStand eine Option. Damit hätte man zwar kein zweites Fenster, aber könnte "neuen Content" mit Ablendeffekt vor das Hauptformular legen.

Rollo62 4. Mai 2017 12:29

AW: Firemonkey und OnModalBegin/OnModalEnd
 
Bei Fmx gibts kein Modal, dann schmeisst dich das Phone wieder raus.

Deshalb sollte man das über die Varianten mit anonymous Proc abwickeln.

Rollo

sintronic86 4. Mai 2017 15:56

AW: Firemonkey und OnModalBegin/OnModalEnd
 
@Rollo62:
Da es sich bei meinem Projekt um eine reine Windows-Anwendung handelt, sollte das prinzipiell kein Problem sein!
Kannst du deine Links etwas näher erläutern? Mir ist gerade nicht ganz bewusst, wie
Delphi-Quellcode:
Dialogs.MessageDialog
mit dem Abdunkel-Effekt bei einem
Delphi-Quellcode:
ShowModal
-Aufruf einer Form zu tun hat! :oops:

Der schöne Günther 4. Mai 2017 16:21

AW: Firemonkey und OnModalBegin/OnModalEnd
 
Eine Notlösung wäre ein TRectangle mit
Delphi-Quellcode:
Align = Client
und
Delphi-Quellcode:
Opacity = 0,75
aufs Formular zu legen. Und ganz in den Hintergrund zu schicken.

Abblenden ginge dann ungefähr so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
   Rectangle1.BringToFront();
   Rectangle1.Fill.Kind := TBrushKind.Solid;
   Rectangle1.Fill.Color := TAlphaColors.Black;
   try
      anderesFormular.ShowModal();
   finally
      Rectangle1.Fill.Kind := TBrushKind.None;
      Rectangle1.SendToBack();
   end;
end;
Eigentlich wären die FMX-Effekte dafür super gedacht, aber die funktionieren anscheinend nicht wenn man sie direkt auf ein Formular setzt.

Harry Stahl 4. Mai 2017 18:00

AW: Firemonkey und OnModalBegin/OnModalEnd
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaube dem Thread-Ersteller geht es weniger um die Frage, wie man das Formular abblendet, sondern, wie man an die Information gelangt, wann ein eigenes modales Formular angezeigt wird.

Es gibt zwar in der Tat kein OnModalBegin/OnModalEnd unter FiremMonkey, aber FMX arbeitet auch selber mit dem TMessageManager, um im System bestimmte Botschaften zu senden und darauf reagieren zu können.

Da kannst Du Dich einfach einklinken, im Oncreate-Event der Mainform nimmst Du auf:

Delphi-Quellcode:
 TMessageManager.DefaultManager.SubscribeToMessage (TFormBeforeShownMessage,
   procedure (const sender: TObject; const M: TMessage)
   begin
     // Diese Prozedur wird nun immer aufgerufen, wenn eine Form im Programm Modal angezeigt wird
     FadeTransitionEffect1.Enabled :=True; // z.B. ein TLayout als Parent in der Mainform, dass diesen Effekt hat
   end);
Die Unit System.Messaging wird benötigt.

Den Effekt kannt Du dann im Activate-Event der Mainform wieder ausschalten (oder Du schreibst Dich zusätzlich mit dem Message-Manager in die Activate-Botschaft ein).

Hinweis 1: Habe hier den DefaultMessage-Manager verwendet, bei Bedarf kann man einem eigenen erstellen ([Eigenwerbung an: :oops:]falls Dir das Thema MessageManager nichts sagt, findest Du bei Bedarf in meinem neuesten FMX-Buch Informationen dazu in einen eigenen Kapitel zum TMessageManager (Kapitel 9)[/Eigenwerbung aus]).

Hinweis 2: Beim Aufruf von "ShowMessage" funktioniert das nicht, da das intern anders gehandelt wird, da musst Du selber eine ShowMessage-Funktion erstellen, die zuvor den Effekt macht und danach ihn wieder aufhebt.

Siehe auch anliegenden Screenshot.

sintronic86 5. Mai 2017 10:29

AW: Firemonkey und OnModalBegin/OnModalEnd
 
@Der schöne Günther:
Tatsächlich mache ich es ähnlich, wie bei deinem Vorschlag.
Ich habe einen Nachfahren von TForm gemacht (heißt bei mir TfDEFAULTForm) von der ich alle Fenster des Programms ableite. Dort erstellen ich im OnCreate ein TRectangle, dass folgenden constructor hat:
Delphi-Quellcode:
public
  constructor Create(ASrcForm: TForm);
ASrcForm ist dann Self, also das TfDEFAULTForm.

und im constructor des <RECTANGLE> werden folgende Eigenschaften gesetzt:
Delphi-Quellcode:
SrcForm    := ASrcForm;
Fill.Color := TAlphaColorRec.Black;
Stroke.Kind := TBrushKind.None;
Opacity    := 0;
Align      := TAlignLayout.Contents;
Parent     := nil;
Einblenden tue ich das dann folgendermaßen:
Delphi-Quellcode:
<RECTANGLE>.Parent := SrcForm;
TAnimator.AnimateFloat(<RECTANGLE>, 'Opacity', 0.4, ADuration);
Und ausblenden dann folgendermaßen:
Delphi-Quellcode:
TAnimator.AnimateFloatWait(<RECTANGLE>, 'Opacity', 0, ADuration);
<RECTANGLE>.Parent := nil;
D.h. die Animationen von FMX nutze ich da voll aus! :-D

@Harry Stahl:
Super! Das ist genau das, was ich gesucht hab. Schade zwar, dass das nur für den "Show"-Moment funktioniert und nicht für den "Hide"-Moment, aber ich werde es mal dem OnActivate versuchen.
Zählt denn der von dir beschriebene Aufruf jeweils NUR für die Form, in dessen OnCreate ich ihn ausführe? Dann könnte ich das ja einfach in meine TfDEFAULTForm einbauen.

Der schöne Günther 5. Mai 2017 11:27

AW: Firemonkey und OnModalBegin/OnModalEnd
 
Zitat:

Zitat von sintronic86 (Beitrag 1370304)
D.h. die Animationen von FMX nutze ich da voll aus! :-D

Ja, wenn man die VCL gewöhnt ist kann man sich da wirklich beeindrucken lassen. Weil FMX es kann könnte man vielleicht noch ein leichtes Verwischen (TBlurEffect) reinmischen? ;-)

Harry Stahl 5. Mai 2017 18:33

AW: Firemonkey und OnModalBegin/OnModalEnd
 
Zitat:

Zitat von sintronic86 (Beitrag 1370304)
@Harry Stahl:
Super! Das ist genau das, was ich gesucht hab. Schade zwar, dass das nur für den "Show"-Moment funktioniert und nicht für den "Hide"-Moment, aber ich werde es mal dem OnActivate versuchen.
Zählt denn der von dir beschriebene Aufruf jeweils NUR für die Form, in dessen OnCreate ich ihn ausführe? Dann könnte ich das ja einfach in meine TfDEFAULTForm einbauen.

Einmal ausgeführt reicht das aus. Immer wenn im Programm eine Form Modal angezeigt wird, erhält Deine Listener-Funktion die Nachricht darüber.

Das ist ja das geniale am TMessageManager. Man kann so sehr schön Abhängigkeiten von Units entkoppeln. Eine Unit, die bestimmte Nachrichten braucht, schreibt sich dafür ein. Dafür braucht sie die anderen Units nicht zu kennen. Wenn man selber Nachrichten verschickt, kann man beim Senden auch Objekte als Parameter angeben. So kann eine anderer Unit/Form auf einen bestimmten Zustand bzw. eine Änderung in einer anderen Unit/Form reagieren, die sie gar nicht kennt.

Es lohnt, sich mit diesem Thema einmal ausführlicher zu beschäftigen.

Eine Klasse(n-Nachricht) wie "TFormAfterShownMessage" für das Hide-Event gibt es leider nicht. Hätte man implementieren können, hat man aber nicht. Könnte man zwar bei Bedarf selber nachrüsten (eine eigene Ableitung von TForm), aber das wäre vielleicht zuviel Aufwand. Das Activate-Event der Mainform sollte da eigentlich schon ausreichend sein.

Rollo62 6. Mai 2017 06:25

AW: Firemonkey und OnModalBegin/OnModalEnd
 
Ja sorry, ich hatte es nur überflogen.
Was ich meinte war den Mechanismus mit anonymous zu benutzen, kkönnte man ja auch in eigenen Klassen, abeleiteten Formen.

Delphi-Quellcode:
procedure StartTheModal;
begin

  ShowTheGreyBackground;

  MyForm.Execute(procedure(const AResult: TModalResult)
                           begin
                              case AResult)
                              end;

                              RemoveTheGreyBackground;
                           end);    

  // Das Ganze ist dann non-blocking und läuft hier weiter
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 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