Основная проблема заключается в том, что переменные ваших фреймов являются локальной переменной процедуры.
Я вижу разные способы решения вашей проблемы.
Во-первых: используя 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
, может быть лучше, но решать вам.