Как TList может получить входное значение из TEdit / TCombobox фрейма - PullRequest
1 голос
/ 04 августа 2020

Основная форма содержит 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;

Наконец, как я могу получить (Имя ) и (Пол) во фрейме, и распечатать его в основной форме? Если, скажем, я создал 4 вкладки, каждая вкладка имеет свой собственный фрейм, как я могу получить значение из другого фрейма? Я очень запутался и новичок в Delphi.

1 Ответ

1 голос
/ 04 августа 2020

Основная проблема заключается в том, что переменные ваших фреймов являются локальной переменной процедуры.

Я вижу разные способы решения вашей проблемы.

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

...