Tworzenie komponentu - dziwne zachowanie

0

Mam taki prosty komponent:

  TTwAppleItem = class(TCustomControl)
    private
      FLabel  : TLabel;
      FLabelCaption : string;
      function GetLabelCaption: string;
      procedure SetLabelCaption(const Value: string);
    protected
    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
    published
      property LabelCaption: string read FLabelCaption write SetLabelCaption;
  end;

constructor TTwAppleItem.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 200;
  Height := 28;
  Color := clWhite;
  FLabelCaption :=  'TwAppleLabel';

  FLabel := TLabel.Create(Self);
  FLabel.Parent := Self;
  FLabel.Left := 0;
  FLabel.Top := 4;
  FLabel.Font.Size := 9;
  FLabel.Font.Style := [fsBold];
  FLabel.Transparent := False;
  FLabel.ParentColor := False;
  FLabel.Color := clWhite;
  FLabel.Caption := FLabelCaption;

end;



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

function TTwAppleItem.GetLabelCaption: string;
begin
  result := FLabelCaption;
end;

procedure TTwAppleItem.SetLabelCaption(const Value: string);
begin
  FLabelCaption := Value;
  FLabel.Caption := Value;
end;

Komponent jest banalny. I wszystko działa OK do momentu gdy w fazie projektowej ustawię LabelCaption na pusty łańcuch. Wtedy po uruchomieniu programu wyświetla się tekst: 'TwAppleLabel'.

Sprawdziłem, że gdy w LabelCaption jest wpisany pusty string to nie jest ta właściwość zapamiętywana tzn gdy przejdę na View as Text to widać:

  object TwAppleItem1: TTwAppleItem
    Left = 32
    Top = 431
    Width = 289
    Height = 33
  end

a gdy LabelCaption jest z jakimś tekstem to mam:

  object TwAppleItem1: TTwAppleItem
    Left = 32
    Top = 431
    Width = 289
    Height = 33
    LabelCaption = 'COS'
  end

Delphi 2007. Proszę o pomoc w czym tkwi problem?
Ps. Jak LabelCaption jest spacją to jest OK.

0
  1. jeśli ma to być komponent z tylko tym labelem to powinien dziedziczyć po TCustomLabel
  2. jeśli to jest tylko kawałek to dodatkowa zmienna FLabelCaption jest zupełnie zbędna - zapisywać jak i odczytywać możesz bezpośrednio z FLabel.Caption
  3. co do samego problemu to dzieje się tak ponieważ najpierw jest wykonywane to co w konstruktorze a dopiero potem są ładowane właściwości z pliku DFM (czyli ustaione w OI). Możesz ustawiać Caption etykiety w metodzie Loaded
0
  1. To fragment większego kodu.
  2. Wiem, że nie jest potrzebna zmienna FLabelCaption i mogę korzystać bezpośrednio z FLabel.Caption. Ale to nie pomaga.
  3. Gdzie mogę znaleźć coś o metodzie Loaded? Jakiś przykład.
0

ale jaki przykład??? Nadpisujesz ją w swoim kodzie (sekcja protected) i w niej ustawiasz FLabel.Caption

0

Przeszukałem net i nie mogę nic sensownego przeczytać o tej metodzie. Chodzi mi o to co w niej powinno być.

0

w protected piszesz:

 
  procedure Loaded;override;

W definicji tej metody ustaw Caption.

0

Znalazłem odpowiedź.

proteceted
  procedure DefineProperties(Filer: TFiler); override;
procedure TTwAppleItem.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('LabelCaption', ReadLabelData, WriteLabelData, True);
end;

Definiuję metody ReadLabelData i WriteLabelData i LabelCaption ma zapamiętany bez względu na jego wartość.

0

Ty naprawdę nie czytasz tego co się do Ciebie pisze..

  TTwAppleItem = class(TCustomControl)
  protected
    procedure Loaded; override;
  end;
 
procedure TTwAppleItem.Loaded;
begin
  FLabel.Caption := FLabelCaption;
end;

polecam zapoznać się z http://delphi.about.com/library/bluc/text/uc080701a.htm

0

To co napisałeś nie działa tak jak chcę. Jak ustawiam właściwość LabelCaption na pusty łańcuch to go nie zapisuje do pliku dmf:

  object TwAppleLabel1: TTwAppleLabel
    Left = 584
    Top = 608
    Width = 200
    Height = 28
    Alignment = taLeftJustify
    LabelWidth = 100
    DesignSize = (
      200
      28)
  end

Za to sposób, który opisałem wyżej działa. Pole FLabelCaption jest zawsze zapisywane do pliku dmf bez względu na wartość, czy jest to łańcuch pusty czy niepusty.

(Delphi 2007)

1 użytkowników online, w tym zalogowanych: 0, gości: 1