我做了一个文件管理器,在管理器里面有一个显示磁盘信息的对话框,我运行的时候没有任何错误,但只要在管理器里面一打开就会出现错误:Access violation at address 0048A740 in module 'filemanager.exe'.read of address 0000033c.
这是为什么?我百思不得其解,望高人来解答~
这是磁盘信息对话框的代码:unit DkViewDlg;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;type
TDiskViewForm = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
TotalSpace: TEdit;
Diskname: TEdit;
FreeSpace: TEdit;
Label4: TLabel;
Label5: TLabel;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
DiskViewForm: TDiskViewForm;implementationuses Unit1;{$R *.dfm}procedure TDiskViewForm.FormActivate(Sender: TObject);
var
freerm,Totalrm:integer;
i:byte;
temps:string;
begin
temps:=ChildForm.TabControl1.Tabs.Strings[ChildForm.TabControl1.tabindex];
with DiskViewForm do
begin
Diskname.Text:=temps;
if temps='c'then
i:=3
else if temps='d'then
i:=4
else if temps='e'then
i:=5
else if temps='f'then
i:=6;
Freerm:=DiskFree(i);
Totalrm:=DiskSize(i);
if(Freerm<>-1)and(Totalrm<>-1)then
begin
FreeSpace.Text:=IntToStr(Freerm);
TotalSpace.Text:=IntToStr(Totalrm);
end;
end;end;end.
这是为什么?我百思不得其解,望高人来解答~
这是磁盘信息对话框的代码:unit DkViewDlg;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;type
TDiskViewForm = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
TotalSpace: TEdit;
Diskname: TEdit;
FreeSpace: TEdit;
Label4: TLabel;
Label5: TLabel;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
DiskViewForm: TDiskViewForm;implementationuses Unit1;{$R *.dfm}procedure TDiskViewForm.FormActivate(Sender: TObject);
var
freerm,Totalrm:integer;
i:byte;
temps:string;
begin
temps:=ChildForm.TabControl1.Tabs.Strings[ChildForm.TabControl1.tabindex];
with DiskViewForm do
begin
Diskname.Text:=temps;
if temps='c'then
i:=3
else if temps='d'then
i:=4
else if temps='e'then
i:=5
else if temps='f'then
i:=6;
Freerm:=DiskFree(i);
Totalrm:=DiskSize(i);
if(Freerm<>-1)and(Totalrm<>-1)then
begin
FreeSpace.Text:=IntToStr(Freerm);
TotalSpace.Text:=IntToStr(Totalrm);
end;
end;end;end.
delphi的错误窗口也没有任何提示~
temps:=ChildForm.TabControl1.Tabs.Strings[ChildForm.TabControl1.tabindex];
就会出错~
但是这句我实在看不出哪里有错,那条错误信息我也不知道说的什么
当没有一个tab页被选中的话,tabindex就是-1.
这样数据访问越界,自然就会出现Access violation错误。
这样的话应该报List index out of bounds的异常而不是access violation你那个ChildForm是个啥东东,八层是ChildForm是个无效引用。用检查下代码ChildForm是否已经创建,或者是不是已经释放了。
procedure TDiskViewForm.FormActivate(Sender: TObject);
var
freerm,Totalrm:integer;
i:byte;
temps:string;
begin
//加句排错的/忽略异常的
try
if (ChildForm=nil) or (ChildForm.TabControl1=nil) or (ChildForm.TabControl1.Tabs=nil)or
(ChildForm.TabControl1.tabindex=-1) then Exit;
temps:=ChildForm.TabControl1.Tabs.Strings[ChildForm.TabControl1.tabindex];
except
exit;
end;
with DiskViewForm do
begin
Diskname.Text:=temps;
if temps='c'then
i:=3
else if temps='d'then
i:=4
else if temps='e'then
i:=5
else if temps='f'then
i:=6;
Freerm:=DiskFree(i);
Totalrm:=DiskSize(i);
if(Freerm<>-1)and(Totalrm<>-1)then
begin
FreeSpace.Text:=IntToStr(Freerm);
TotalSpace.Text:=IntToStr(Totalrm);
end;
end;end;
temps:=ChildForm.TabControl1.Tabs.Strings[ChildForm.TabControl1.tabindex];
设断点,运行到此处时,鼠标选中ChildForm.TabControl1.tabindex后,把鼠标放到选中的区域上,看看它的值是多少