AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eine Art Semi-ShowModal?

Ein Thema von sh17 · begonnen am 26. Aug 2015 · letzter Beitrag vom 27. Aug 2015
Thema geschlossen
Seite 1 von 2  1 2      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.152 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Eine Art Semi-ShowModal?

  Alt 26. Aug 2015, 13:49
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

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 11:18
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;

Geändert von idefix2 (27. Aug 2015 um 11:40 Uhr)
 
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.152 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 11:43
[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.
 
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 12:09
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.

Geändert von idefix2 (27. Aug 2015 um 12:14 Uhr)
 
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.152 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 12:17
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 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;
 
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 12:27
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
 
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 11:52
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;
Chris
 
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 11:55
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.
 
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.152 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 12:10
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

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 12:15
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.
 
Thema geschlossen
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.
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 by Thomas Breitkreuz