Delphi-PRAXiS
Seite 1 von 3  1 23      

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/)
-   -   Eine Art Semi-ShowModal? (https://www.delphipraxis.net/186351-eine-art-semi-showmodal.html)

sh17 26. Aug 2015 12:06

Eine Art Semi-ShowModal?
 
Hallo,

wenn man ShowModal mit einem Dialog macht, ist z.B. das Hauptmenü nicht mehr zu bedienen. Klar.

Code:
procedure OnClick;
begin
  MachDies;
  Form.ShowModal;
  MachDas;
end;
Wenn ich das ganze durch Show ersetze, ist klar, rauscht er sofort durch MachDas;

Was wäre die eleganteste Variante, um das ShowModal durch Show zu ersetzen (um im Hintergrund das Hauptmenü nutzen zu können) und doch eine Art ShowModal zu haben, die wartet und dann MachDas; aufruft?

Threads, Monitor,... Muss ja sicher im MainThread laufen

Daniel 26. Aug 2015 12:12

AW: Eine Art Semi-ShowModal?
 
Eine Art OnClose-Handler als anonyme Methode? So ähnlich, wie es auf den mobilen Plattform für die MessageBox umgesetzt wurde. Das Form selbst würde dann mittels .Show() angezeigt und hätte je nach Bedarf sowas wie StayOnTop aktiv.

mm1256 26. Aug 2015 12:35

AW: Eine Art Semi-ShowModal?
 
Und warum nicht einfach "MachDas" in eine separate Unit auslagern, und dann aus der "modalen" Form - die ganz normal mit Show angezeigt wird - aufrufen?

sh17 26. Aug 2015 12:43

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von mm1256 (Beitrag 1313555)
Und warum nicht einfach "MachDas" in eine separate Unit auslagern, und dann aus der "modalen" Form - die ganz normal mit Show angezeigt wird - aufrufen?

Hmm, ja, ne. Ist mir jetzt zu unflexibel. Mal schauen, wenn es gar nicht anders geht.

Mavarik 26. Aug 2015 12:49

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von sh17 (Beitrag 1313559)
Zitat:

Zitat von mm1256 (Beitrag 1313555)
Und warum nicht einfach "MachDas" in eine separate Unit auslagern, und dann aus der "modalen" Form - die ganz normal mit Show angezeigt wird - aufrufen?

Hmm, ja, ne. Ist mir jetzt zu unflexibel. Mal schauen, wenn es gar nicht anders geht.

oder Du nimmst einfach den Vorschlag aus #2

idefix2 27. Aug 2015 10:18

AW: Eine Art Semi-ShowModal?
 
Delphi-Quellcode:
class TSemimodalForm (TForm);
  private
    finished: boolean;  

  public
    procedure WaitForMe;
    procedure show; override;
    procedure close; override;
 
  end;

implementation

procedure TSemimodalForm.WaitForMe;
begin
repeat sleep(200);
       application.processmessages; // bin nicht sicher, ob das hier nötig ist
       until finished;
end;

procedure TSemimodalForm.show;    
begin
inherited;
finished:=false;
end;

procedure TSemimodalForm.close;
inherited;
finished:=true;
end;

Die Forms, bei denen du das brauchst (hier Form2), von TSemiModalForm ableiten
und aufrufen mit
Delphi-Quellcode:
  Form2.Show;
  Form2.WaitForMe;

Mavarik 27. Aug 2015 10:43

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von idefix2 (Beitrag 1313690)
[DELPHI]
Delphi-Quellcode:
  Form2.Show;
  Form2.WaitForMe;

Autsch...

Delphi-Quellcode:
begin
  Form2.MyShowModal(Procedure
                      begin
                        // Mach hier das was Du nach dem Showmodal machen wolltest...  
                      end);
end.

Photoner 27. Aug 2015 10:52

AW: Eine Art Semi-ShowModal?
 
Evtl. Einen Timer verwenden der mit .OnShow gestartet wird?

Delphi-Quellcode:
procedure TFormNichtModal.FormShow(Sender: TObject);
begin
  MyTimer.Interval := 100;
  MyTimer.Enabled := True;
end
Delphi-Quellcode:
procedure TFormNichtModal.MyTimerTimer(Sender: TObject);
begin
 if not FormNichtModal.Showing then begin
   Machdas;
   MyTimer.Enabled := False;
 end;
end;

idefix2 27. Aug 2015 10:55

AW: Eine Art Semi-ShowModal?
 
Es geht sogar noch einfacher, weil die Eigenschaft visible ohnehin durch show und close gesetzt wird.
Also kein Überschreiben von show und close nötig, sondern nur repeat ... until not visible.

Die Form sollte aber nicht mit caFree geschlossen werden, sonst kann es knallen.

idefix2 27. Aug 2015 11:09

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von Mavarik (Beitrag 1313697)
Autsch...

Was soll um Himmels Willen an der Variante, die du vorschlägst, besser sein?
Es gibt schon Situationen, wo anonyme Methode etwas bringen, aber hier? Nur, um endlich einmal eine anonyme Methode verwenden zu können?

Programmcode sollte meines Erachtens vor allem LESBAR sein, man sollte wenn möglich beim ersten Hinsehen erkennen, was passiert. Das ist bei Code, der als anonyme Methode im Parameter eines MyShowModal übergeben wird, sicher nicht im gleichen Ausmaß gegeben, als wenn man mittel Form.WaitForMe explizit auf das Beenden der Form wartet und dann im Code normal weitermacht.

Wenn dich der Aufruf stört, dann könnte man eine Methode ShowSemiModal in Betracht ziehen, die erst zurückkehrt, wenn die Form geschlossen ist, die also den Code von WaitForMe am Ende beinhaltet. Abstrakte Methoden an die Form zu übergeben, trägt hier nichts dazu bei, den Code besser oder lesbarer zu machen. Auch aus der Sicht von OOP ist der Ansatz nicht gut, denn es ist sicher nicht die "Aufgabe" der Form, das zu erledigen, was passieren soll, nachdem die Form geschlossen wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 Uhr.
Seite 1 von 3  1 23      

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