Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Neue Klasse von Komponente ableiten --> wie? (https://www.delphipraxis.net/26921-neue-klasse-von-komponente-ableiten-wie.html)

Tubos 31. Jul 2004 21:24


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:
type TUDPClientThreadsafe = class(TIdUDPClient)
 private
 public
end;
und dann bei TForm1 den Eintrag für den UDP-Client von
Delphi-Quellcode:
client: TIdUDPClient
auf
Delphi-Quellcode:
client: TUDPClientThreadsafe;
umgeändert.

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!

Luckie 31. Jul 2004 21:33

Re: Neue Klasse von Komponente ableiten --> wie?
 
Hm. Da muss noch irgendwo was in deinem Code sein, was nicht stimmt. Denn das
Delphi-Quellcode:
type
  TMyButton = class(TButton)
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  MyButton: TMyButton;
begin

end;
kompiliert ohne Warnungen oder Hinweise.

bttb930 31. Jul 2004 22:10

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:
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;
In FormDestroy (oder FormClose) mußt Du dann noch deine von der Komponente abgeleitete Instanz freigeben.

Tubos 31. Jul 2004 23:21

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:

Wenn Du ein Objekt von einer Komponente ableiten möchtest, dann mußt Du es im Programmteil erzeugen.
Kann ich das Objekt / eine Komponente nicht so ableiten, dass ich die Komponente ganz normal verwenden kann?

SirThornberry 1. Aug 2004 07:22

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.

woki 1. Aug 2004 08:47

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

Hansa 1. Aug 2004 09:36

Re: Neue Klasse von Komponente ableiten --> wie?
 
Zitat:

Zitat von Tubos
Ich will von dem Indy-UDP-Client eine neue Klasse ableiten, die ein paar Änderungen hat (z.B. ist die Methode send thread-sicher).

Als erstes mußt du dir darüber klar werden, wie diese "Änderungen" den Zugriff erlauben sollen. Soll das ganze im Objekt-Inspektor sichtbar sein, so muß ein package her. Auch eine Register-Prozedur. Und entsprechende Methoden für deine neuen Properties. Man braucht eine, um den vorhandenen Wert zu lesen und eine, um einen neuen Wert zu setzen.

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 14:35 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