在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()中没有正确的定位数据。
答案 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);
这样两者之间的关系是明确的,不易出错。