嵌入式子窗体(Delphi,Firemonkey)上的控件无法访问的值

时间:2019-11-20 15:18:03

标签: delphi firemonkey rad-studio

我是Firemonkey的新手(使用RadStudio 10.3.2),并且我正在尝试更新嵌入式子窗体上的列表框控件。但是,当我尝试访问列表框(ListBox1)的任何属性时,它们都显示为“无法访问的值”。我很确定我缺少一些非常简单的东西。非常感谢您的帮助!谢谢!

我做了以下简化的应用程序,以说明我的问题。

Project1应用程序初始化:

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Unit1.pas:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure EmbedForm(AParent:TControl; AForm:TCustomForm);
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Embed Scenarios Form
  EmbedForm(Panel1, TForm2.Create(Self));
  Panel1.Visible := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  data_strings: array of string;
begin
  // Assign strings
  SetLength(data_strings, 2);
  data_strings[0] := 'Hello';
  data_strings[1] := 'World';
  // Load strings
  Form2.ListBox1.Items.Add(data_strings[0]);
  Form2.ListBox1.Items.Add(data_strings[1]);
end;

procedure TForm1.EmbedForm(AParent: TControl; AForm: TCustomForm);
begin
  while AForm.ChildrenCount>0 do
    AForm.Children[0].Parent:=AParent;
end;

end.

Unit2.pas:

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.ListBox;

type
  TForm2 = class(TForm)
    ListBox1: TListBox;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

end.

主窗体上的代码无法访问Form2.ListBox1属性-请参见Button1Click事件。我有一个使用子窗体(Unit2)的父窗体(Unit1)。

我不知道为什么无法访问已启用的可见组件。我的模态表单从来没有这个问题,所以我认为这与嵌入式子表单有关。

2 个答案:

答案 0 :(得分:4)

错误是您没有保留对TForm2实例的引用。但是,您稍后会在程序中尝试使用全局Form2变量。

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Embed Scenarios Form
  EmbedForm(Panel1, TForm2.Create(Self)); 
  Panel1.Visible := true;
end;

TForm2.Create(self)返回一个引用,您将其传递给EmbedForm() 但随后您将其松开。 稍后在Button1.Click中,您致电Form2.ListBox1.Items.Add(data_strings[0]);,但未分配Form2

将其更改为例如:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Embed Scenarios Form
  Form2 := TForm2.Create(Application); // Use `Form2` name declared in `Unit2`
  EmbedForm(Panel1, Form2);
  Panel1.Visible := true;
end;

答案 1 :(得分:-1)

您更改了“父级”,但“所有者”未更改

fmain.lb_Scenarios.Items.Add(data[i])