Delphi - 在运行表单 Create 之前创建控件?

标签 delphi forms controls creation

嗯,我的问题如下:

我有一个 Delphi 5 应用程序,我基本上将其移植到 Delphi 2010(用最新版本替换旧组件,修复不可避免的 Ansi/Unicode 字符串问题等),但我遇到了一些麻烦。

创建我们的其中一个表单后,发生了访问冲突。经过查看,我得出的结论是,这是因为 Create 中调用的 setter 之一试图更改尚未创建的表单上的对象的属性。

我对它进行了一些修剪,但代码基本上如下所示:

在表单声明中:

property EnGrpSndOption:boolean read fEnGrpSndOption write SetGrpSndOption;

在表单的创​​建中:

EnGrpSndOption := false;

实现中:

procedure Myform.SetGrpSndOption(const Value: boolean);
begin
  fEnGrpSndOption := Value;
  btGrpSnd.Visible := Value;
end;

通过在 btGrpSnd.Visible := Value 之前添加 ShowMessage(BooltoStr(Assigned(btGrpSend), true)) ,我确认问题是 btGrpSnd 尚未创建。

btGrpSend 是一个 LMDButton,但我很确定它不太相关,因为它甚至还没有创建。

虽然我意识到我可能应该只在确认分配了控件后才分配一个值,但这只会导致 create 中设置的值未设置为实际控件。

所以我想要做的是找到一种方法来确保在运行“Create”之前创建表单上的所有控件。

任何有关此操作的帮助或有关 Delphi 如何创建表单的信息将不胜感激。 它在 Delphi 5 中可以正常工作,所以我想应该在版本之间的更改列表中的某个位置提及其原因。毕竟 Delphi 2010 比 Delphi 5 新很多。

最佳答案

就像托比亚斯提到的(但提倡反对),您可以更改创建顺序(在更改创建顺序的表单中)。

但是您也可以在 setter 方法中检查表单是否正在创建(form.componentstate 中的 csCreating)。如果是的话,您必须自己存储该属性值,并在 AfterConstruction 中处理它。

关于Delphi - 在运行表单 Create 之前创建控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900457/

相关文章:

delphi - SerialForms.pas(17) : W1010 Method 'Create' hides virtual method of base type 'TComponent'

.net - 在不导入 winmm.dll 或 microsoft.visualbasic.dll 的情况下播放声音文件

multithreading - 在 Delphi 中使用 CreateRemoteThread 将代码注入(inject)另一个进程的正确方法是什么?

c# - 通过 White 访问 DataGridView 单元格

html - 如何让我的登陆页面对桌面/移动访问者有不同的规则?

php - 如何实现和调用多个php函数?

Javascript 似乎脱离了控制流

delphi - 如何在delphi中使用不同的图标大小?

three.js - OrbitControls 交互时自动旋转停止?

C# 重新排序/渲染多层面板