AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Events einer Komponenete in einer NEUEN ererbten Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Events einer Komponenete in einer NEUEN ererbten Komponente

Ein Thema von SoGraDEs · begonnen am 10. Mai 2007 · letzter Beitrag vom 11. Mai 2007
Antwort Antwort
Seite 2 von 2     12   
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Events einer Komponenete in einer NEUEN ererbten Kompone

  Alt 10. Mai 2007, 15:42
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
  Mit Zitat antworten Zitat
SoGraDEs

Registriert seit: 12. Mär 2005
Ort: Bremen
28 Beiträge
 
Delphi XE7 Professional
 
#12

Re: Events einer Komponenete in einer NEUEN ererbten Kompone

  Alt 10. Mai 2007, 16:52
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.
Viele Grüße aus Bremen
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Events einer Komponenete in einer NEUEN ererbten Kompone

  Alt 10. Mai 2007, 16:52
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
  Mit Zitat antworten Zitat
SoGraDEs

Registriert seit: 12. Mär 2005
Ort: Bremen
28 Beiträge
 
Delphi XE7 Professional
 
#14

Re: Events einer Komponenete in einer NEUEN ererbten Kompone

  Alt 10. Mai 2007, 18:33
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.
Viele Grüße aus Bremen
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Events einer Komponenete in einer NEUEN ererbten Kompone

  Alt 10. Mai 2007, 19:23
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...
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Events einer Komponenete in einer NEUEN ererbten Kompone

  Alt 10. Mai 2007, 21:15
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
  Mit Zitat antworten Zitat
SoGraDEs

Registriert seit: 12. Mär 2005
Ort: Bremen
28 Beiträge
 
Delphi XE7 Professional
 
#17

Re: Events einer Komponenete in einer NEUEN ererbten Kompone

  Alt 11. Mai 2007, 11:42
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 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.
Und jetzt wieder
damit die Komponente aus dem Testzustand in einen brauchbaren Zustand kommt..
bis später und nochmals vielen Dank
Viele Grüße aus Bremen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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