主要问题是您的框架变量是过程局部变量。
我看到了解决您问题的不同方法。
第一:使用TObjectList
:
uses ..., System.Generics.Collections;
TForm1 = class(TForm)
TabControl1: TTabControl;
private
FFrames:TObjectList<TProfileFrame>;
procedure TForm1.AddNewTab;
var
profileFrame :TProfileFrame;
begin
//TabItem
TabItem := TabControl1.Add();
profileFrame := TProfileFrame.Create(TabItem);
inc(tab_name_Count);
tabItem.Text := tab_name_Count.ToString;
profileFrame.Parent := tabItem;
if not assigned(FFrames) then
FFrames := TObjectList<TProfileFrame>.Create(false); //we don't need ObjectList to own Frame, I suppose, so we have to pass `false` into Create method
FFrames.Add(profileFrame);
tablist.Add(TabItem);
end;
//Just to demonstrate how to get value from frame
function TForm1.GetGenderFromFrame(ATabItem:TTabItem):String;
var i:integer;
begin
result := '';
if FFrames.Count > 0 then
for i := 0 to FFrames.Count - 1 do
if FFrames[i].TabItem = ATabItem then
result := FFrames[i].Gender.Selected.Text;
end;
或者您可以使用另一种方式(在 Delphi 10.1 FMX Project 上进行检查)。您必须像这样更改您的程序:
procedure TForm1.AddNewTab;
var
profileFrame :TProfileFrame;
begin
//TabItem
TabItem := TabControl1.Add();
profileFrame := TProfileFrame.Create(TabItem);
inc(tab_name_Count);
tabItem.Text := tab_name_Count.ToString;
//
profileFrame.Parent := tabItem;
tablist.Add(TabItem);
end;
现在你的框架有所有者:TabItem
。并且TabItem
有组件。我们可以使用它:
function TForm1.GetGenderFromFrame(ATabItem:TTabItem):String;
var i:integer;
begin
result := '';
if ATabItem.ComponentCount > 0 then
for i := 0 to ATabItem.ComponentCount - 1 do
if ATabItem.Components[i] is TProfileFrame then
result := (ATabItem.Components[i] as TProfileFrame).Gender.Selected.Text;
end;
PS你可以使用for ... in ... do
代替for ... to ... do
,它可以更好,但这取决于你。