Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Formular über Klassenconstructor nicht sichtbar erzeugen (https://www.delphipraxis.net/165482-formular-ueber-klassenconstructor-nicht-sichtbar-erzeugen.html)

snook 2. Jan 2012 14:56

Formular über Klassenconstructor nicht sichtbar erzeugen
 
Hallo und gesundes neues jahr alle miteinander

Da ich mit meiner Erkklärkunst auch dieses Jahr noch auf Kriegsfuß stehe hole ich mal etwas weiter aus, also bitte nicht gleich abschrecken lassen.
Ich habe so ne Art Observerklasse, in der vom Benutzer formulare erzeugt werden:

Delphi-Quellcode:
function TFormManager.RegisterNew(AForm: TFormClass; AOwner: TComponent;
  ANewAppHandle: HWND): TForm;
begin
  if Application.Handle <> ANewAppHandle then
    Application.Handle := ANewAppHandle;
  try
    result := AForm.Create(AOwner);
  except
    on E:Exception do
    begin
      MessageDlg(E.Message, mtError, [mbOK], 0);
      result := nil;
    end;
  end;
  if Assigned(result) then
  begin
    result.FreeNotification(self);
    FShowOnInit.Add(result);
  end
  else
    Notification(nil, opRemove);
end;
Wenn jetzt der Benutzer ein neues Form erzeugen möchte, ruft er diese Methode des FormManagers auf und bekommt das Formular zurückgeliefert. In den meisten Fällen wird der Benutzer jetzt noch nen Form.Show aufrufen um das Ding auch gleich anzuzeigen. Das möchte ich aber gern verhindern, wenn bsw. die Anwendung noch in der Initialisierung steckt, bzw die Anwendung weiß, dass dort noch einiges zu tun ist, bevor das Form sinnvoll angezeigt werden kann.
Jetzt hab ich mir ne Weile den Kopf zermartert, aber ich bin mir nicht ganz sicher wie ich das Anzeigen des Formulars verhindern soll.
Meine erste Idee wäre die MessageProc des Forms umbiegen und im Falle von CM_VISIBLE einfach nichts tun, allerdings erscheint mir das recht unsauber. Zweite Idee wäre über einen Hook WM_SHOWWINDOW abfangen, schauen ob der Empfänger im Formmanager registriert ist und ggf nichts tun. habt ihr noch andere Vorschläge?

viele grüße

SirThornberry 2. Jan 2012 16:33

AW: Formular über Klassenconstructor nicht sichtbar erzeugen
 
Einfach nichts zu machen finde ich falsch da sich der Programmierer dann einen Wolf sucht warum nichts angezeigt wird.
Ich denke hier wäre das Werfen einer Exception angebracht, dann weiß der Programmierer beim Testen sofort das an der Stelle ein Show noch nicht erlaubt ist.

snook 2. Jan 2012 16:49

AW: Formular über Klassenconstructor nicht sichtbar erzeugen
 
OH du bist schon zwei Schritte weiter...
Ich meinte das mit dem nichts tun auch nicht ganz so drastisch wie beschrieben. Wenn ein Form angezeigt werden soll, und der FormManager nen Flag gesetzt hat, dass ihm mitteilt: Halt, warte noch mit dem Anzeigen, dann wird einfach für dieses Form gespeichert, dass es später angezeigt werden soll. Wenn dann alle Initialisierungen im Hintergrund abgeschlossen sind, dann gibts nen Signal und alle ausstehenden Show's werden auch durchgeführt.
Das Problem mit der Exception ist, dass sich der Programmierer dann wohl eher wundert, warum es kracht wenn er nen Form anzeigen will, insbesondere da er ja von den Initialisierungen rund um seine Anwendung drum herum gar nichts mitbekommen soll. Das wird dann wohl mehr Frust auslösen, weil die Stellen an denen die Forms dann angezeigt werden sollen dem Programmierer so gar nicht zugänglich sind. Das heisst ich müsste dann ne ganze Schnittstelle einrichten, über die Forms erzeugt und angezeigt werden können, davor will ich aber eigentlich die Leute schützen. Ich ärger mich sowieso schon genug, dass ich das ganze über nen Manager lösen musste.

Oder hast du noch andere Ideen? mir fällt gerade ein, dass ich ne Message im Ereignisprotoll hinterlassen könnte, aber da wird wohl auch niemand suchen


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