【问题标题】:Delphi: TImage.Create causes Access violationDelphi:TImage.Create 导致访问冲突
【发布时间】:2010-11-05 09:56:57
【问题描述】:

我提前为一个新手问题道歉,但为什么我会在下面的代码中出现“访问冲突”错误(在“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;

【问题讨论】:

    标签: delphi arrays delphi-7 access-violation


    【解决方案1】:

    问题在于您实际上是在这样做:

    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 作为所有者。

    【讨论】:

    • 据我了解,当 SelectorForm 被销毁时,TImage 将自动释放,因为它已作为其所有者传递 - 还是我有什么问题?
    • @andiw:你是对的。如果您将表单指定为其所有者,则无需释放对象。
    • 不会 TImage.Create(Self);会更好。在表单类的方法中使用特定的表单实例变量几乎总是一个坏主意 - 如果有人用另一个名称创建实例,它将失败。
    【解决方案2】:

    上面的代码有很多问题。 (不要像这样使用“With”作为开始,不要使用 Byte 作为循环变量)

    我的假设是,您最终希望创建一个 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 实例上调用 free。

    【讨论】:

    • 对循环变量使用字节肯定不是问题。
    • 不,只是一种风格。限制循环的范围没有错,但字节通常是一个有意义的大小,我会花几秒钟的时间来看看这个并想知道为什么字节......
    • 不,他不需要清理实例。 theForm 会做到这一点。并且数组是全局的。当单元完成时它会死。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2016-06-15
    • 2018-12-07
    • 2012-05-24
    相关资源
    最近更新 更多