Delphi:TImage.Create导致访问冲突

Mik*_*ail 4 arrays delphi delphi-7 access-violation

我提前为新手问题道歉,但为什么我的代码出现"访问冲突"错误(在"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;
Run Code Online (Sandbox Code Playgroud)

Hem*_*ant 17

问题是你实际上是这样做的:

var
  imageVariable: TImage;
begin
  imageVariable.Create (ParentForm);
end;
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为正在对尚未分配的变量调用"Create"方法.

你应该做这个:

var
  imageVariable: TImage;
begin
  imageVariable := TImage.Create (ParentForm);
  try
    //use the object
  finally
    FreeAndNil (imageVariable);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

或者更具体地说,在您的代码中

for Loop := 1 to 10 do
begin
  ArrayOfImages[Loop] := TImage.Create (Self);
end;
Run Code Online (Sandbox Code Playgroud)

不要忘记释放物体

编辑:接受@ andiw的评论并收回释放对象的提示.EDIT2:接受@ Gerry的评论并使用Self作为所有者.

  • 不会TImage.Create(自我); 会更好.在表单类的方法中使用特定的表单实例变量几乎总是一个坏主意 - 如果有人创建了具有其他名称的实例,它将失败. (3认同)