自 Delphi 2 发布以来,旧式 Delphi 对象已经被破坏,也许更早。当它们具有编译器管理类型的字段(例如string
动态数组)时,它们不能很好地进行继承。2004 年在comp.lang.pascal.delphi.misc上有一个关于它的讨论。这是重现它的代码:
type
TBase = object
public
s: string;
end;
TDerived = object(TBase)
end;
procedure test;
var
obj: TDerived; //okay for TBase!
begin
assert(obj.s = '', 'uninitialized dynamic variable');
end;
事实上,这只是TBase
偶然的,因为函数的序言代码是如何生成的。在该函数中添加额外的代码可能会使其崩溃。
确实,正如您所观察到的那样——旧式对象没有正确初始化。他们的字符串字段一开始并不是空字符串;相反,它们包含垃圾,因此如果不使用类似FillChar
.
这似乎是由于变量是局部变量。单位范围(“全局”)变量似乎工作正常。在单元范围内声明但仅由单元的初始化部分或在程序范围内且仅在 DPR 文件的主开始-结束块中使用的变量被编译器视为局部变量,因此它们不会设置为 all -bits-zero 就像他们的全球同行一样。当您将变量声明移动到一个单元但继续在 DPR 文件中使用它时,它会提升到“全局”状态。
您的TGUI_Element
类型有一个string
名为 的成员DbgName
,看起来这是您在类型层次结构中拥有的唯一字符串字段。把它拿出来,或者把它改成ShortString
,我敢打赌你的崩溃会消失,至少是暂时的。