Jakoś nigdy nie mogłem siebie przekonać do korzystania z ramek w Delphi (TFrame).
Głównym zarzutem jest brak tych wszystkich zdarzeń obecnych w formach (TForm) takich jak OnCreate czy OnShow.
Zatem, już od jakiegoś czasu, używam zwykłych form, które zachowują się jak ramki.
Te dziedziczą z TForm, więc i dziedziczą wszystkie standardowe zdarzenia form.
Implementacja takich form jest banalna - wystarczy zredefiniować metodę CreateParams:
type
TPaneForm = class(TForm)
protected
procedure CreateParams(var AParams: TCreateParams); override;
end;
...
procedure TPaneForm.CreateParams(var AParams: TCreateParams);
begin
inherited CreateParams(AParams);
AParams.Style := AParams.Style or WS_CHILD;
end;
TCreateParams trzyma informacje niezbędne do tworzenia okien pod Windows.
Takie jak tytuł, pozycja i wymiary, styl.
Mimo, że CreateParams nie jest udokumentowane, znaczenie procedury jest raczej oczywiste.
Wreszcie, WS_CHILD tworzy okno-dziecko bez np. paska tytułowego.
Następnie, aby korzystać z tych form jako ramek na innych formach, wystarczy zredefiniować CreateParams w formie,
a następnie stworzyć ją jak każdą inną kontrolkę Delphi, która jest osadzana na formach:
LPane := TPaneForm.Create(AOwner);
LPane.Parent := AOwner;
LPane.Visible := TRUE; // niepotrzebne, jeżeli Visible ustawione jest na TRUE w TPaneForm
I, rzecz jasna, mamy dostęp do wszystkich właściwości i zdarzeń klasy TForm,
tudzież pełną obsługę dziedziczenia wizualnego form (Visual Form Inheritance).
Dodatkowym plusem tego rozwiązania jest to, że każda forma, którą już mamy
może być osadzana w innych formach. Np. powiedzmy że mamy kilka form
konfigurujących jakiś element (program, komponent, etc.). Z jednej stron
można pokazywać pojedyncze formy (np. formatowanie jednej osi wykresu)
lub umieścić wszystkie formy na innej (np. różne zakładki w oknie dialogowym ustawień programu).
Góra
|