TList 如何从 Frame 的 TEdit/TCombobox 中获取输入值
How a TList can get the input value from a Frame's TEdit/TCombobox
主窗体包含 TTabControl
可以动态创建一些选项卡。每当我添加新选项卡时,都会创建一个框架并将其添加到新选项卡中。最后,我会将所有这些 TTabItem
保存到 TList
.
TForm1 = class(TForm)
TabControl1: TTabControl;
procedure TForm1.AddNewTab;
var
profileFrame :TProfileFrame;
begin
profileFrame := TProfileFrame.Create(Self);
//TabItem
TabItem := TabControl1.Add();
inc(tab_name_Count);
tabItem.Text := tab_name_Count.ToString;
//
profileFrame.Parent := tabItem;
tablist.Add(TabItem);
end;
这是我的框架:
TProfileFrame = class(TFrame)
Name: TEdit;
Gender: TComboBox;
最后,如何获取frame中的(Name)和(Gender)值,并在主窗体中打印出来?如果说我创建了 4 个选项卡,每个选项卡都有自己的框架,我如何从不同的框架中获取值?我对 Delphi.
超级困惑和陌生
主要问题是你的框架变量是过程局部变量。
我看到了解决您问题的不同方法。
首先:使用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 项目中查看)。你必须像这样改变你的程序:
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;
P.S。您可以使用 for ... in ... do
而不是 for ... to ... do
,它可以更好,但这取决于您。
主窗体包含 TTabControl
可以动态创建一些选项卡。每当我添加新选项卡时,都会创建一个框架并将其添加到新选项卡中。最后,我会将所有这些 TTabItem
保存到 TList
.
TForm1 = class(TForm)
TabControl1: TTabControl;
procedure TForm1.AddNewTab;
var
profileFrame :TProfileFrame;
begin
profileFrame := TProfileFrame.Create(Self);
//TabItem
TabItem := TabControl1.Add();
inc(tab_name_Count);
tabItem.Text := tab_name_Count.ToString;
//
profileFrame.Parent := tabItem;
tablist.Add(TabItem);
end;
这是我的框架:
TProfileFrame = class(TFrame)
Name: TEdit;
Gender: TComboBox;
最后,如何获取frame中的(Name)和(Gender)值,并在主窗体中打印出来?如果说我创建了 4 个选项卡,每个选项卡都有自己的框架,我如何从不同的框架中获取值?我对 Delphi.
超级困惑和陌生主要问题是你的框架变量是过程局部变量。
我看到了解决您问题的不同方法。
首先:使用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 项目中查看)。你必须像这样改变你的程序:
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;
P.S。您可以使用 for ... in ... do
而不是 for ... to ... do
,它可以更好,但这取决于您。