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 Propertie einer Subkomponente ist nicht sichtbar (https://www.delphipraxis.net/151100-propertie-einer-subkomponente-ist-nicht-sichtbar.html)

sechsertraeger 5. Mai 2010 21:48


Propertie einer Subkomponente ist nicht sichtbar
 
Liste der Anhänge anzeigen (Anzahl: 1)
[dp]Hallo zusammen, bin Delphi Neuling und auch neu in diesem Forum.

Ich habe da mal ein Problem. :wall:

Ich erstelle eine Komponente TPanel. geht!
Ich erstelle im Creator von TPanel eine weitere Komponente TLabel. geht!
TLabel soll eine Eigenschaft "MyBorder: Boolean" bekommen. Rahmen zeichnen oder nicht. geht!
Im OI kann ich die Subkomponente und alle geerbten Properties als grüne Liste sehen. geht!
Mein Propertie "MyBorder" sehe ich auch. geht!
Änderungen im OI werden auch brav umgesetzt. geht!

So, nun kommt ein Problem!

Wenn ich im Code-Bereich der Form z.B.

begin
self.TMyPanel.TMyLabel und dann den Punkt schreibe

erscheinen wie gewohnt alle eigenschaften etc. aber nur mein Property MyBorder taucht nicht auf :(

Wie gesagt im OI geht alles.
Zur laufzeit auch alles OK. Nur kann ich nicht im Programm auf die Propertie "MyBorder" zugreifen.

Ich habe garkeine Ahnung. Sorry!

Code:
unit Panel1;

interface

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

type
  dgTPanel = class(TPanel)
    private
      FMyTopLabel: TLabel;
      FMyTest: Boolean;

    protected
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      procedure Paint; override;

    public
    published
      property MyTopLabel: TLabel read FMyTopLabel write FMyTopLabel;
      property MyTest: Boolean read FMyTest write FMyTest;
end;

  // Neue Unterklasse FTopLabel1
  FTopLabel = class(TLabel)
    private
      FMyBorder: Boolean;

    protected
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      procedure Paint; override;

      procedure DefineProperties();
      procedure SetMyName(NewName: TComponentName);
      function GetMyBorder: Boolean;
      procedure SetMyBorder(Value: Boolean);
    public

    published
      property MyBorder: Boolean read GetMyBorder write SetMyBorder;
end;
// Ende neue Unterklasse FTopLabel

// Komponente registrieren //
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Detlef', [dgTPanel]);
end;
// ----------------------- //


constructor dgTPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FMyTopLabel := FTopLabel.Create(self);
  FMyTopLabel.SetSubComponent(True);
  FMyTopLabel.Parent := self;

  Height:= 150;
  Width := 150;
  Caption := '';
  ShowCaption := False;
  Refresh;
end;

destructor dgTPanel.Destroy;
begin
  inherited;
end;

procedure dgTPanel.Paint;
begin
  inherited;
  if Width < 100 then Width := 100;
  if Height &lt; 100 then Height := 100;
  ShowCaption := False;
end;



{ FTopLabel }

constructor FTopLabel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  SetMyName('TopLabel');
  self.Caption := self.Name;
end;

destructor FTopLabel.Destroy;
begin
  inherited;
end;


function FTopLabel.GetMyBorder: Boolean;
begin
  Result := FMyBorder;
end;

procedure FTopLabel.SetMyBorder(Value: Boolean);
begin
  if FMyBorder &lt;> Value then
  begin
    FMyBorder := Value;
    Repaint;
  end;
end;

procedure FTopLabel.DefineProperties;
begin
    AutoSize := False;
    Left := 3;
    Top := 3;
    Width := self.Parent.Width - 6;
    Transparent := False;
    Alignment := taCenter;
    Layout := tlCenter;
    Font.Height := 5 - Height;
end;


procedure FTopLabel.Paint;
begin
  inherited;
  DefineProperties;
  if self.MyBorder = True then
  begin
    Canvas.Pen.Color := clBlack;
  end
  else
  begin
    Canvas.Pen.Color := self.Color;
  end;
  Canvas.Rectangle(Left - 3, Top - 3, Width, Height);
end;


procedure FTopLabel.SetMyName(NewName: TComponentName);
begin
  if NewName &lt;&gt; self.Name then
  begin
    if IsValidIdent(NewName)=True then
    begin
      self.SetName(NewName);
      Update;
    end;
  end;

end;

end.

Tryer 5. Mai 2010 21:53

Re: Propertie einer Subkomponente ist nicht sichtbar
 
FMyTopLabel: TLabel<=== TMyTopLabel

sechsertraeger 5. Mai 2010 21:54

Re: Propertie einer Subkomponente ist nicht sichtbar
 
:wiejetzt: ???

Tryer 5. Mai 2010 21:58

Re: Propertie einer Subkomponente ist nicht sichtbar
 
Dein Feld ist vom Typ TLabel, und auch die Published-Property ist vom Typ TLabel. Somit stehen auch nur die Properties von TLabel zur Verfügung, um an MyBorder zu kommen müsstest du casten.
Kontrolliere also die Deklaration deines TPanel.

hoika 6. Mai 2010 06:46

Re: Propertie einer Subkomponente ist nicht sichtbar
 
Hallo,


Delphi-Quellcode:
dgTPanel = class(TPanel)
    private
      FMyTopLabel: TLabel;    // TLabel

Delphi-Quellcode:
constructor dgTPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FMyTopLabel := FTopLabel.Create(self);   // FTopLabel
Also erst mal, warum heisst das nicht FTopLabel ?
In Delphi haben Type-Definitionen immer ein T.


Lösung bei dir.


Delphi-Quellcode:
dgTPanel = class(TPanel)
    private
      FMyTopLabel: TTopLabel;
Und da TTopLabel zu diesem Zeitpunkt noch nicht definiert ist

1. forward
2. type TTopLabel XXX vor dgTPanel definieren


Heiko

sechsertraeger 6. Mai 2010 07:40

Re: Propertie einer Subkomponente ist nicht sichtbar
 
:cheers:
Super, danke. Hätte ich auch selbst drauf kommen können. Vieleicht!

Manchmal hat man ja wirklich ein BRETT vor dem Kopf.


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