簡體   English   中英

如果 class 實例不是調用過程中定義的變量,為什么在 class 中創建表單時出現訪問沖突

[英]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.CreateTProgressIndicator.Create之間存在差異。 通常,您希望使用第二種形式,即“創建 class TProgressIndicator的新實例”。 第一種形式表示,“獲取存儲在變量ProgressIndicator中的TProgressIndicator實例並調用其Create方法”。 問題是,它不會創建該實例。 在您的情況下, ProgressIndicatornil ,因為所有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM