Jak w konstruktorze pobrać nazwę komponentu?

Odpowiedz Nowy wątek
2011-10-14 13:36
0

Mam taki komponent:

TTwAppleItem = class(TCustomControl)
    private
      FLabel  : TLabel;
    public
      constructor Create(AOwner: TComponent); override;
...
  end;

constructor TTwAppleItem.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FLabel := TLabel.Create(Self);
  FLabel.Parent := Self;
  FLabel.Caption := name;  // dostaję pusty łańcuch
end;

Chciałbym aby po utworzeniu komponentu na formie FLabel.Caption był zamieniony na nazwę komponentu: TTwAppleItem1, TTwAppleItem2...

Tak jak gdy położy się TLabel na formie to na początku wyświetla on Label1, Label2 itd.

Pozostało 580 znaków

2011-10-14 14:31
Opi
0

Spróbuj

FLabel.Caption := AOwner.Name;

Pozostało 580 znaków

2011-10-14 14:36
0

Wtedy dostaję nazwę formy: FORM1 a nie nazwę komponentu.

Pozostało 580 znaków

2011-10-14 14:44
proqix polaczeq
0

FLabel.Caption := FLabel.Name;

Pozostało 580 znaków

2011-10-14 14:54
0

W takim przypadku dostaję pusty łańcuch. A mnie nie chodzi o nazwę FLabel tylko o nazwę mojego komponentu.

Pozostało 580 znaków

2011-10-14 16:07
0

self.name?


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-10-14 17:51
TolkWimasz
0

Także dostaję pusty łańcuch.

Tak się zastanawiam, czy w konstruktorze jest możliwe pobranie nazwy komponentu. Czy nie trzeba tego zrobić w innym miejscu.

Pozostało 580 znaków

2011-10-14 17:54
1

nie możliwe, bo jeszcze nie jest ustalona

najpierw jest tworzony komponent, a potem przypisywane do niego właściwości - w tym nazwa
ogólnie w konstruktorze nic nie powinno być robione poza samym stworzeniem obiektu


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<

Pozostało 580 znaków

2011-10-14 22:30
Opi
0

Zobacz jak to jest rozwiązane dla TLabel w module "StdCtrls.pas" funkcją GetLabelText.

  TCustomLabel = class(TGraphicControl)
  //...
  protected
    procedure DoDrawText(var Rect: TRect; Flags: Longint); dynamic;
    function GetLabelText: string; virtual;
  public
    constructor Create(AOwner: TComponent); override;
    property Caption;
 end;

Pozostało 580 znaków

2011-10-15 17:03
0

A może nadać temu komponentowi nazwę?

FLabel.Name := 'NewLabel'; //czy jakaś inna dozwolona nazwa

Później nie powinieneś mieć problemu z odczytem nazwy tego komponentu. AFAIK jeżeli nie nadasz nowemu komponentowi nazwy to domyślnie nie będzie mieć żadnej (czyli pusty łańcuch). Jeżeli się mylę - zwracam honor.

BTW: Ja podczas tworzenia komponentów dynamicznie zawsze nadaje im nazwy. Sprawdza się.

Pozostało 580 znaków

2011-10-15 19:45
TolkWimasz
0

Rozwiązanie pośrednie:

constructor TtwAppleI.Create(AOwner: TComponent);
begin
  ..
  FLabel.Caption := '&';
end;

procedure TtwAppleI.Paint;
begin
  if (FLabel.Caption='&') then
    FLabel.Caption := self.Name;
  inherited;
end;

Pojedynczy znak '&' nie jest wyświetlany, więc mogę go użyć jako znaku 'pierwotnego' FLabel.Caption.
Jedyny minus to taki, że po położeniu komponentu na formę w Object Inspektorze pojawia się znak '&' w polu Label. Ale tylko na chwilę. Do momentu odświeżenia komponentu.

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