![]() |
Objektereignisse bei abgeleiteten Klassen
Hallo,
für eine Anwendung benötige ich erweiterte Eigenschaften für TEdit und TComboBox. Für diese beiden Komponenten habe ich zwei separate units in das Projekt eingebunden, wo die entsprechenden Eigenschaften als Klassenableitung der jeweiligen Hauptkomponenten enthalten sind. Die Objekte werden zur Laufzeit erzeugt. Nun möchte ich aber während der Laufzeit die Standard-Ereignisse benutzen, wie z.B. OnChange oder OnClick. Bei den Standard-Komponenten ist das ja kein Problem, klickt man ja nur auf das entsprechende Ereignis im OI und die Prozedur wird angelegt. Wenn ich aber selbst die Prozedur MeinObjektChange(Sender: TObject) erzeuge, wird das Ereignis OnChange aber nicht ausgelöst. Im Debug-Mode ist im Quelltexteditor auch kein Marker bei dieser selbst erstellten Prozedur. Ich habe auch versucht, in den Units der beiden abgeleiteten Komponenten, die benötigten Ereignisse OnChange und OnClick als published Property aufzunehmen. Das Ergebnis ist jedoch das gleiche. Auf das jeweils gewünschte Ereignis wird nicht reagiert. Was mache ich da falsch? |
AW: Objektereignisse bei abgeleiteten Klassen
Du musst die Ereignisbehandlungsroutinen auch den entsprechenden Eigenschaften deiner Objekte zuweisen.
Delphi-Quellcode:
Jetzt sind die Marker auch da (Methode ist nicht mehr ungenutzt und wird deshalb nicht mehr entfernt) und dein Edit hat "etwas" zum ausführen wenn das Ereignis eintritt.
...
var MeineInstanz: TMeinEdit; begin MeineInstanz := TMeinEdit.Create; MeineInstanz.OnChange := MeinObjektChange; ... |
AW: Objektereignisse bei abgeleiteten Klassen
Vielen Dank für die Info. Ist das erste Mal, dass ich mich mit einer Klassenableitung beschäftige.
|
AW: Objektereignisse bei abgeleiteten Klassen
Sorry, irgendwie verstehe ich es nicht.
Soweit ich gelesen habe, werden die Eigenschaften der vererbten Klasse mitgegeben. Wenn ich also von TEDit eine Ableitung mache und ein property beispielsweise hinzufüge, bin ich davon ausgegangen, dass alle Eigenschaften von TEdit + das hinzugefügte property in der abgeleiteten Klasse verfügbar sind. Irrtum meinerseits oder falsch verstanden? :roll: |
AW: Objektereignisse bei abgeleiteten Klassen
Wo sollen sie denn 'verfügbar' sein? Im Objektinspektor? Dann muss die Property 'Published' sein.
|
AW: Objektereignisse bei abgeleiteten Klassen
Und auch das reicht nicht, sie muss auch in der IDE registriert sein.
|
AW: Objektereignisse bei abgeleiteten Klassen
Es geht hier ganz speziell um das OnChange-Ereignis. Die Komponente ist nicht im OI. Die abgeleitete Komponente ist über eine eigene Unit eingebunden.
Code:
Während der Laufzeit möchte ich dann in der MainUnit auf das OnChange-Ereignis einzelner Tedit-Komponenten (die mit erweiterten Eigenschaften während der Laufzeit erzeugt werden) reagieren.
type
{ TEditExt } TEditExt = Class(TEdit) private FCanvas:TCanvas; FCTextHint:string; FRequired:boolean; procedure WMPaint(var Message: TWMPaint); message WM_Paint; procedure SetCTextHint(const Value:string); protected procedure WndProc(var Message:TMessage); override; procedure Paint; virtual; procedure PaintWindow(DC:HDC);override; property Canvas:TCanvas read FCanvas; public constructor Create(AOwner:TComponent);override; destructor Destroy; override; property CTextHint:string read FCTextHint write SetCTextHint; property Required:boolean read FRequired write FRequired Default False; procedure PaintRedFrame; published property onClick; property onChange; end; implementation { TEditExt } ... Und hier komme ich nicht klar, wie das OnChange-Ereignis dann aufgerufen werden kann. Sorry. :oops: |
AW: Objektereignisse bei abgeleiteten Klassen
Wenn du eine Klasse entwickelst, die ein bereits verfügbares Objekt darstellen soll und zu diesem Zweck von der Klasse dieses verfügbaren Objekts ableitest, hast du erst einmal eine Komponente, die bereits alle Variablen und Methoden der Ursprungskomponente enthält. Die darin mußt du also nicht noch einmal deklarieren, denn sie sind in der neuen Klasse bereits durch Vererbung vorhanden – also eine 1:1-Kopie. Du mußt hier also nichts aus dem Quellcode der Ursprungsklasse kopieren. Nun möchtest du ein Property hinzufügen. Das fügst du hinzu mit allem was dazu gehört. Ansonsten mußt du nichts weiter hinzufügen. Wenn du in der neuen Klasse geerbte Methoden noch einmal deklarierst, überschreibst du damit die ursprünglichen und mußt sie dann natürlich auch selbst implementieren. Wenn du dagegen vorhandene Methoden lediglich erweitern willst, verwendest du den Befehl inherited. Das würde jetzt aber erst mal zu weit führen.
Delphi-Quellcode:
Ob das neue Property nun public oder published ist,
type
TEditExt = Class(TEdit) private fMyProperty : Integer; function GetfMyProperty : Integer; procedure SetfMyProperty(value: Integer); protected public published property MyNewProperty : Integer read GetfMyProperty write SetfMyProperty; end; implementation function TEditExt.GetfMyProperty : Integer; begin Result := fMyProperty; end; procedure TEditExt.SetfMyProperty(value: Integer); begin fMyProperty := Value; end; ![]() |
AW: Objektereignisse bei abgeleiteten Klassen
Und denk an DeddyH seine Worte ('Registrieren').
|
AW: Objektereignisse bei abgeleiteten Klassen
Wie kann ich aber das OnChange-Ereignis für diese abgeleitete Komponente nutzen? OnChange ist doch von der übergeordneten Klasse TEdit mit vererbt worden?
|
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