Delphi:TImage.Create导致访问冲突
-
10-07-2019 - |
题
我提前为一个新手问题道歉,但为什么我得到<!>;访问违规<!>下面的代码出错(在<!>“; Create(SelectorForm); <!>”行)?我尝试使用主窗体作为所有者,但它没有任何区别。
var
SelectorForm: TSelectorForm;
ArrayOfImages: Array [1..10] of TImage;
implementation
procedure TSelectorForm.FormCreate(Sender: TObject);
var
Loop: Byte;
begin
for Loop := 1 to 10 do
begin
with ArrayOfImages[Loop] do
begin
Create(SelectorForm);
end;
end;
end;
解决方案
问题是你实际上是这样做的:
var
imageVariable: TImage;
begin
imageVariable.Create (ParentForm);
end;
哪个错了,因为<!>“创建<!>”;正在调用尚未分配的变量的方法。
你应该这样做:
var
imageVariable: TImage;
begin
imageVariable := TImage.Create (ParentForm);
try
//use the object
finally
FreeAndNil (imageVariable);
end;
end;
或者更具体地说,在您的代码中:
for Loop := 1 to 10 do
begin
ArrayOfImages[Loop] := TImage.Create (Self);
end;
不要忘记释放对象
编辑:接受@ andiw的评论并收回释放对象的提示。 EDIT2:接受@ Gerry的评论并使用Self作为所有者。
其他提示
上述代码存在很多问题。 (不要使用<!>“;使用<!>”这样的开头,不要使用Byte作为循环var)
我的假设是你最终想要一个以窗体作为父窗口创建的TImage实例数组。
所以基于这个假设...你想要(未经测试的)
之类的东西var
ArrayOfImages: Array [0..9] of TImage;
i : integer;
begin
for i := 0 to 9 do
begin
ArrayOfImages[i] := TImage.Create(theForm);
end;
end;
现在请注意,当您使用完阵列后,您将负责清理阵列,您需要在每个Image实例上免费拨打电话。
不隶属于 StackOverflow