Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Objektereignisse bei abgeleiteten Klassen (https://www.delphipraxis.net/187890-objektereignisse-bei-abgeleiteten-klassen.html)

Jean312 13. Jan 2016 05:18

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?

bepe 13. Jan 2016 06:24

AW: Objektereignisse bei abgeleiteten Klassen
 
Du musst die Ereignisbehandlungsroutinen auch den entsprechenden Eigenschaften deiner Objekte zuweisen.

Delphi-Quellcode:
...
var
  MeineInstanz: TMeinEdit;
begin
  MeineInstanz := TMeinEdit.Create;
  MeineInstanz.OnChange := MeinObjektChange;
...
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.

Jean312 13. Jan 2016 15:35

AW: Objektereignisse bei abgeleiteten Klassen
 
Vielen Dank für die Info. Ist das erste Mal, dass ich mich mit einer Klassenableitung beschäftige.

Jean312 14. Jan 2016 05:08

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:

Dejan Vu 14. Jan 2016 06:01

AW: Objektereignisse bei abgeleiteten Klassen
 
Wo sollen sie denn 'verfügbar' sein? Im Objektinspektor? Dann muss die Property 'Published' sein.

DeddyH 14. Jan 2016 07:32

AW: Objektereignisse bei abgeleiteten Klassen
 
Und auch das reicht nicht, sie muss auch in der IDE registriert sein.

Jean312 14. Jan 2016 15:52

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:
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 }
...
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.
Und hier komme ich nicht klar, wie das OnChange-Ereignis dann aufgerufen werden kann. Sorry. :oops:

Perlsau 14. Jan 2016 17:19

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:
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;
Ob das neue Property nun public oder published ist, bleibt dir überlassen.

Dejan Vu 14. Jan 2016 18:27

AW: Objektereignisse bei abgeleiteten Klassen
 
Und denk an DeddyH seine Worte ('Registrieren').

Jean312 15. Jan 2016 03:52

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 09:23 Uhr.
Seite 1 von 2  1 2      

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