Komponent zbudowany z kilku standardowych komponentów

0

Witam,

Przymierzam się do napisania komponentu, którego podstawą będzie TPanel a na nim mają
znajdować się TMemo, TEdit, TPanel, TButton, TLabel (w tej chwili tylko wymienione).
W załączeniu zrzut formy z wstępnym zarysem nowego komponentu.

Question1.jpg

Wiele jest opisów, które pokazują jak zmodyfikować jeden komponent.
Nie znalazłem niestety, jak na razie, komponentu z zagnieżdżonymi w nim innymi.
Poszukuję artykułu, kodu źródłowego itp. z podobnym, na którym mógłbym się oprzeć.

Jeśli ktoś posiada jakiekolwiek namiary na materiały opisujące w/w komponent, proszę o cokolwiek, co przybliży mi temat.

2

Na początek proponuję się zastanowić czy na pewno potrzebujesz takiego komponentu a nie np. TFrame a jeżeli komponentu co samego kodu to nie wiem co to ma być za różnica ile jest kontrolek po prostu musisz zdecydować się jakie właściwości i metody chcesz opublikować i je napisać. Po prostu Get i Set odczytujesz / modyfikujesz właściwość odpowiedniego komponentu jak w przykładzie:

type
  TMyControl = class(TWinControl)
  private
    FEdit1, FEdit2: TCustomEdit;

    procedure SetEdit1Text(Value: string);
    procedure SetEdit2Text(Value: string);
    function GetEdit1Text: string;
    function GetEdit2Text: string;

    procedure MyControlResize(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Edit1Text: string read GetEdit1Text write SetEdit1Text;
    property Edit2Text: string read GetEdit2Text write SetEdit2Text;
  end;


implementation

constructor TMyControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEdit1:= TCustomEdit.Create(Self);
  FEdit2:= TCustomEdit.Create(Self);
  FEdit1.Align:= alTop;
  FEdit2.Align:= alTop;
  Self.OnResize:= MyControlResize;
  FEdit1.Parent:= Self;
  FEdit2.Parent:= Self;
end;

procedure TMyControl.SetEdit1Text(Value: string);
begin
  FEdit1.Text:= Value;
end;

procedure TMyControl.SetEdit2Text(Value: string);
begin
  FEdit2.Text:= Value;
end;

function TMyControl.GetEdit1Text: string;
begin
  result:= FEdit1.Text;
end;

function TMyControl.GetEdit2Text: string;
begin
  result:= FEdit1.Text;
end;

procedure TMyControl.MyControlResize(Sender: TObject);
begin
  FEdit1.Left:= 0;
  FEdit2.Left:= 0;
  FEdit1.Width:= Width;
  FEdit2.Width:= Width;
  FEdit1.Top:= 0;
  FEdit1.Height:= Height div 2;
  FEdit2.Top:= FEdit1.Height;
  FEdit2.Height:= Height div 2;
end;
0

OK, dziękuję za podsunięcie alternatywnego pomysłu. Zgłębię temat TFrame'ów.

0

Zamiast TFrame możesz użyć zwykłej formy wrzuconej na panel.

Zalety? Jest chyba wygodniej edytować taką formę, chociaż nie używałem za dużo TFrame, więc nie wiem na pewno.

http://www.webtechcorp.com/web-developer-training-delphi-tip-2.htm
http://www.tek-tips.com/viewthread.cfm?qid=1467433
http://www.delphipages.com/forum/showthread.php?t=186102

Edit: tu jest jakieś bardziej skomplikowane rozwiązanie:
Forma w panelu - komponent

1

Niby dlaczego wygodniej? Po co kombinować z formami na panelu jak zamiast tych kombinacji wymyślono TFrame? Chyba że z tą wygodą chodzi ci o to że w starych Delphi nie było siatki w trybie projektowania w nowych Delphi jest w dodatku nie ma zbędnych rzeczy jak border i caption.

0

Dzięki VPiotr za linki. Forum przejrzałem w pierwszej kolejności, więc z gotowcem się zapoznałem. Wydał się zbyt kombinacyjny dla mojego projektu.

Jestem po pierwszych podejściach stosowania TFrame. Panel i jego zawartość zaprojektowana na formie (wyżej pokazany zrzut) przerzucona na ramkę przez Copy/Paste. Już widzę, że ewentualne korekty, zmiany etc. przebiegają sprawnie i szybko, więc prawdopodobnie to rozwiązanie będzie zdawało egzamin.

Dzięki, Panowie, za propozycje rozwiązania.

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