为何类实例非调用过程变量时创建表单会触发访问违例?
问题分析: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
相关产品推荐
相关产品推荐

