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 Platzieren der Komponente verweigern. (https://www.delphipraxis.net/33049-platzieren-der-komponente-verweigern.html)

Mystic 31. Okt 2004 23:26


Platzieren der Komponente verweigern.
 
Ich bin gerade dabei eine Komponente zu programmieren.

Wenn die Komponente beim Platzieren nicht direkt auf das Formular kommt (Also das Formular nicht als Parent hat) oder wenn bereits eine Instanz dieser Komponente auf dem Formular existiert, soll es einen Fehler geben und die Komponente nicht platziert werden.

Wie mache ich das?

nailor 31. Okt 2004 23:44

Re: Platzieren der Komponente verweigern.
 
Teil 1: du kannst auch schon Code für die Design-Time haben. Benutz' mal die Suche, da wirst du hoffentlich was finden. Dann einfach testen, ob das Parent vom Typ TForm ist, und wenn nicht meckern.

Teil 2: Informier dich am besten über Singletons. Ich kenn die nur von anderen Sprachen, und weiß nicht, ob die in Delphi auch gehen, aber die sind genau das, was du willst (glaub ich).

Mystic 1. Nov 2004 00:31

Re: Platzieren der Komponente verweigern.
 
Hab das jetzt so realisiert:
Delphi-Quellcode:
constructor TLayeredForm.Create(AOwner: TComponent);
  var i: Word; c: TComponent;
begin
  inherited;
  if csDesigning in ComponentState then begin
    c := Owner;
    while not c.InheritsFrom(TCustomForm) do begin
      c := c.Owner;
      if c = nil then begin
        raise Exception.Create('The LayeredForm component must be put on a form!');
        self.Destroy;
        exit;
      end;
    end;
    Owner := c;
    for i := 0 to Owner.ComponentCount -1 do
      if (Owner.Components[i].InheritsFrom(TLayeredForm)) and (Owner.Components[i] <> self) then begin
        raise Exception.Create('There can be only one LayeredForm component on every form!');
        self.Destroy;
        exit;
      end;
  end;
end;

nailor 1. Nov 2004 01:55

Re: Platzieren der Komponente verweigern.
 
sieht gut aus, auf den ersten Blick. Aber ich glaube, du kannst zur Laufzeit noch weitere Instanzen auf dein Form klatschen.

Mystic 1. Nov 2004 02:00

Re: Platzieren der Komponente verweigern.
 
Zitat:

Zitat von nailor
Aber ich glaube, du kannst zur Laufzeit noch weitere Instanzen auf dein Form klatschen.

Warum?

Owner war leider ReadOnly, deswegen sieht es jetzt so aus:
Delphi-Quellcode:
constructor TLayeredForm.Create(AOwner: TComponent);
  var i: Word;
begin
  inherited;
  if csDesigning in ComponentState then begin
    if not Owner.InheritsFrom(TForm) then begin
      raise Exception.Create('The LayeredForm component must be put on a form!');
      self.Destroy;
      exit;
    end;
    for i := 0 to Owner.ComponentCount -1 do
      if (Owner.Components[i].InheritsFrom(TLayeredForm)) and (Owner.Components[i] <> self) then begin
        raise Exception.Create('There can be only one LayeredForm component on every form!');
        self.Destroy;
        exit;
      end;
    (Owner as TForm).BorderStyle := bsNone;
  end else begin
    bf^.BlendOp := AC_SRC_OVER;
    bf^.BlendFlags := 0;
    bf^.SourceConstantAlpha := 0;
    bf^.AlphaFormat := AC_SRC_ALPHA;
    setWindowLong((Owner as TForm).Handle, GWL_EXSTYLE, getWindowLong((Owner as TForm).Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  end;
end;

Robert Marquardt 1. Nov 2004 07:44

Re: Platzieren der Komponente verweigern.
 
Kein Self.Destroy aufrufen!
Wird eine Exception im Konstruktor ausgeloest, so wird automatisc der Destruktor aufgerufen.
Dort sollte man beim Aufraeumen beruecksichtigen, das einige Initialisierungen im Konstruktor moeglicherweise nicht aufgerufen wurden.

Die Source ist insofern falsch als weder Self.Destroy noch Exit je aufgerufen werden.
Die Exception bricht den Konstruktor sowieso unmittelbar ab.

Es ist anzumerken das die IDE gelegentlich sauer auf solche Exceptions reagiert.


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