Komponente zur Laufzeit aktualisieren auf Events reagieren

Rund um die LCL und andere Komponenten
Antworten
paule32
Beiträge: 5
Registriert: Di 27. Dez 2011, 09:49

Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von paule32 »

Hallo,

ich habe eine TPanel Komponente mit einem weiteren Child TPanel und 2 Labels versehen.
wenn ich nun die komponente auf das Form ziehe, compiliere und das programm ausführe
und versuche auf das 1te panel zu clicken, tut ic nix.
was kann das sein?
ich will erreichen, dass das gesamte panel (komponente) "clickbar" ist/wird.

hier der code:

Code: Alles auswählen

unit PElement;
 
{$mode delphi}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, StdCtrls, Graphics, Dialogs, ExtCtrls;
 
type
  TPElement = class(TPanel)
  private
    FLabelName: TLabel;
    FLabelMasse: TLabel;
    FPanelSerie: TPanel;
    FSColor: TColor;
    FEName: String;
    FMasse: String;
    procedure setElementName(Value: String);
    procedure setElementSerie(Value: TColor);
    procedure setMasse(Value: String);
    function getElementName: String;
    function getElementSerie: TColor;
    function getMasse: String;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ColorSerie: TColor read getElementSerie write setElementSerie;
    property Caption: String read getElementName write setElementName;
    property CaptionMasse: String read getMasse write setMasse;
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('KALLUP.NET',[TPElement]);
end;
 
constructor TPElement.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Caption := '1 H';
  Color := 16777170;
  ColorSerie := clBlue;
  Caption := '1 H';
  Width := 52;
  Height := 59;
  Font.Color := Color;
  FLabelName := TLabel.Create(self);
  FLabelName.Parent := self;
  FLabelName.AutoSize := false;
  FLabelName.Caption := '1 H';
  FLabelName.Font.Size := 10;
  FLabelName.Font.Style := [fsBold];
  FLabelName.Font.Name := 'Arial';
  FLabelName.Font.Color := clBlack;
  FLabelName.Top := 3;
  FLabelName.Width := 16;
  FLabelName.Left := 8;
  FLabelName.Height := 33;
  FLabelName.ParentColor := False;
  FLabelName.ParentFont := False;
  FLabelName.WordWrap := True;
  FLabelName.onClick := self.OnClick;
 
  FLabelMasse := TLabel.Create(self);
  FLabelMasse.Parent := self;
  FLabelMasse.AutoSize := false;
  FLabelMasse.Caption := '1.007';
  FLabelMasse.Font.Size := 8;
  FLabelMasse.Font.Style := [fsBold];
  FLabelMasse.Font.Name := 'Arial';
  FLabelMasse.Font.Color := clBlack;
  FLabelMasse.Top := 33;
  FLabelMasse.Left := 8;
  FLabelMasse.ParentColor := False;
  FLabelMasse.ParentFont := False;
  FLabelMasse.OnClick := onClick;
 
  FPanelSerie := TPanel.Create(self);
  FPanelSerie.Parent := self;
  FPanelSerie.Color := ColorSerie;
  FPanelSerie.Height := 10;
  FPanelSerie.Top := 46;
  FPanelSerie.Left := 2;
  FPanelSerie.Width := 46;
  FPanelSerie.OnClick := onClick;
end;
 
destructor TPElement.Destroy;
begin
  FLabelName.Free;
  FPanelSerie.Free;
  inherited Destroy;
end;
 
procedure TPElement.setElementName(Value: String);
begin
  if Assigned(FLabelName) then
  begin
    FLabelName.Caption := Value;
    FEName := Value;
  end;
end;
 
procedure TPElement.setElementSerie(Value: TColor);
begin
  if Assigned(FPanelSerie) then
  begin
    FSColor := Value;
    FPanelSerie.Color := Value;
  end;
end;
 
procedure TPElement.setMasse(Value: String);
begin
  if Assigned(FLabelMasse) then
  begin
    FLabelMasse.Caption := Value;
    FMasse := Value;
  end;
end;
 
function TPElement.getElementName: String;
begin
  result := FEName;
end;
 
function TPElement.getElementSerie: TColor;
begin
  result := FSColor;
end;
 
function TPElement.getMasse: String;
begin
  result := FMasse;
end;
 
end.

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von theo »

