Jak w konstruktorze pobrać nazwę komponentu?

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.

0

Spróbuj

FLabel.Caption := AOwner.Name;
0

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

0

FLabel.Caption := FLabel.Name;

0

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

0

self.name?

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.

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

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;
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ę.

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.

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