![]() |
Eigene Komponente mit erweitertem Construktor?
Hallo,
eine eigene Komponente erzeuge ich normalerweise mit
Delphi-Quellcode:
ich möchte jetzt den Aufruf von Create um einen weiteren Parameter erweitern (z.B. ein Dateiname einer Datei die im Create bereits geladen werden soll)
constructor Create(AOwner: TComponent); override;
... constructor TMyControl.Create(AOwner: TComponent); begin inherited Create(AOwner); ... Irgendwie fehlt mir der Ansatz wie man das bewerkstelligen könnte ... Ciao Stefan |
AW: Eigene Komponente mit erweitertem Construktor?
Bei (GUI)-Controls sollte man das nicht machen, da diese ja nach nicht mehr ohne Einschränkung durch "Fallen lassen" in der Delphi-IDE eingestzt werden können.
Den das normale Dephi-DFM-Streaming zum erzeugen des Formulares kann nur mit dem Standard-Konstruktor umgehen. |
AW: Eigene Komponente mit erweitertem Construktor?
Ohne das
Delphi-Quellcode:
, da du ja was Neues machst. :zwinker:
override
Und wie bereits gemacht, das
Delphi-Quellcode:
mit explititem Aufruf
inherited;
Delphi-Quellcode:
, aber besser ohne Inherited, also nur
inherited Create(AOwner);
Delphi-Quellcode:
, siehe abschließenden Absatz.
Create(AOwner);
Eventuell aber mit
Delphi-Quellcode:
, falls du es in Nachfahren überschreiben willst.
virtual
Aber zu bedenken ist, dass bei Erstellung über die DFM (Komponente auf der Form) immer nur das originale Create(AOwner) vom DFM-Loader aufgerufen wird, also wichtige Initialisierungscodes müssen immer in Create. Aus diesem Grund auch ohne inherited, um auch nachfolgende Überschreibungen von Create(AOwner) zu erwischen. [edit] Wie Bernhard schon sagte: Der wichtige Code muß ins originale Create und nur zusätzlicher/abweichender Codes in deinen neuen Constructor. Da dann auch immer den normalen Constructor
Delphi-Quellcode:
aufrufen ... wenn es nicht anders geht, dann
Create(AOwner)
Delphi-Quellcode:
als
Create(AOwner)
Delphi-Quellcode:
dekalieren und ein weiteres Überschreiben sperren.
final
|
AW: Eigene Komponente mit erweitertem Construktor?
Hmm..
Um eine neue neue Function/Constructor mit anderen Parameter zu erstellen gibt es (meines Wissens) das reintroduce, damit wird ähnlich des Overloads eine neue Function mit anderen Parametern angelegt, mit dem Unterschied, dass die Überschriebene Function der Vorgängerclasse nicht mehr direkt verwenden kann. Wenn Du nur eine 2., alternative Funktion erstellen willst, ist das overload statt reintroduce das Richtige. Ersetzen:
Delphi-Quellcode:
constructor Create(AOwner: TComponent;AFileName : string); reintroduce;
... constructor TMyControl.Create(AOwner: TComponent;AFileName : string); begin inherited Create(AOwner); FFileName := AFileName; end; ... Zusätzlich
Delphi-Quellcode:
constructor Create(AOwner: TComponent;AFileName : string); overload;
... constructor TMyControl.Create(AOwner: TComponent;AFileName : string); begin inherited Create(AOwner); FFileName := AFileName; end; ... |
AW: Eigene Komponente mit erweitertem Construktor?
Nein, reintroduce gibt nur dem Compiler zu verstehen, dass du absichtlich eine alte virtuelle Methode verdecken willst, und deaktiviert da die Compilerwarnung.
Es ist quasi das Gegenteil von
Delphi-Quellcode:
.
overload
![]() Ist nötig, wenn man nur den neuen Constructor verwenden und den alten Constructor verstecken will, was aber keine gute Idee ist, falls die Komponente auch auf eine Form gepappt werden kann/darf. |
AW: Eigene Komponente mit erweitertem Construktor?
Hmm.
Zitat:
hatte ich das nicht geschrieben: Zitat:
|
AW: Eigene Komponente mit erweitertem Construktor?
Vielen Dank, ich denke da komme ich jetzt weiter!
Diese Komponente wird (aus hier nicht zu erklärenden Gründen) nicht in der Komponentenpalette installiert werden und wird immer per Code erzeugt, damit sind ein paar Einwände "entkräftet"... Was ich aber gerade denke: Kann man eine public Property der Komponente bereits vor dem Create beschreiben und im Create verwenden? Also z.B. einen Filenamen setzen bevor Create aufgerufen wird (diese Datei soll das Aussehen der Komponente steuern). Ich mag für so was keine globale Variable einsetzen... Ciao Stefan |
AW: Eigene Komponente mit erweitertem Construktor?
Du kannst keine Eigenschaften von etwas setzen, was noch gar nicht existiert. Ohne Variable außerhalb der Klasse (oder evtl. eine Klassenvariable), die Du initialisierst und deren Wert Du im/nach dem Konstruktor dann der Property zuweist, dürfte das also schwierig werden.
|
AW: Eigene Komponente mit erweitertem Construktor?
Zitat:
Dann reicht eine Ableitung von TObject auch aus. |
AW: Eigene Komponente mit erweitertem Construktor?
Zitat:
Edit: Sorry, Bernhard war schneller. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 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