Własny komponent na bazie TEdit i obok TLabel

0

Witam, tworzę komponent na bazie TEdit. Jak utworzyć np. TLabel, ale nie na TEdit tylko na Formie. Mam taki kod:

Tworzy mi TLabel na obszarze TEdit a chciał bym żeby na zewnątrz na Formie obok TEdit. Coś jak TLabeledEdit.

unit EditLab;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Vcl.Forms;

type

  TEditLab = class(TEdit)

  private
           { Private declarations }
  protected
    { Protected declarations }
  public
      FLabel: TLabel;

  constructor Create(AOwner: TComponent);  override;
  destructor Destroy; override;
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

constructor TEditLab.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);

  FLabel := TLabel.Create(Self);

with  FLabel do
  begin
    Parent:=Self;
    Name:='Label1';
    Top := 100;
    Left := 100;
    Height := 27;
    Width := 50;
    Visible:=True;
    Caption:='Tekst';
  end;
end;

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

procedure Register;
begin
  RegisterComponents('Samples', [TEditLab]);
end;
end.

Dzięki
Pozdrawiam

2
FLabel        := TLabel.Create(Self);
FLabel.Parent := Self.Parent;

To pozwoli osadzić etykietę w tym samym komponencie, w którym osadzone zostanie pole edycyjne. W razie czego, zawsze możesz po prostu sprawdzić kod komponentu TLabeledEdit — tam znajdziesz dokładnie to czego szukasz.


Pro tip 1: FLabel powinien być prywatną składową klasy TEditLab, a jeśli ma być publiczny, to w formie właściwości. Jeśli komponent etykiety ma być możliwy do modyfikowania za pomocą okna Inspektora Obiektów, to jego właściwość powinna być w sekcji published, a jeśli nie to w public.

Pro tip 2: nie używaj instrukcji wiążącej (konstrukcji with do), bo tylko zaciemniasz kod.

0

FLabel := TLabel.Create(Self);
FLabel.Parent := Self.Parent;

Witam,
Nie działa mi to dalej ☹
Jak zrobię:

MainForm:= TForm(Owner);

a potem:

FLabel.Parent := MainForm;

To działa, ale tylko na formie. Jak już położę na np. TPanel to lipa.
Chyba zostaje mi tylko zrobić to na bazie TGroupBox lub TPanel ☹ a szkoda.
Pozdrawiam

2

Właściwość "Parent" jest z reguły ustawiana po konstruktorze i w trakcie konstruktora nie jest znana. Zdaje się, że powinieneś przesłonić metodę "SetParent" i w niej ustawić właściwość "Parent" dla TLabel.

  TEditLab = class(TEdit)
....
  protected
    procedure SetParent(NewParent: TWinControl); override;
...
procedure TEditLab.SetParent(NewParent: TWinControl);
begin
  inherited;
  FLabel.Parent := NewParent;
end;
1

Dziękuję bardzo, właśnie o to mi chodziło. Jednak jak dodam do procedury np.

procedure TEditLab.SetParent(NewParent: TWinControl);
begin
  inherited;
  FLabel.Parent := NewParent;
  FLabel.SetBounds(100,100,100,25);
end;

to działa mi wszystko jak chciałem, ale przy kasowaniu komponentu z formy wywala błąd.

Udało mi się to zrobić poprzez:

if not (csDestroying  in ComponentState) then FLabel.SetBounds(10,10,100,35);

Dziękuję
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.