Ich denke mal das ist so:
Self.OnClick auf das du alles umzuleiten versuchst, ist ja keine Prozedur, sondern ein TNotifyEvent.
Zum Zeitpunkt deines Create zeigt es noch nach NIL.
Du leitest also alles auf NIL um, daher kein Effekt. Wenn du später eine Fkt zuordnest, kriegen das die Childs nicht mehr mit.

paule32
Beiträge: 5
Registriert: Di 27. Dez 2011, 09:49

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von paule32 »

und wie kann man es hinbekommen?
bin doch noch neu in lazarus.

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von theo »

Warum willst du daraus überhaupt eine Komponente basteln?

paule32
Beiträge: 5
Registriert: Di 27. Dez 2011, 09:49

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von paule32 »

weil, das ich nicht will, für über 50 panels von hand zu bearbeiten.
so kann ich eine komponete auf das fomr legen und die property ändern, fertig.

anders müsste ich jedesmal 2 panels auf das form legen, 2 labels, farben setzen und die größe anordnen.
...

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von theo »

Versteh ich nicht. Du kannst doch deine Panels genauso gut im Code in einem Loop erzeugen.
Eine Komponente ist da ziemlicher Overkill, wenn ich dich richtig verstehe.

Aber auch sonst, kommen mir immer Zweifel, wenn jemand mit 50 Panels was machen will.
Wäre da nicht ein Grid oder ein TreeView besser geeignet?

paule32
Beiträge: 5
Registriert: Di 27. Dez 2011, 09:49

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von paule32 »

egal,
habe mal den code abgeändert, aber ich erhalte nun eine AV crash meldung:

Code: Alles auswählen

unit PElement;
 
{$mode delphi}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, StdCtrls, Graphics, Dialogs, ExtCtrls;
 
type
  TPElement = class(TPanel)
  private
    FSColor: TColor;
    FOZahl: String;
    FEName: String;
    FMasse: String;
    procedure setElementZahl(Value: String);
    procedure setElementName(Value: String);
    procedure setElementSerie(Value: TColor);
    procedure setMasse(Value: String);
    function getElementZahl: String;
    function getElementName: String;
    function getElementSerie: TColor;
    function getMasse: String;
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ColorSerie: TColor read getElementSerie write setElementSerie;
    property Caption: String read getElementName write setElementName;
    property CaptionZahl: String read getElementZahl write setElementZahl;
    property CaptionMasse: String read getMasse write setMasse;
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('KALLUP.NET',[TPElement]);
end;
 
constructor TPElement.Create(AOwner: TComponent);
begin
  Color := 16777170;
 
  Width := 52;
  Height := 59;
end;
 
destructor TPElement.Destroy;
begin
  inherited Destroy;
end;
 
procedure TPElement.setElementZahl(Value: String);
begin
  FOZahl := Value;
  Paint;
end;
 
procedure TPElement.setElementName(Value: String);
begin
  FEName := Value;
  Paint;
end;
 
procedure TPElement.setElementSerie(Value: TColor);
begin
  FSColor := Value;
  Paint;
end;
 
procedure TPElement.setMasse(Value: String);
begin
  FMasse := Value;
  Paint;
end;
 
function TPElement.getElementZahl: String;
begin
  result := FOZahl;
end;
 
function TPElement.getElementName: String;
begin
  result := FEName;
end;
 
function TPElement.getElementSerie: TColor;
begin
  result := FSColor;
end;
 
function TPElement.getMasse: String;
begin
  result := FMasse;
end;
 
procedure TPElement.Paint;
begin
  with Canvas do
  begin
    Font.Color := clBlack;
    Font.Size := 10;
    Font.Style := [fsBold];
 
    TextOut(8,3,FOZahl);
    TextOut(8,16,FEName);
 
    Font.Size := 8;
    TextOut(8,33,FMasse);
  end;
end;
 
end.

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von theo »

paule32 hat geschrieben:egal,
Finde ich nicht.
paule32 hat geschrieben: habe mal den code abgeändert, aber ich erhalte nun eine AV crash meldung:

Code: Alles auswählen

constructor TPElement.Create(AOwner: TComponent);
    begin
      inherited; <--------------
      Color := 16777170;   
      ....

paule32
Beiträge: 5
Registriert: Di 27. Dez 2011, 09:49

Re: Komponente zur Laufzeit aktualisieren auf Events reagieren

Beitrag von paule32 »

ok, habs hinbekommen, auch wenn du mit lösungen spärlich bist - spass,

inherited create(aowner);

war des rätzels lösung.
danke für deine zeit.

Antworten