![]() |
Neue Klasse von Komponente ableiten --> wie?
Hallo;
Ich will von dem Indy-UDP-Client eine neue Klasse ableiten, die ein paar Änderungen hat (z.B. ist die Methode send thread-sicher). Habe zum Testen mal einfach eine neue Klasse ohne Änderung erstellt:
Delphi-Quellcode:
und dann bei TForm1 den Eintrag für den UDP-Client von
type TUDPClientThreadsafe = class(TIdUDPClient)
private public end;
Delphi-Quellcode:
auf
client: TIdUDPClient
Delphi-Quellcode:
umgeändert.
client: TUDPClientThreadsafe;
Jetzt fragt Delphi beim Kompilieren: "Feld Form1.client muss vom Typ TIdUDPClient sein, ist aber als TUDPClientThreadsafe deklariert. Soll die Deklaration korrigiert werden?" Wie schaffe ich es also, eine Klasse von einer Komponente abzuleiten? Bei TForm1 geht es doch auch! |
Re: Neue Klasse von Komponente ableiten --> wie?
Hm. Da muss noch irgendwo was in deinem Code sein, was nicht stimmt. Denn das
Delphi-Quellcode:
kompiliert ohne Warnungen oder Hinweise.
type
TMyButton = class(TButton) private public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var MyButton: TMyButton; begin end; |
Re: Neue Klasse von Komponente ableiten --> wie?
naja, so geht das aber nicht.
du hast richtig von einer komponente abgeleitet, du hast aber einfach den Typ der auf der Form vorhandenen Komponente im Quelltext verändert. Delphi speichert die auf der Form enthaltenen Angaben nicht nur im Form1 = class(TForm)-Teil (indem jeder Button, jedes Label, ... hier auftaucht), sondern auch in der zur Form gehörigen DFM-Datei. Wenn Du ein Objekt von einer Komponente ableiten möchtest, dann mußt Du es im Programmteil erzeugen. Also:
Delphi-Quellcode:
In FormDestroy (oder FormClose) mußt Du dann noch deine von der Komponente abgeleitete Instanz freigeben.
type
TMyButton = class(TButton) // ... end; TForm1 = class(TForm); // alle von Delphi eingefügten Komponenten die man auch auf // der Form sieht, also Burttons, Labels, ... private FMyButton: TMyButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); .... end; ... procedure TForm1.FormCreate(Sender); begin FMyButton := TMyButton.Create; FMyButton.Left := 12; FMyButton..... ... end; |
Re: Neue Klasse von Komponente ableiten --> wie?
Habe genau dasselbe wie mit dem UDP-Client mit einem einfachen Button ausprobiert.
Ich habe zuerst die Komponente raufgesetzt, dann eine Ableitung erstellt und dann von TButton auf MyButton umgeändert. Dann kam diese Meldung. Zitat:
|
Re: Neue Klasse von Komponente ableiten --> wie?
dann musst du die Komponente erst in ein Package packen und in diesem die Komponente registrieren. Dann kannst du die Komponente auch auf dein Form setzen.
|
Re: Neue Klasse von Komponente ableiten --> wie?
Hi,
etwas mehr Handarbeit kann ja sehr lehrreich sein, der geplante Weg ist jedoch einfach Menü Komponente|Neue Komponente. Empfehlenswert ist es aber, eine neue Komponente solange per Code zu handeln, bis sie recht gut funktioniert. Dann erst als Komponente installieren. Man muß bedenken, das installierte Komponenten im Prozess der IDE mitlaufen, und damit bei Fehlern Delphi mit in die Tiefe reißen. Grüsse Woki |
Re: Neue Klasse von Komponente ableiten --> wie?
Zitat:
Normalerweise müssen auch noch ein Constructor und Destructor her. Der Identifier "inherited" darf nicht vergessen werden, um die vorhandenen Methoden der Vorfahr-Komponente zu benutzen. Hört sich kompliziert an und ist es auch. Eventuell reicht aber die Objektablage aus, um zum Ziel zu kommen. Du kannst damit eine Komponente automatisch ableiten. Seltsamerweise benutzt die außer mir kaum jemand. Anscheinend wurde meist nicht bemerkt, daß man dort auch "inherited" als Option hat. Und das könnte das sein, was du suchst. Dann läuft zumindest das mit dem Button u.Ä. automatisch ab. Also die unverzichtbaren Methoden werden für dich angelegt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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