![]() |
Events einer Komponenete in einer NEUEN ererbten Komponente
Ich habe eine Komponente TMyPanel = class(TPanel) geschrieben.
Der Constructor (override) erweiter um L1 := TLabel.Create(self) ein Label auf dem Panel zu erzeugen. Geht auch. Kann auch die von mir gewünschten Eigenschaften von L1 im Objektinspector von TMyPanel ändern. Soweit so gut. Aber ich möchte nicht nur die EVENTs (z.B OnClick) vom Panel verwenden, sondern ich möchte auch das OnClick Ereignis von dem Label, das auf dem Panel liegt, auswerten, weil wenn man auf das Label clickt, dann gibt es von dem daruter liegendem Panel kein OnClick Ereignis . Alle Foren-Tutoriels durchkemmt, aber keine Antwort auf mein Problem gefunden. Jetzt brauche ich einen guten Tip
Delphi-Quellcode:
unit Switch;
interface uses SysUtils , Classes, Controls, ExtCtrls, StdCtrls , Dialogs , Graphics ; { Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Switch } type TMyPanel = class(TPanel) private { Private-Deklarationen } bDown : boolean ; L1 : TLabel ; L2 : TLabel ; L3 : TLabel ; xL1_Top : integer ; xL1_Left : integer ; xL1_Width : integer ; xL1_Height : integer ; xL1_Color : TColor ; xL1_FontName : TFontName ; xL1_FontColor : TColor ; xL1_FontSize : integer ; xL1_Caption : TCaption ; constructor Create(AOwner: TComponent) ; override ; destructor Destroy ; override ; procedure Click ; override ; procedure SetState(bValue : boolean ); procedure Set_L1_Color(yL1_Color : TColor ); procedure Set_L1_FontColor(yL1_FontColor : TColor ); protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property L1_Top : integer read xL1_Top write xL1_Top ; property L1_Left : integer read xL1_Left write xL1_Left ; property L1_Width : integer read xL1_Width write xL1_Width ; property L1_Height : integer read xL1_Height write xL1_Height ; property L1_Color : TColor read xL1_Color write Set_L1_Color ; //xL1_Color ; property L1_FontName : TFontName read xL1_FontName write xL1_FontName ; property L1_FontColor : TColor read xL1_FontColor write Set_L1_FontColor ; //xL1_FontColor ; property L1_FontSize : integer read xL1_FontSize write xL1_FontSize ; property L1_Caption : TCaption read xL1_Caption write xL1_Caption ; property Down : boolean read bDown write SetState ; end; procedure Register; implementation procedure Register; begin RegisterComponents('Dirk', [TMyPanel]); end; constructor TMyPanel.Create(AOwner: TComponent); begin inherited create(AOwner) ; L1 := TLabel.Create(self); L1.Parent := self ; L1.Visible := TRUE ; xL1_Left := 25 ; xL1_Top := 5 ; xL1_Height := 17 ; xL1_Width := 75 ; xL1_Color := clWhite ; xL1_FontName := 'Arial' ; xL1_FontColor := clRed ; xL1_FontSize := 8 ; xL1_Caption := 'L1 = Label1' ; L1.AutoSize := FALSE ; // Festgeschrieben nicht änderbar !! L1.Left := xL1_Left ; L1.Top := xL1_Top ; L1.Height := xL1_Height ; L1.Width := xL1_Width ; L1.Color := xL1_Color ; L1.Font.Name := xL1_FontName ; L1.Font.Color := xL1_FontColor ; L1.Font.Size := xL1_FontSize ; L1.Caption := xL1_Caption ; //================================== L2 := TLabel.Create(self); L2.Parent := self ; L2.Visible := TRUE ; L2.Left := 30 ; L2.Top := 30 ; L2.Height := 10 ; L2.Width := 10 ; L2.Caption := 'y2' ; end; destructor TMyPanel.Destroy ; begin if L1 <> nIl then L1.Free ; if L2 <> nIl then L2.Free ; if L3 <> nIl then L3.Free ; inherited destroy ; end; procedure TMyPanel.Set_L1_Color(yL1_Color : TColor ); begin xL1_Color := yL1_Color ; L1.Color := xL1_Color ; end; procedure TMyPanel.Set_L1_FontColor(yL1_FontColor : TColor ); begin xL1_FontColor := yL1_FontColor ; L1.Font.Color := xL1_FontColor ; end; procedure TMyPanel.Click ; begin if BevelOuter = bvRaised then begin BevelOuter := bvLowered ; bDown := TRUE ; end else begin BevelOuter := bvRaised ; bDown := FALSE ; end; inherited Click ; end; procedure TMyPanel.SetState(bValue: Boolean); begin if bValue = TRUE then begin bDown := TRUE ; BevelOuter := bvLowered ; end else begin bDown := FALSE ; BevelOuter := bvRaised ; end; end; end. |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
Hallo SoGraDes (hübscher Name!),
kannst Du denn nicht das "OnClick" Deines Labels auf das "OnClick" des Panels setzen oder soll ein anderer Code beim "OnClick" des Labels ausgeführt werden? Alternativ kannst Du doch auch dafür ein Property bereitstellen:
Delphi-Quellcode:
Gruß Daddy
property L1_OnClick: TNotifyEvent read FL1OnClick write SetL1OnClick;
procedure SetL1OnClick(Value: TNotifyEvent); begin FL1OnClick := Value; L1.OnClick := FL1OnClick; end; |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
häng dich doch im Constructor in das event des Labels ein und starte ein neues Event am Panel selbst:
Delphi-Quellcode:
//im Creator:
L1.OnClick := Self.LabelClick; {...} procedure TMyPanel.LabelClick(Sender: TObject); begin if Assigned(Self.OnLabelClick) then Self.OnLabelClick(Sender); end; |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
Hi,
in Deinem Konstruktor kannst Du die Zeilen mit dem Test <> nil entfernen. Der Unterschied zwischen Free und Destroy besteht gerade darin, dass Free erst einen Test auf <> nil vornimmt und nur dann den eigentlichen Destruktor (Destroy) aufruft, wenn eine Referenz <> nil übergeben wurde. Du prüfst also hier etwas, dass Du gleich danach erneut prüfst. Was Dein eigentliches Problem angeht, so kannst Du einfach das OnClick-Ereignis des Labels setzen. Dabei gibt es zwei Möglichkeiten, wenn Du eine statische Ereignisbehandlung hast (also das OnClick statisch ist), kannst Du einfach dem Label.OnClick das TMyPanel.OnClick zuweisen. Wird Letzteres aber von außen verändert, müsstest Du dafür sorgen, dass Du dann auch für das Label entsprechend den Methodenzeiger umsetzt (der würde sonst noch auf die alte Behandlung zeigen). Alternativ legst Du einfach einen neue Methode an, deren Signatur einem TNotifyEvent entspricht (also eine Prozedur, Argument Sender vom Typ TObject). In dieser Methode kannst Du dann einfach die Ereignis-Behandlung des TMyPanel aufrufen. Diese Methode wiederum kannst Du dann dem Label zuweisen
Delphi-Quellcode:
Gruß Der Unwissende
procedure TMyPanel.MyLabelOnClick(Sender: TObject);
begin if assigned(self.OnClick) then begin self.OnClick(self); end; end; constructor TMyPanel.Create(AOwner: TComponent); begin inherited create(AOwner) ; L1 := TLabel.Create(self); L1.Parent := self ; L1.Visible := TRUE ; L1.OnClick := self.MyLabelOnClick; .... Ps nach rotem Kasten Ich hatte Dich jetzt so verstanden, dass Du hier wirklich das gleiche Ereignis auslösen möchtest, wie beim Click auf das restliche Panel? Ansonsten treffen es die anderen Beiträge wohl besser! |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
Hallo Der Unwissende,
in diesem Bereich habe ich deutliche Verständnisprobleme, Wissensdefizite. Brauch also noch ein paar Tips. Ich habe Deinen Vorschlag umgesetzt (siehe Code) In dem Programm wird bei dem die Procdure Click vom TPanel überschrieben, damit ein Click auf das Panel eine Änderung der BevelOuter hervorruft. Wenn ich jetzt ein (oder mehrere) Label auf dem Panel habe, und mit der Mouse(links) auf das/die Label clicke, dann soll das GLEICHE passieren, als wenn ich auf das Panel geclicked hätte. Wenn ich Deinen Vorschlag richtig (was nicht sicher ist) verstanden habe, dann wird dabei aber der Panel Click-Event auf den Label Click-Event gelegt ?? Oder habe icch es überhaupt nicht verstanden ?? Wenn ich den beiliegenden Code verwende, regiert die Procedure TMyPanel.Click wenn ich auf das Panel cklicke aber nicht, wenn ich auf das Label clicke. Ich würde mich sehr freuen, wenn ich Hilfe bekomme. Hallo Cruiser, ich habe Deine Version auch getestet, aber da bekomme ich eine ein Problem mit OnLabelClick , weil das nicht bekannt ist. Wie hätte ich es deklarieren sollen ? Und habe ich dann nicht auch das Problem, dass das Panel - Event auf das Label-Event zugewiesen wird ? Ich will aber meine Procdure Click vom TPanel ausgeführt haben. Hier der Code nach dem Vorschlag von Der Unwissende :
Delphi-Quellcode:
unit Switch;
interface uses SysUtils , Classes, Controls, ExtCtrls, StdCtrls , Dialogs , Graphics ; { Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Switch } type TMyPanel = class(TPanel) private { Private-Deklarationen } bDown : boolean ; L1 : TLabel ; L2 : TLabel ; L3 : TLabel ; xL1_Top : integer ; xL1_Left : integer ; xL1_Width : integer ; xL1_Height : integer ; xL1_Color : TColor ; xL1_FontName : TFontName ; xL1_FontColor : TColor ; xL1_FontSize : integer ; xL1_Caption : TCaption ; constructor Create(AOwner: TComponent) ; override ; destructor Destroy ; override ; procedure Click ; override ; procedure SetState(bValue : boolean ); procedure Set_L1_Color(yL1_Color : TColor ); procedure Set_L1_FontColor(yL1_FontColor : TColor ); procedure MyLabelOnClick(Sender: TObject); protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property L1_Top : integer read xL1_Top write xL1_Top ; property L1_Left : integer read xL1_Left write xL1_Left ; property L1_Width : integer read xL1_Width write xL1_Width ; property L1_Height : integer read xL1_Height write xL1_Height ; property L1_Color : TColor read xL1_Color write Set_L1_Color ; //xL1_Color ; property L1_FontName : TFontName read xL1_FontName write xL1_FontName ; property L1_FontColor : TColor read xL1_FontColor write Set_L1_FontColor ; //xL1_FontColor ; property L1_FontSize : integer read xL1_FontSize write xL1_FontSize ; property L1_Caption : TCaption read xL1_Caption write xL1_Caption ; property Down : boolean read bDown write SetState ; end; procedure Register; implementation procedure Register; begin RegisterComponents('Dirk', [TMyPanel]); end; constructor TMyPanel.Create(AOwner: TComponent); begin inherited create(AOwner) ; L1 := TLabel.Create(self); L1.Parent := self ; L1.Visible := TRUE ; L1.OnClick := Self.MyLabelOnClick ; //Self.Onclick := L1.OnClick ; xL1_Left := 25 ; xL1_Top := 5 ; xL1_Height := 17 ; xL1_Width := 75 ; xL1_Color := clWhite ; xL1_FontName := 'Arial' ; xL1_FontColor := clRed ; xL1_FontSize := 8 ; xL1_Caption := 'L1 = Label1' ; L1.AutoSize := FALSE ; // Festgeschrieben nicht änderbar !! L1.Left := xL1_Left ; L1.Top := xL1_Top ; L1.Height := xL1_Height ; L1.Width := xL1_Width ; L1.Color := xL1_Color ; L1.Font.Name := xL1_FontName ; L1.Font.Color := xL1_FontColor ; L1.Font.Size := xL1_FontSize ; L1.Caption := xL1_Caption ; //================================== L2 := TLabel.Create(self); L2.Parent := self ; L2.Visible := TRUE ; L2.Left := 30 ; L2.Top := 30 ; L2.Height := 10 ; L2.Width := 10 ; L2.Caption := 'y2' ; end; procedure TMyPanel.MyLabelOnClick; begin if Assigned(Self.OnClick) then begin self.OnClick(self) ; end; end; destructor TMyPanel.Destroy ; begin L1.Free ; L2.Free ; L3.Free ; inherited destroy ; end; procedure TMyPanel.Set_L1_Color(yL1_Color : TColor ); begin xL1_Color := yL1_Color ; L1.Color := xL1_Color ; end; procedure TMyPanel.Set_L1_FontColor(yL1_FontColor : TColor ); begin xL1_FontColor := yL1_FontColor ; L1.Font.Color := xL1_FontColor ; end; procedure TMyPanel.Click ; begin if BevelOuter = bvRaised then begin BevelOuter := bvLowered ; bDown := TRUE ; end else begin BevelOuter := bvRaised ; bDown := FALSE ; end; inherited Click ; end; procedure TMyPanel.SetState(bValue: Boolean); begin if bValue = TRUE then begin bDown := TRUE ; BevelOuter := bvLowered ; end else begin bDown := FALSE ; BevelOuter := bvRaised ; end; end; end. |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
So wie ich das sehe, musst Du im "MyLabelOnClick" nicht "OnClick" aufrufen, sondern "Click" damit es funktioniert. Und zwar deshalb, weil Du das Ändern des Rahmens doch gar nicht im "OnClick" des Panels duchführst, sondern im von Dir überschriebenen "Click".
Gruß Daddy |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
Hi Daddy,
danke für die Info, klappt aber nicht. Zitat:
aber ich weis nicht wie ........! Deine Alternative gibt wie beabsichtigt, den Event L1_OnClick im OI des Panel wieder, und man kann eine Ereignis-Routine programmieren. Ist für andere Fälle auch sehr schön. Aber bei mir soll das Überschriebene Click des Panels beide Clicks, den vom Panel und den vom Label bearbeiten. UND DAS GEHT NICHT :pale: :wall: Es wird also noch immer nach einer Lösung gesucht. Wenn jemand eine Idee hat, wo ich noch nachlesen, Beispiele oder ... nachsehen kann , würde mir auch helfen. |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
Beachte bitte meinen Beitrag #6. Funktioniert es damit denn nicht? Du schreibst immer, dass Du "OnClick" ersetzen möchtest. Aber in Deinem Panel führst Du den beschriebenen Code doch direkt im "Click" aus.
Gruß Daddy |
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
puh... das war auch nur halber pseudo-code... aber wenn du magst leite ich mal ein Panel mit Label ab... so als Anschauungsbeispiel.
|
Re: Events einer Komponenete in einer NEUEN ererbten Kompone
Hallo Daddy,
#6 habe ich versucht und es geht nicht. Zitat:
Hallo cruiser, Dein Angebot nehme ich gerne an, vielleicht lerne ich dann auch gleich was für die Zukunft. Vielen dank im Voraus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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