![]() |
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? |
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). |
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; |
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.
|
Re: Platzieren der Komponente verweigern.
Zitat:
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; |
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 11:36 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-2025 by Thomas Breitkreuz