![]() |
[Gelöst]Eigene Komponenten ruft über Designer kein Create auf
Hallo zusammen :),
ich habe eine eigene Komponente entwickelt, oder besser gesagt, bin dabei. Ich habe die letzten Wochen damit verbracht, ein Klassenmodell zu entwickeln, mit Inhalt zu füllen und nun in eine schöne Komponente zu verpacken. Meine Komponente funktioniert soweit bestens, wenn ich sie "manuell" benutze. Beispiel: Meine Komponente:
Delphi-Quellcode:
Mit "Manuell" meine ich folgendes:
unit Component1;
interface uses SysUtils, Classes; type TMyCompo = class(TComponent) private { Private declarations } procedure DoSomethingImportant; protected { Protected declarations } public { Public declarations } constructor Create; destructor Destroy;override; public procedure DoFoobar; published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TComponent1]); end; { TMyCompo } constructor TMyCompo.Create; begin inherited; DoSomethingImportant; end; destructor TMyCompo.Destroy; begin inherited; end; procedure TMyCompo.DoSomethingImportant; begin Foobar; end; end. Ich deklariere mir eine Variable vom Typ TMyCompo:
Delphi-Quellcode:
Und benutze sie dann:
var
myCompo: TMyCompo;
Delphi-Quellcode:
Am Ende dann ein
myCompo := TMyCompo.Create;
myCompo.DoFoobar;
Delphi-Quellcode:
if Assigned(myCompo) then
myCompo.free; Das funktioniert wunderbar. Wenn ich die Komponente nun aber über den Designer auf meine Form ziehe und mein Programm ausführe, also so:
Delphi-Quellcode:
und diese dann benutzen will:
TForm1 = class(TForm)
MyCompo1: TMyCompo; private { Private declarations } public { Public declarations } end;
Delphi-Quellcode:
gibt es einen crash, weil ich feststellte, dass das Create der KOmponente nicht ausgeführt worden ist.
procedure Button1CLick(Sender : TObject);
begin MyCompo1.DoFoobar; end; Weil die Prozedure, in dem Fall: DoSomethingImportant nicht ausgeführt wurde. Und es ist wichtig, dass DoSomethingImportant ausgeführt wird, damit DoFoobar funktioniert. Kann ich also davon ausgehen, dass das Create nicht aufgerufen wurde? Bzw. was kann ich tun, dass das Create meiner Komponente trotz Designer richtig ausgeführt wird? Viele Grüßen bei weiteren Fragen bitte melden :) |
AW: Eigene Komponenten ruft über Designer kein Create auf
Der Grund das dein Constructor nicht aufgerufen ist recht einfach:
Du leitest von TComponent (oder einem Nachfahren) ab so wie es sich auch gehört für Komponenten die man später im Designer platzieren will. So weit hast du richtig gehandelt. Jetzt aber zu deinem Fehler. Delphi kann keine Gedanken lesen und weiß entsprechend nicht welche Parameter bei welchem Konstructor notwendig sind. Baut sich zum Beispiel jemand ein Create das wie folgt aussieht:
Delphi-Quellcode:
so weiß Delphi natürlich nicht was es dort übergeben soll. Entsprechend werden alle Komponenten mit dem Constructor von TComponent erstellt. Damit ein eigener Konstructor also aufgerufen wird musst du den von TComponent überschreiben:
constructor Create(MeinTollerTyp: TSuperTyp);
falsch:
Delphi-Quellcode:
richtig:
constructor Create;
Delphi-Quellcode:
gleiches gilt übrigens auf den destructor.
constructor Create(AOwner: TComponent); override;
Am besten du schaust dir mal ein Tutorial zur Vererbung etc. an |
AW: Eigene Komponenten ruft über Designer kein Create auf
Ahh, klingt logisch klar :)
Danke, SirThornberry. Hat Prima geklappt. Viele Grüße und Danke :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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