这是我点击btnInfoClick
调试器异常通知
Project_PAT_Phase_3.exe引发异常类EAccessViolation,并在模块'Project_PAT_Phase_3.exe中读取地址004047E0处的访问冲突''读取地址00000022'。
程序运行顺利,没有任何错误,直到我点击代码中显示的按钮。我很感激你的帮助。
unit Navigation;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, InfoPopUp;
type
Tvector = Array[1..14] of string;
TFrmNavigation = class(TForm)
btnVote: TButton;
RdgInfo: TRadioGroup;
Label2: TLabel;
btnInfo: TButton;
procedure btnInfoClick(Sender: TObject);
private
public
MyFile : TextFile;
sLine : string;
sArrayParty : Tvector;
end;
var
FrmNavigation: TFrmNavigation;
implementation
procedure TFrmNavigation.btnInfoClick(Sender: TObject);
var
K : integer;
iCheck : integer;
begin
FrmInfo.Visible := true;
K := 1;
iCheck := 0;
if FileExists('PartyInfo.txt') <> True
then
begin
MessageDlg('File does not exist',mtError,[mbOK],0);
Exit;
end;// end of If statement
AssignFile(MyFile,'PartyInfo.txt');
Reset(MyFile);
while NOT eof(MyFile) do
begin
Inc(K);
Readln(MyFile,sLine);
sLine := sArrayParty[K];
end;//end of While
closefile(MyFile);
case RdgInfo.ItemIndex of
0 : begin
FrmInfo.Caption := 'African Christian Democratic Party (ACDP)';
FrmInfo.redOutput.Text := sArrayParty[1];
end;
1 : begin
FrmInfo.Caption := 'African National Congress (ANC)';
FrmInfo.redOutput.Text := sArrayParty[2];
end;
end;
下面的最后一个end.
是错误在代码中弹出的地方,但它在项目单元中是奇怪的,因为当我有一个断点时,异常将在while循环中停止程序。
program PAT_Phase_3;
uses
Forms,
WelcomePage in 'WelcomePage.pas' {frmWP},
Navigation in 'Navigation.pas' {FrmNavigation},
InfoPopUp in 'InfoPopUp.pas' {FrmInfo};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfrmWP, frmWP);
Application.CreateForm(TFrmNavigation, FrmNavigation);
Application.CreateForm(TFrmInfo, FrmInfo);
Application.Run;
end.
答案 0 :(得分:0)
错误消息的地址接近于零,表示您正在访问nil对象引用。很可能FrmInfo是零。或者也许sArrayParty是零。使用调试器确认错误的位置。显然,引用nil引用是错误的。
当您收到类似这样的错误时,请使用配置为中断异常的调试器,以指向出现故障的代码行。然后尝试找出代码行失败的原因。
如果您遇到数百行代码,很难找出故障的位置。如果你可以专注于一行代码,那就容易多了。是时候学习调试了。
答案 1 :(得分:0)
在Delphi中,您可以通过项目设置将表单设置为AutoCreate。如果您的项目不是自动创建所有表单,那么您的FrmInfo将为零。在您之前添加此代码
FrmInfo.Visible := true;
行,看看它是否会让你更进一步。
if FrmInfo = nil then
FrmInfo := TFrmInfo.Create(nil);