【问题标题】:How to access MDI Child's component in MainForm in Delphi?Delphi如何访问MainForm中的MDI Child的组件?
【发布时间】:2021-05-21 07:56:04
【问题描述】:

我使用 Delphi 编写代码。
当我按下按钮时,它会创建一个新的 MDI 子窗体。
所以,程序有多个 MDI 子窗体,我想访问 MainForm 中每个子窗体的组件(例如,计时器)。
MainForm 是 fsMDIForm,ChildForm 是 fsMDIChild。

这是我尝试过的代码。但它不起作用,因为 TChildForm 和 TForm 不兼容。

procedure TMainForm.Start1Click(Sender: TObject);
var   
i : Integer;
begin
  for i := MainForm.MDIChildCount-1 to 0 do
  begin
    ChildForm := MainForm.MDIChildren[i];   //Incompatible types -> Can't Run
    ChildForm.Timer1.Enabled := True;
  end;
end;

unit MDIChildForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ToolWin, ActnMan, ActnCtrls, ComCtrls, Buttons,
  ExtCtrls;

type
  TChildForm = class(TForm)
    ToolBar1: TToolBar;
    ListView1: TListView;
    ToolButton1: TToolButton;
    Splitter1: TSplitter;
    Memo1: TMemo;
    ToolButton2: TToolButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ChildForm: TChildForm;
  value1: Integer = 1;

implementation

{$R *.dfm}

procedure TChildForm.FormCreate(Sender: TObject);
begin
  {
    itm := ListView1.Items.Add;
    itm.Caption := 'item ' + IntToStr(value1);
    itm.SubItems.Add('subItem1 ' + IntToStr(value1));
    itm.SubItems.Add('subItem2 ' + IntToStr(value1));
  }
  Timer1.Enabled := False;
  {
    ChildForm.Caption := 'ChildForm' + IntToStr(value1);
    Inc(value1);
  }
end;
procedure TChildForm.ToolButton1Click(Sender: TObject);
begin
  ToolButton1.Show;
  value1 := value1 + 10;
end;

procedure TChildForm.ToolButton2Click(Sender: TObject);
begin
  //ListView1.Items.Item[0] := 'Index';
end;

procedure TChildForm.Timer1Timer(Sender: TObject);
var
  itm : TListItem;
  i : Integer;
begin
  for i:= value1 to value1+10 do
  begin
    itm := ListView1.Items.Add;
    itm.Caption := 'item ' + IntToStr(i);
  end;
  value1 := i;
end;

end.

如何以子形式访问组件?

【问题讨论】:

  • ChildForm 是如何声明的?是MainForm 一个fsMDIForm。您的问题缺少所需的详细信息。请编辑并提供minimal reproducible example
  • 我添加了有关我的代码的更多信息。对不起,我必须上传,所以我上传了关于 ChildForm 的完整代码。请查看我的问题。

标签: delphi delphi-7


【解决方案1】:

您需要使用这样的演员表:

procedure TMainForm.Start1Click(Sender: TObject);
var   
  i : Integer;
begin
  for i := MainForm.MDIChildCount-1 downto 0 do
    (MainForm.MDIChildren[i] as TChildForm).Timer1.Enabled := True;
end;

还请注意,我在 for 循环中使用了 downto,因为您想向后遍历子列表。

【讨论】:

  • @jayjay 如果您只是复制了代码,我想提请您注意当您将其遍历回病房时,在 for 循环中使用 downto(而不是 to) .
  • 是的,我找到了 XD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多