gpt4 book ai didi

delphi - Delphi 和 Lazarus 的表单初始化有何区别?

转载 作者:行者123 更新时间:2023-12-03 15:02:29 24 4
gpt4 key购买 nike

MainForm 在运行时创建一些辅助 Frame 对象来显示各种选项面板。

这是这些框架类之一的典型构造函数(它们各自扩展 TFrame):

constructor Tframe2.Create(AOwner: TComponent);
begin
inherited;
edTime.Text := '12:00pm'; //edTime is a TEdit control. this line is where it throws the exception
//etc.
end;

这段代码在Delphi中工作得很好(无论它是否是正确的做事方式),但是Lazarus中的相同代码不断抛出EInvalidOperation异常,因为控件(TEdit)还没有分配父“窗口”( rsControlHasNoParentWindow),当我检查代码时,这实际上是有意义的,因为直到调用构造函数之后,父级似乎才被分配。

这是 MainForm 中初始化辅助框架的代码:

if Assigned(frame) then FreeAndNil(frame);
case Node.AbsoluteIndex of
optInterval: frame := Tframe2.Create(Self); //here's where the constructor gets called.
//etc
end;
frame := TframeOther.Create(Self);
if Assigned(frame) then
begin
frame.Parent := panOptions; //here's where Tframe2's parent gets set
frame.Align := alClient;
end;

那么谁能解释一下 Delphi 和 Lazarus 之间在表单初始化顺序方面是否有重要的区别?

解决此类初始化顺序问题的最标准方法是什么?与我更熟悉的其他语言相比,可能有不同的策略来解决此类错误。我可以向构造函数添加另一个参数,或者如果有一个方法被称为构造函数后在屏幕上预绘制它,我可以覆盖它,我可以重新定位该代码,或者只是创建一个辅助方法并在调用 setParent 后调用它。这里有什么特别的最佳实践吗?

编辑]:看来这可能在某种程度上特定于 TEdit。看起来初始化复选框状态的行没有相同的问题。这可能只是 Lazarus 中的一个错误吗?

最佳答案

经过进一步的实验,我已经能够通过添加一行将 TEdit 的父级设置为 Frame(而不是设置 Frame 的父级)来解决崩溃的大部分直接问题。就像这样:

edTime.Parent := Self;
edTime.Text := '12:00';

但我仍然想更好地理解为什么这是“有时”需要的。

编辑:虽然这修复了在 TEdit 上设置文本的问题,但这并没有修复我拥有的自动调整大小代码,该代码会迭代组件并调整任何恰好是复选框的大小。显然,没有设置其父级的表单仍然是“某种”问题。

edit2:向构造函数添加第二个参数并在构造函数中设置整个表单的父级似乎完全消除了为 TEdit 设置父级的需要。

关于delphi - Delphi 和 Lazarus 的表单初始化有何区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com