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

Mavarik 27. Aug 2015 11:10

AW: Eine Art Semi-ShowModal?
 
Warum zum Geier wollt Ihr alle CPU-Zeit verschwenden mit Abfragen, Timer, Sleep und Application.Processmessages?

Einfach eine {Anonyme}Procedure aufrufen wenn das Fenster geschlossen wird/worden ist.

Es gibt doch keinen Grund rumzubasteln.

Der schöne Günther 27. Aug 2015 11:15

AW: Eine Art Semi-ShowModal?
 
Sehe ich genauso. Das Gebastel macht die Sache doch wirklich nicht einfacher oder weniger fehleranfällig. Auf OnClose reagieren ist doch genau was wir wollen.

Ob man da jetzt eine anonyme Methode oder eine normale oder was auch immer nimmt. Das muss doch keinen kümmern.

mkinzler 27. Aug 2015 11:16

AW: Eine Art Semi-ShowModal?
 
Es gab Zeiten, da gab es keine Türklingeln und man hat periodisch nachschauen müssen, ob jemand vor der Tür steht.
Türklingeln sind also überflüssig. :mrgreen:

Mavarik 27. Aug 2015 11:17

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von idefix2 (Beitrag 1313701)
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?

Ganz einfach... Weil es so schon in der RTL enthalten ist.


Zitat:

Zitat von RTL_XE8
..
Delphi-Quellcode:
    function ShowModal: TModalResult; overload;
    procedure ShowModal(const ResultProc: TProc<TModalResult>); overload;
..

Delphi-Quellcode:
procedure TCommonCustomForm.ShowModal(const ResultProc: TProc<TModalResult>);
begin
  FResultProc := ResultProc;
  Show;
end;

procedure TCommonCustomForm.SetModalResult(Value: TModalResult);
begin
  FModalResult := Value;
  if Assigned(FResultProc) then
  begin
    FResultProc(FModalResult);
    FResultProc := nil;
    Close;
  end;
end;


Sir Rufo 27. Aug 2015 11:27

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von idefix2 (Beitrag 1313701)
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.

Falsch, das nennt man IoC Inversion of Control.

Das etwas passieren soll steht fest, aber was exakt passieren soll wird injiziert.

Und jeder hat IoC schon verwendet, indem er einen Event belegt hat - ist also ein alter Hut.

Mavarik 27. Aug 2015 11:51

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von mkinzler (Beitrag 1313705)
Es gab Zeiten, da gab es keine Türklingeln und man hat periodisch nachschauen müssen, ob jemand vor der Tür steht.
Türklingeln sind also überflüssig. :mrgreen:

Ja das kenne ich auch noch...

Ich habe immer gewartet bis ich das Sync-Loch der Diskette gesehen habe und dann meine Daten geschrieben...

idefix2 27. Aug 2015 12:35

AW: Eine Art Semi-ShowModal?
 
Meines Erachtens ist ein grundlegender Unterschied zwischen der asynchronen Reaktion auf ein beliebiges Ereignis, und dem Warten auf die Beendigung eines Tasks, um dann mit dem normalen Programmablauf fortzufahren.

Und die Übergabe als Prozedur funktioniert überhaupt nicht, oder nur mit gröbsten Verrenkungen bzw. völlig unnötigen Rekursionen, wenn der Aufruf der Form in einer Schleife stattfindet.

Delphi-Quellcode:
repeat
   Berechne;
   Form1.ShowSemiModal;
   berechneweiter;
   until BefriedigendesErgebnis;

Zitat:

Warum zum Geier wollt Ihr alle CPU-Zeit verschwenden mit Abfragen, Timer, Sleep und Application.Processmessages?
Erfreulicherweise ist die CPU-Zeit, die dadurch "veschwendet" wird, völlig vernachlässigbar. Bei einer modernen CPU wird da alle 200 Millisekunden nicht einmal eine Mikrosekunde verbraten.

Mavarik 27. Aug 2015 12:45

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von idefix2 (Beitrag 1313714)
Delphi-Quellcode:
repeat
   Berechne;
   Form1.ShowSemiModal;
   Form1.WaitForMe;
   berechneweiter;
until BefriedigendesErgebnis;

Ja, so programmiere ich auch... Ne Stopp das war noch zu DOS Zeiten...

Seit Borland Pascal für Windows programmiert man aber Event-Orientiert...

Sir Rufo 27. Aug 2015 12:50

AW: Eine Art Semi-ShowModal?
 
In so einem Fall sollte man sich auch von einer Schleife verabschieden und das mit etwas ersetzen, was zu dem Use-Case besser passt: Eine State-Machine.

Damit bekommt man dann auch die kompliziertesten Verschachtelungen sauber in den Griff.

http://melander.dk/delphi/statemachine/
https://github.com/malcolmgroves/TStateMachine (nicht so tolle Portierung von https://github.com/nblumhardt/stateless (C#))

baumina 27. Aug 2015 12:51

AW: Eine Art Semi-ShowModal?
 
Zitat:

Zitat von idefix2 (Beitrag 1313714)
Meines Erachtens ist ein grundlegender Unterschied zwischen der asynchronen Reaktion auf ein beliebiges Ereignis, und dem Warten auf die Beendigung eines Tasks, um dann mit dem normalen Programmablauf fortzufahren.

Und die Übergabe als Prozedur funktioniert überhaupt nicht, oder nur mit gröbsten Verrenkungen bzw. völlig unnötigen Rekursionen, wenn der Aufruf der Form in einer Schleife stattfindet.

Delphi-Quellcode:
repeat
   Berechne;
   Form1.ShowSemiModal;
   berechneweiter;
   until BefriedigendesErgebnis;

Du solltest vielleicht nochmal nachlesen was der TE eigentlich wollte. Er möchte in dem Formular, das dieses SemiModalDingens aufrufen wird, z.B. das Menü weiterhin bedienbar haben und eben nicht in einer Schleife landen, in der der Benutzer nur durch Schließen des SemiFensters irgendwie fortfahren kann.


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

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