如何验证应用程序是否已完成createForm语句?

时间:2014-06-08 23:00:30

标签: delphi

DPR档案中:

Application.CreateForm(TMain, Main);
Application.CreateForm(TCommStatus, CommStatus);

但如果我想在Main中使用CommStatus,我会收到错误,因为它还没有实例化。然后在TMain里面我尝试了:

procedure TMainWindow.FormShow(Sender: TObject);
begin
  Application.CreateForm(TCommStatus, CommStatus);
  CommStatus.Expand(Self);
end;

我试图让我的LOG窗口根据我的MainWindow位置和宽度进行定位和调整。但是由于我的LOG窗口是在主窗口之后创建的,所以我无法在OnCreate()中调用它,即使OnCreate()中没有正确的定位数据。

3 个答案:

答案 0 :(得分:1)

根本不使用Application.CreateForm来创建CommStatus表单。在MainWindow.OnCreate

中自行创建
proccedure TMainForm.FormCreate(Sender: TObject);
begin
  CommStatus := TCommStatus.Create(Self);
  CommStatus.Expand(Self);
end; 

请勿忘记从自动创建表单列表中删除CommStatus(在Project->选项 - >表单中)。

答案 1 :(得分:1)

  

我需要知道在执行CreateForm之前CommStatus是否已分配。

您回答了自己的问题 - 使用Assigned(),例如:

uses
  ..., CommStatusFormUnit;

if not Assigned(CommStatus) then
  Application.CreateForm(TCommStatus, CommStatus);

或者:

uses
  ..., CommStatusFormUnit;

if not Assigned(CommStatus) then
  CommStatus := TCommStatus.Create(Application);

全局变量(如CommStatus单元中的CommStatusFormUnit变量在程序启动时为零初始化,因此Assinged()将返回False,直到实际创建表单为止,只要您将新的Form实例分配给全局变量(如上所示)。

  

但是CommStatus标识符在它之前不存在。所以我不能使用Assigned(CommStatus)。

是的,确实存在,是的,您可以使用Assigned(CommStatus)。如果您遇到错误,那么您没有正确使用它。

  

展开(自我)应该使用主要位置信息将CommStatus放在Main旁边的同一个左侧位置,但它没有。

然后你没有正确处理定位逻辑。

答案 2 :(得分:0)

另一种选择是先在CommStatus中创建DPR。但是没有使用Application.CreateFom(这会错误地使CommStatus成为主要形式)。 通过这种方式,您可以确定它已经创建,而不必担心。

CommStatus := TCommStatus.Create(Application);
Application.CreateForm(TMain, Main);

但是,您尝试在主要表单的OnShow中扩展CommStatus这一事实对我来说似乎有些不确定。你已经在两种形式之间创建了一种隐藏的依赖关系,这正是全局性不满意的原因之一。

清理它的一个选项如下:

CommStatus := TCommStatus.Create(Application);
Application.CreateForm(TMain, Main);
CommStatus.Expand(Main);

这样两者之间的关系是明确的,不易出错。