So ganz verstanden habe ich die Reihenfolge oder Verwendung von TLayout und/oder TFrame noch nicht: beides Container zur Aufnahme vom Komponenten, aber wann oder warum verwendet man welche?
TFrame ist das gewünschte UI, das kann man im Designer erzeugen und bequem grafisch wie üblich editieren.
Das TFrame ist im Prinzip ein TControl, was man dann irgendwo benutzen kann (um Erzeugen / Freigeben muss man sich natürlich auch entsprechend kümmern).
Von der Möglichkeit die Frames im Designer zu laden und per Drag-n-Drop irgendwo reinzuwerfen rate ich ab,
damit hatte ich in der Vergangenheit öfters mal massive Probleme.
Deshalb nutze ich die Frames in dem Ziel ausschließlich per Runtime.
Dafür habe ich "Carrier", in welche ich die Frames einfach einbinden kann.
Der Carrier ist dann nur eine Art Platzhalter für das Frame, im dem Ziel-Form oder Frame, wo Du das nutzten möchtest.
Ich hab hier mal die Funktionen für ein ganz "Basic" Embed/Release von Frames zu anderen Carriern.
Im Prinzip kann der Carrier alles Mögliche sein, in FMX kann man Controls beliebig verschachteln, auch mehrstufig
(Ich habe Frames, die wiederum andere Frames einbinden).
Delphi-Quellcode:
procedure Frame_Embed_To( const AFrame : TFrame;
const ACarrier : TControl;
const AAlign : TAlignLayout = TAlignLayout.Client );
...
// AFrame - Der Frame, der in den Carrier embedded werden soll
// ACarrier - Das Control, welches den Frame aufnehmen soll
// AAlign - Ein AlignLayout, üblicherweise TAlignLayout.Client, weil das eigentliche Layout im ZielForm oder Frame gemacht wird.
//
procedure Frame_Embed_To( const AFrame : TFrame;
const ACarrier : TControl;
const AAlign : TAlignLayout );
begin
if Assigned( ACarrier ) and Assigned( AFrame) then
begin
ACarrier.BeginUpdate;
try
AFrame.Parent := nil;
AFrame.Parent := ACarrier;
AFrame.Align := AAlign;
finally
ACarrier.EndUpdate;
ACarrier.Repaint;
end;
end;
end;
// Wie oben, so kann man den Frame wieder aus dem Carrier auslösen.
// In der Regel lasse ich aber die Zuordnung über die ganze Laufzeit stehen, kein Grund ständig
// Frames rein- und rauszubauen.
// Allerdings kann so auch einfach mal ein Frame je nach Sitiuation ausgetauscht werden.
//
procedure Frame_Embed_ReleaseFrom( const AFrame : TFrame;
const ACarrier : TControl );
begin
if Assigned( ACarrier ) and Assigned( AFrame) then
begin
ACarrier.BeginUpdate;
try
AFrame.Parent := nil;
finally
ACarrier.EndUpdate;
ACarrier.Repaint;
end;
end;
end;