[英]Why do I get an access violation when I create a form within a class if the class instance is not a variable defined in the calling procedure
我正在嘗試使用 class 來顯示進度指示器。
如果我將 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.
ProgressIndicator.Create
和TProgressIndicator.Create
之間存在差異。 通常,您希望使用第二種形式,即“創建 class TProgressIndicator
的新實例”。 第一種形式表示,“獲取存儲在變量ProgressIndicator
中的TProgressIndicator
實例並調用其Create
方法”。 問題是,它不會創建該實例。 在您的情況下, ProgressIndicator
是nil
,因為所有 class 成員在構造時都被初始化為類似零的值,這本身不是問題 - 它仍然鏈接到 class 數據,因此它實際上可以調用Create
方法. 該方法嘗試創建表單,成功,然后嘗試將其存儲到ANewForm
字段,因為ANewForm
的內存地址是Self
+ offset; 對於您的代碼,偏移量可能為 0, Self
為 nil,最終地址為(nil + 0) = 0
,而 memory 位置 0 位於禁止所有訪問的 memory 頁面中。 這就是您獲得訪問沖突的原因。
你想要的是:
procedure TfmMain.Button1Click(Sender: TObject);
begin
ProgressIndicator := TProgressIndicator.Create;
end;
這將首先創建一個新實例,然后使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.