Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi [Gelöst]Eigene Komponenten ruft über Designer kein Create auf (https://www.delphipraxis.net/153427-%5Bgeloest%5Deigene-komponenten-ruft-ueber-designer-kein-create-auf.html)

ColeZero 2. Aug 2010 15:34


[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:
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.
Mit "Manuell" meine ich folgendes:
Ich deklariere mir eine Variable vom Typ TMyCompo:
Delphi-Quellcode:
var
  myCompo: TMyCompo;
Und benutze sie dann:

Delphi-Quellcode:
 myCompo := TMyCompo.Create;
 myCompo.DoFoobar;
Am Ende dann ein

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:
  TForm1 = class(TForm)
    MyCompo1: TMyCompo;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
und diese dann benutzen will:

Delphi-Quellcode:
procedure Button1CLick(Sender : TObject);
begin
 MyCompo1.DoFoobar;
end;
gibt es einen crash, weil ich feststellte, dass das Create der KOmponente nicht ausgeführt worden ist.
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 :)

SirThornberry 2. Aug 2010 15:55

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:
constructor Create(MeinTollerTyp: TSuperTyp);
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:
falsch:
Delphi-Quellcode:
constructor Create;
richtig:
Delphi-Quellcode:
constructor Create(AOwner: TComponent); override;
gleiches gilt übrigens auf den destructor.
Am besten du schaust dir mal ein Tutorial zur Vererbung etc. an

ColeZero 2. Aug 2010 16:46

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 04:47 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