Gibt es einen ähnlichen Ansatz von TFormTabsBar auch für FMX?
Dafür nutze ich Frames und
FMX.TabControl.TTabControl
Auf die Tabs lege ich TRectangle, weil die sich auch einfärben lassen, TLayout genügt aber auch,
ist meiner Meinung nach aber nicht viel schlanker als ein TRectangle.
Dann kann man die einzelnen Frames separat bearbeiten und per Runtime auf die Rectangles legen.
ungefähr so
Delphi-Quellcode:
procedure Frame_Embed_To( const AFrame : TFrame;
const ACarrier : TControl;
const AAlign : TAlignLayout = TAlignLayout.Client );
begin
if not Assigned( ACarrier ) then
begin
Exit; //<== GUARD ==============================================
end;
if not Assigned( AFrame ) then
begin
Exit; //<== GUARD ==============================================
end;
ACarrier.BeginUpdate;
try
AFrame.Parent := nil;
AFrame.Parent := ACarrier;
AFrame.Align := AAlign;
finally
ACarrier.EndUpdate;
ACarrier.Repaint;
end;
end;
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;
Man kann auch TForm auf diese Weise zuweisen, dann muss man nur die ganzen Komponenten rüberholen.
Hatte so funktioniert, ist aber schon lange nicht mehr benutzt, seitdem ich alles auf Frames umgestellt habe.
Delphi-Quellcode:
procedure Form_Embed_To(const AForm:TCustomForm; const AParent:TControl);
var
chld: TFmxObject;
I: Integer;
begin
if Assigned( AParent ) then
begin
AParent.BeginUpdate;
I := 0;
while AForm.ChildrenCount > 0 do
begin
chld := AForm.Children[I];
if chld.Name <> '' then
AForm.Children[I].Parent := AParent
else
Inc(I);
end;
AParent.EndUpdate;
end;
end;
procedure Form_Embed_ReleaseFrom(const AForm:TCustomForm; const AParent:TControl);
var
I: Integer;
chld: TFmxObject;
begin
I := 0;
while AParent.ChildrenCount > I do
begin
chld := AParent.Children[I];
if chld.Name <> '' then
chld.Parent := AForm
else
Inc(I);
end;
end;