自從Delphi 2發佈以來,舊式的Delphi對象已經被打破,可能更早。當他們具有編譯器管理類型的字段時,他們不會很好地繼承,例如string
或動態數組。 2004年有a discussion about itcomp.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文件的主要開始結束塊的變量被編譯器視爲局部變量,因此它們未被設置爲全部像他們的全球同行零位零。當你將你的變量聲明移動到一個單元,但繼續在你的DPR文件中使用它時,它會被提升到「全局」狀態。
您的TGUI_Element
類型有一個string
成員0123',它看起來就是您在類型層次結構中唯一的字符串字段。拿出來,或改爲ShortString
,我敢打賭你的崩潰至少暫時消失。
整個存檔不會在tstartgamebutton上grep。 – 2010-01-27 14:13:33