Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Events einer Komponenete in einer NEUEN ererbten Komponente (https://www.delphipraxis.net/91811-events-einer-komponenete-einer-neuen-ererbten-komponente.html)

SoGraDEs 10. Mai 2007 11:00


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.

daddy 10. Mai 2007 11:14

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:
property L1_OnClick: TNotifyEvent read FL1OnClick write SetL1OnClick;

procedure SetL1OnClick(Value: TNotifyEvent);
begin
  FL1OnClick := Value;
  L1.OnClick := FL1OnClick;
end;
Gruß Daddy

cruiser 10. Mai 2007 11:14

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;

Der_Unwissende 10. Mai 2007 11:23

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:
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;
....
Gruß Der Unwissende

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!

SoGraDEs 10. Mai 2007 12:42

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.

daddy 10. Mai 2007 12:51

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

SoGraDEs 10. Mai 2007 13:35

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Hi Daddy,
danke für die Info, klappt aber nicht.

Zitat:

Zitat von daddy
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?

Ich würde gern das "OnClick" meines Labels auf das "OnClick" des Panels setzen,
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.

daddy 10. Mai 2007 13:59

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

cruiser 10. Mai 2007 14:19

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.

SoGraDEs 10. Mai 2007 14:32

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Hallo Daddy,

#6 habe ich versucht und es geht nicht.

Zitat:

Zitat von SoGraDEs
Aber bei mir soll das Überschriebene Click des Panels beide Clicks, den vom Panel und
den vom Label bearbeiten.

also nicht die OnClicks !

Hallo cruiser,
Dein Angebot nehme ich gerne an, vielleicht lerne ich dann auch gleich was für die Zukunft.

Vielen dank im Voraus

daddy 10. Mai 2007 14:42

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Bisher sah Deine Prozdure so aus:

Delphi-Quellcode:
procedure TMyPanel.MyLabelOnClick;
begin
   if Assigned(Self.OnClick) then
   begin
      self.OnClick(self) ;
   end;
end;
Sie sollte aber so aussehen:

Delphi-Quellcode:
procedure TMyPanel.MyLabelOnClick;
begin
  Click(self) ;
end;
Also auch das Assigned... muss entfernt werden.

Geht es damit wirklich nicht?

Gruß Daddy

SoGraDEs 10. Mai 2007 15:52

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Hallo Daddy,
jetzt gehts.
Ich hatte "nur" self.OnClick(self) ; in self.Click(self) ;geändert !

Hier der lauffähige Code ( wenn meine Komponente fertig ist, poste ich hier den Code,
falls andere auch sowas brauchen/oder ansehen wollen.
Vielen Dank für die Unterstützung, ich habe heftig auf dem Schlauch gestanden.

Delphi-Quellcode:
unit MyPanel_1;

interface

uses
  SysUtils     , Classes, Controls, ExtCtrls,
  StdCtrls     ,
  Dialogs      ,
  Graphics     ;

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);                   // von dem Unwissenden #4

  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_2', [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 ;            // von dem Unwissenden #4



 xL1_Left      := 30           ;
 xL1_Top       := 30           ;
 xL1_Height    := 30           ;
 xL1_Width     := 90           ;
 xL1_Color     := clGreen     ;
 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 := 'NEU' ;

end;


procedure TMyPanel.MyLabelOnClick;
begin
    Click ;                        // geht wie self.Click;
   //self.Click;                   // geht auch

   //click(self);                  // geht nicht   von daddy          # 11       --> [Pascal Fehler] Switch.pas(125): E2034 Zu viele Parameter

   {                                // geht nicht   von dem Unwissenden #4
   if Assigned(Self.OnClick) then
   begin
      self.OnClick;
   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.

cruiser 10. Mai 2007 15:52

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Delphi-Quellcode:
unit LabelPanel;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, ExtCtrls;

type
  TLabelPanel = class(TPanel)
  private
    FLabel: TLabel;
    FOnLabelClick: TNotifyEvent;
    { Private-Deklarationen }
  protected
    procedure LabelClick(Sender: TObject);
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property OnLabelClick: TNotifyEvent read FOnLabelClick write FOnLabelClick;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Cruiser', [TLabelPanel]);
end;

{ TLabelPanel }

constructor TLabelPanel.Create(AOwner: TComponent);
begin
  inherited;
  FLabel := TLabel.Create(self);
  FLabel.Parent := Self;
  FLabel.Top := 4;
  FLabel.Left := 4;
  FLabel.Caption := 'blah';
  FLabel.Transparent := True;
  FLabel.Font.Color := $000000FF;
  FLabel.OnClick := LabelClick;
  FLabel.Show;
end;

destructor TLabelPanel.Destroy;
begin
  FLabel.Free;
  inherited;
end;

procedure TLabelPanel.LabelClick(Sender: TObject);
begin
  if Assigned(FOnLabelClick) then
    FOnLabelClick(Sender);
end;

end.
Getestet und geht soweit... hier wird jetzt das onclick des Labels auf das panel gemapped. Hoffe das hilft

SoGraDEs 10. Mai 2007 17:33

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Hallo Cruiser,
das was ich unter #12 geschrieben habe incl. Code
löst mein Problem.
Die überschriebene Procedure Click wird ausgeführt, wenn man auf das
Panel clickt und wenn man auf das Label clickt.
Das war mein Problem, das durch eure Hilfe gelöst werden konnte.
Daddy hat dabei den letzten entscheidenden Hinweis gegeben.

Ich habe Deine Code getestet und gesehen, dass Du ein anderes Ziel
erreicht hast.

Du erreichst, dass das clicken auf das Panel zu einem OnClick
und das clicken auf das Label zu einem OnLabelClick
im Objektinspektor des TLabelPanel führt, wo man dann entsprechde
Ereignisbehandlungsroutinen einsetzen kann.
Das ist auch eine sehr nützliche Lösung, die ich sicher auch zu schätzen weis.
Deshalb auch Dir ein herzliches Dankeschön für Deine Bemühungen.

Sie werden sicher nicht nur mir sonder auch anderen sehr hilfreich und auch lehrreich sein.

Wenn meine Komponente fertg ist , werde ich sie hier veröffentlichen.

Eine letzte Erkenntnis, man kann nicht beide Lösungen gleichzeitig nutzen.
Wenn man das anclicken des Labels auf die Procedure click umgeleitet hat,dann gibt es kein
OnLabelClick Ereignis mehr, obwohl das OnLabelClick noch im OI steht.
Ist allerdings auch nicht überraschend, wollte es nur noch für Interessenten angesprochen haben.

cruiser 10. Mai 2007 18:23

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Du musst nur erst FOnLabelClick(sender) ausführen und anschliessend self.click. Verbindest du das mit einer Boolean-Property (zur auswahl ob das panelclick beim label anklicken mit getriggert werden soll) machst du das ganze noch universeller...

daddy 10. Mai 2007 20:15

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
SoGraDEs schrieb:
Zitat:

Eine letzte Erkenntnis, man kann nicht beide Lösungen gleichzeitig nutzen.
Wenn man das anclicken des Labels auf die Procedure click umgeleitet hat,dann gibt es kein
OnLabelClick Ereignis mehr, obwohl das OnLabelClick noch im OI steht.
Das stimmt natürlich nicht wirklich. Was hindert Dich daran, den Code zu erweitern!?
Delphi-Quellcode:
type
  TLabelPanel = class(TPanel)
  private
    ...
    FOnLabelClick: TNotifyEvent;
    ...
    procedure MyLabelOnClick(Sender: TObject);
    ...
  public
    ...
    property OnLabelClick: TNotifyEvent read FOnLabelClick write FOnLabelClick;
    ...
  end;

constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited create(AOwner) ;
  ...
  L1 := TLabel.Create(self);
  ...
  L1.OnClick := MyLabelOnClick;
  ...
end;

procedure TMyPanel.MyLabelOnClick(Sender: TObject);
begin
  Click; // sorry, das (self) war ein Kopierfehler
  if Assigned(FOnLabelClick) then FOnLabelClick(Sender); // oder "L1" statt "Sender"
end;
Und damit kannst Du ja im Prinzip beides nutzen. :) Zuerst geschieht das, was bei jedem Panel.Click passiert, danach das, was Du speziell Deinem Label zugewiesen hast.

Gruß Daddy

SoGraDEs 11. Mai 2007 10:42

Re: Events einer Komponenete in einer NEUEN ererbten Kompone
 
Hallo Cruiser,
gute Idee .. Danke

Hallo Daddy,
als ich folgendes schrieb, dachte ich genauso wie Dein Vorschlag, habe aber wahrscheinlich
irgendeinen Fehler gemacht, der mich annehmen ließ, dass das OnLabelClick nicht mehr geht.
Zitat:

Zitat von daddy
SoGraDEs schrieb:
Zitat:

Eine letzte Erkenntnis, man kann nicht beide Lösungen gleichzeitig nutzen.
Wenn man das anclicken des Labels auf die Procedure click umgeleitet hat,dann gibt es kein
OnLabelClick Ereignis mehr, obwohl das OnLabelClick noch im OI steht.

Dein Vorschlag ist gut und arbeitet auch wie folgt:

Delphi-Quellcode:
Click auf das Panel --> MyPanel.Click wird ausgeführt
                        und
                        OnClick im OI von TMyPanel läßt die dazu programmierte
                                                   Ereignis-Procedure MyPanel1_OnClick ablaufen


Click auf das Label --> MyPanel.Click wird ausgeführt
                        und
                        OnClick im OI von TMyPanel läßt die dazu programmierte
                                                   Ereignis-Procedure MyPanel1_OnClick ablaufen
                        und
                        OnLabelClick im OI von TMyPanel läßt die dazu programmierte
                                                   Ereignis-Procedure MyPanel1_OnLabelClick ablaufen
Damit ist mein Wunsch an die Leistung der Komponente mehr als erfüllt. :cheers:
Und jetzt wieder :coder:
damit die Komponente aus dem Testzustand in einen brauchbaren Zustand kommt..
bis später und nochmals vielen Dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 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