我做了一个文件管理器,在管理器里面有一个显示磁盘信息的对话框,我运行的时候没有任何错误,但只要在管理器里面一打开就会出现错误: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.

解决方案 »

  1.   

    就是只要我不打开那个磁盘管理对话框怎么弄那个管理器都没事,但只要一打开磁盘管理对话框就会出现那个错误~
    delphi的错误窗口也没有任何提示~
      

  2.   

    跟踪了发现只要到:
    temps:=ChildForm.TabControl1.Tabs.Strings[ChildForm.TabControl1.tabindex];
    就会出错~
    但是这句我实在看不出哪里有错,那条错误信息我也不知道说的什么
      

  3.   

    把i和temps初始化了还是没用,继续求教~
      

  4.   

    看看ChildForm.TabControl1.tabindex的值。
    当没有一个tab页被选中的话,tabindex就是-1.
    这样数据访问越界,自然就会出现Access violation错误。
      

  5.   

    我在Childform的ONCreate里面给它赋了初值0啊~
      

  6.   


    这样的话应该报List index out of bounds的异常而不是access violation你那个ChildForm是个啥东东,八层是ChildForm是个无效引用。用检查下代码ChildForm是否已经创建,或者是不是已经释放了。
      

  7.   

    仔细检查一下ChildForm,看是在生成这个对象的时候是否调用了正确的构造方法,或者是否已经释放等。我在自己程序中遇到过,错误地调用了父类的构造函数,然后引用子类的方法时,就出现了类似的错误。
      

  8.   

    肯定创建了啊!那个childform就是文件管理器,我就是从childform里面打开这个窗口的啊!
      

  9.   


    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;
      

  10.   


    temps:=ChildForm.TabControl1.Tabs.Strings[ChildForm.TabControl1.tabindex];
    设断点,运行到此处时,鼠标选中ChildForm.TabControl1.tabindex后,把鼠标放到选中的区域上,看看它的值是多少