Delphi - 从表单访问Frame对象

a3d*_*dvm 2 delphi frames

我需要运行一个附加到按钮(例如SQLBtn)的动作,该动作放在我的应用程序中的Frame1上,来自Form1.
我已经在Form1中使用了框架,但似乎无法以任何方式解决.
我已经尝试过Frame1.SQLbtn TFrame1.SQLbtn TFrameSQLBtn等但无法实现它.
我想得到类似于'SQLbtn.click'的东西来运行它背后的事件.

有没有人有任何想法如何解决它?

Wer*_*ann 6

我不确定我是否理解你的问题.听起来你有一个带按钮的框架(按钮上有一个TAction或click事件处理程序),这个框架就坐在一个表格上.现在,您希望以编程方式模拟该按钮上的单击.

显然,您需要将框架单元添加到窗体的uses子句中.您还需要表单上的框架实例,该实例应该导致框架类型的表单字段,例如

TForm1...
  ...
  Frame1: TFrame1;
end;
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过Frame1.SQLbtn.Click任何表单的方法执行该代码.更好的方法可能是在框架上提供可以从表单中使用的公共方法.然后你不需要直接访问按钮(按钮是框架的实现细节,框架私有可以这么说).

澄清后编辑

我知道你有以下场景:

TFrameForm1...
  ...
  Frame1: TFrame1;
end;

TForm1...
  ...
  procedure something;
end;

procedure TForm1.something;
begin
  // how to call a method on Frame1 which is on FrameForm1
end;
Run Code Online (Sandbox Code Playgroud)

您最好的选择是将代码从框架按钮OnClick事件处理程序移动到一个单独的单元中.这可以是数据模块,也可以是具有独立过程的另一个单元.然后,您可以从Form1和Frame1按钮事件处理程序中调用该代码.这是Vegar评论的内容.

如果这是不可能的,例如因为处理需要访问Frame1上的其他控件,请将代码移动到Frame1上的新过程(我的原始建议):

TFrame1...
  ...
public
  procedure framestuff;
end;

procedure TFrame1.framestuff;
begin
  ...
end;

procedure TFrame1.SQLbtnClick(Sender...);
begin
  framestuff;
end;
Run Code Online (Sandbox Code Playgroud)

现在,您需要从Form1调用该方法.你需要一个对FrameForm1的引用.在创建TFrameForm1时需要手动初始化(!).在此示例中,引用是字段FFrameForm:

TForm1...
  ...
  FFrameForm: TFrameForm1;
  procedure something;      
end;

procedure TForm1.something;
begin
  FrameForm.framestuff;
end;
Run Code Online (Sandbox Code Playgroud)

或者,默认情况下,Delphi将所有表单的全局变量添加到表单单元(自动表单创建,检查项目选项/表单).然后你这样做:

procedure TForm1.something;
begin
  FrameForm1.framestuff; // if FrameForm1 is the name Delphi used for the global variable
end;
Run Code Online (Sandbox Code Playgroud)

当然还有很多其他的变化......