簡體   English   中英

表單顯示上的 Delphi 訪問沖突

[英]Delphi Access Violation on form show

很抱歉不得不提出新問題,但我在任何地方都找不到答案。

我的應用程序仍在進行中,但基本上我試圖在初始化播放器時從我的 MainForm 調用另一個 Form,但是我收到了 Access Violation 錯誤。 你能解釋一下為什么會發生這種情況嗎?

我的主窗體代碼:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, jpeg, pngimage, getPlayer_u;...

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Randomize;

  InitGameSetup();
end;...

procedure TfrmMain.InitGameSetup();
begin
  SetWindowProperties();
  InitBackGround();
  InitMainMenu();
  InitGameBoard();
  InitScrabbleTileRack();
  InitPlayers();
//  GameLoop();
end; ...

procedure TfrmMain.InitPlayers();
var
  I : Integer;
  sName, sSurname : string;
begin
  setLength(Players, NUMBER_OF_PLAYERS);
  for I := 1 to High(Players) do
    begin
      GetPlayer(); ---------------- problem is here
      with Players[I] do
        begin
          Name := sName;
          Surname := sSurname;
        end;
    end;
end;...

procedure TfrmMain.GetPlayer();
begin
  frmGetPlayer.Show;
end;

我的frmGetPlayer

unit getPlayer_u;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmGetPlayer = class(TForm)
    btnSubmit: TButton;
    edtName: TEdit;
    edtSurname: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure btnSubmitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    sPlayerName, sPlayerSurname : string;
  end;

var
  frmGetPlayer: TfrmGetPlayer;

implementation

{$R *.dfm}

procedure TfrmGetPlayer.btnSubmitClick(Sender: TObject);
begin
  sPlayerName := edtName.Text;
  sPlayerSurname := edtSurname.Text;

  if not ((Length(sPlayerName) >= 1) and (Length(sPlayerSurname) >= 1)) then
    MessageDlg('Please enter a name and surname.', mtInformation, [mbOK], 0)
  else
    Self.Free;
end;

procedure TfrmGetPlayer.FormCreate(Sender: TObject);
begin
  with Self do
    begin
      Position := poScreenCenter;
      BorderStyle := bsDialog;
    end;
end;

end.

我的 dpr:

program main_p;

uses
  Forms,
  main_u in 'main_u.pas' {frmMain},
  getPlayer_u in 'getPlayer_u.pas' {frmGetPlayer};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.

錯誤:

錯誤信息:訪問沖突

只有您的 MainForm 對象在程序啟動時自動創建。 在其OnCreate事件中,您的 Player Form 對象尚未創建,因此frmGetPlayer變量未指向有效對象。

frmGetPlayer是一個全局變量,所以它最初是nil 錯誤消息告訴您,您正在訪問地址 0 附近的無效內存,這幾乎總是表示通過nil指針訪問類的成員。

因此,在創建 Player Form 對象並指定frmGetPlayer指向它之前,您不能調用frmGetPlayer.Show() 你展示的代碼沒有做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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