Tworzenie komponentu - dziwne zachowanie

Odpowiedz Nowy wątek
2011-10-07 15:45
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.

Pozostało 580 znaków

2011-10-07 16:05
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

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-07 17:26
TolkWimasz
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.

Pozostało 580 znaków

2011-10-07 17:40
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-08 06:49
TolkWimasz
0

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

Pozostało 580 znaków

2011-10-08 08:03

w protected piszesz:


  procedure Loaded;override;

W definicji tej metody ustaw Caption.


I fart u die.

Pozostało 580 znaków

2011-10-08 09:16
TolkWimasz
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ść.

Pozostało 580 znaków

2011-10-08 13:51
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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 1x, ostatnio: Misiekd, 2011-10-08 13:53

Pozostało 580 znaków

2011-10-09 13:20
TolkWimasz
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)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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