You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何类实例非调用过程变量时创建表单会触发访问违例?

问题分析:Delphi进度指示器类触发访问违例的原因

我尝试用类来实现进度指示器,要是在调用过程里把ProgressIndicator声明成局部变量,程序运行完全正常,ANewForm能正常显示。但下面的代码会触发访问违例,求帮忙分析原因:

unit Main;

interface

uses
  Winapi.Windows, Vcl.Forms,
  System.Classes, Vcl.Controls, Vcl.StdCtrls,
  Progress;
type
  TProgressIndicator = class
  private
  public
    ANewForm : TForm;
    constructor Create;
  end;
type
  TfmMain = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ProgressIndicator : TProgressIndicator;
  end;
var
  fmMain: TfmMain;
implementation
{$R *.dfm}
constructor TProgressIndicator.Create;
  begin
     ANewForm := TForm.Create(Application);
     ANewForm.Show;
  end;
procedure TfmMain.Button1Click(Sender: TObject);
  begin
    ProgressIndicator.Create;
  end;
end.

问题原因

问题出在Button1Click的调用方式上:

  • ProgressIndicator是TfmMain类的成员变量,初始状态是nil(未初始化)。
  • 你直接通过ProgressIndicator.Create调用构造函数,本质是在一个空指针上调用对象的成员方法,这必然会触发访问违例。

正确写法

应该通过类名调用构造函数,把返回的实例赋值给成员变量:

procedure TfmMain.Button1Click(Sender: TObject);
begin
  ProgressIndicator := TProgressIndicator.Create;
end;

另外还要注意内存管理,当不再需要这个进度指示器时,记得调用ProgressIndicator.Free释放资源,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:31:09