错误提示:
project project1.exe raised exception class EAccessviolation with message 'Access violation at address 00000000.read of address 00000000',process stopped. use step or run to continue.
请解释解释这个错误是什么意思.
这个导出excel的函数单独建立一个程序它不出错,但是放进我的这个程序就出错.请高手给指点.我把整个单元贴出来,请高手帮忙.
unit uq;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ComCtrls,OleServer,Excel2000,Excel97,ComObj;
type
  Tfrmuq = class(TForm)
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button3: TButton;
    Button2: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    StatusBar1: TStatusBar;
    Button7: TButton;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure ADODataSet1AfterOpen(DataSet: TDataSet);
    procedure Button7Click(Sender: TObject);
  private
  procedure CopyDbDataToExcel(target: TDbGrid);
    { Private declarations }
  public
    { Public declarations }
    tablename:string;    //动态传表名
  end;
var
  frmuq: Tfrmuq;implementationuses xianshi, u_frmquerysetting, zjxg;
 {$R *.dfm}procedure Tfrmuq.CopyDbDataToExcel(target: TDbGrid);
var
   icount,jcount:integer;
   xlApp: variant;
   sheet:variant;
   temp:string;
   cnum:integer;
begin
   savedialog1.Filter:='Excel文件(*.xls)|*.xls';
  SaveDialog1.Options:=[ofShowHelp,ofEnableSizing];
  if SaveDialog1.Execute then
  begin
     Screen.Cursor:=crHourGlass;
     try
     if not VarIsEmpty(xlApp) then
     begin
          xlApp.DisplayAlerts:=false;
          xlApp.Quit;
          VarClear(xlApp);
     end;
     ///////////////////create excel object by ole
     try
        xlApp:=CreateOleObject('Excel.Application');
     except
        Screen.Cursor:=crDefault;
        exit;
     end;
     xlApp.WorkBooks.Add[XLWBatWorkSheet];
     xlApp.WorkBooks[1].WorkSheets[1].Name:='exlsheet';
     sheet:=xlApp.WorkBooks[1].WorkSheets['exlsheet'];     if not target.DataSource.DataSet.Active then
     begin
          Screen.Cursor:=crDefault;
          exit;
     end;
     target.DataSource.DataSet.First;
     cnum:=1;
     for icount:=0 to target.Columns.Count-1 do
          if target.Columns[icount].Visible=true then
            begin
            sheet.cells[1,cnum]:=target.Columns.Items[cnum-1].Title.Caption;
            inc(cnum);
            end;
     jcount:=2;
     while not target.DataSource.DataSet.Eof do
     begin
           cnum:=1;
           for icount:=0 to target.Columns.Count-1 do
           begin
            //  if icount=0 then
            //  begin
            if target.Columns[icount].Visible=true then
              begin
               temp:=target.Columns.Items[icount].Field.AsString;
               insert('''',temp,1);
               sheet.cells[jcount,cnum]:=temp;
               inc(cnum);
              end;
            //  end
             // else            //后面也可能有多位数字的字段
            //  sheet.cells[jcount,icount+1]:=target.Columns.Items[icount].Field.AsString;
          end;
          inc(jcount);
          target.DataSource.dataset.Next;     end;
     sheet.SaveAs(SaveDialog1.FileName);
     application.MessageBox('数据导出成功!','提示信息',64+0);
     xlApp.Quit;
     SaveDialog1.Options:=[ofOverwritePrompt,ofShowHelp,ofEnableSizing];
     finally
     Screen.Cursor:=crDefault;
     end;     
  end;
end;procedure Tfrmuq.Button1Click(Sender: TObject);
begin
frmuq.Hide;
frmquerysetting.Showmodal;end;procedure Tfrmuq.Button3Click(Sender: TObject);
begin
adodataset1.Close;
adodataset1.CommandText:='select * from 信息卡 order by id ';;
adodataset1.Open;
end;procedure Tfrmuq.FormShow(Sender: TObject);
var
 i,j, t:integer;
begin
adodataset1.Close;
adodataset1.CommandText:='select * from 信息卡 order by id ';
adodataset1.Open;
if adodataset1.RecordCount>0 then
begin
button6.Enabled:=true;
end
else
begin
button6.Enabled:=false;
button7.Enabled:=false;
end;if frmxianshi.ListBox2.Items.Count>0 then
      begin
        for i:=0 to frmuq.DBGrid1.Columns.Count-1 do
           begin
              frmuq.DBGrid1.Columns.Items[i].Visible:=false;
           end;
   for i:=0 to frmxianshi.listbox2.Items.Count-1 do
       begin
          for t:=0 to frmuq.DBGrid1.Columns.Count-1 do
            begin
              if frmuq.DBGrid1.Columns[t].FieldName=frmxianshi.ListBox2.Items.Strings[i] then
              begin
                frmuq.DBGrid1.Columns.Items[t].Visible:=true;
             end;
       end;
  end;
end;
end;
procedure Tfrmuq.Button2Click(Sender: TObject);
begin
frmuq.Hide;
frmxianshi.Showmodal;
end;procedure Tfrmuq.Button4Click(Sender: TObject);
begin
CopyDbDataToExcel(DBGrid1);
end;procedure Tfrmuq.Button5Click(Sender: TObject);
begin
close;
end;procedure Tfrmuq.Button6Click(Sender: TObject);
var
idstring:string;
beginif button6.Enabled=false then exit;idstring:=adodataset1.fieldbyname('id').AsString;
frmzjxg.ADODataSet1.Close;
frmzjxg.ADODataSet1.CommandType:=cmdtext;
frmzjxg.ADODataSet1.CommandText:='select * from 信息卡 where id='+ idstring;
frmzjxg.ADODataSet1.Open;
frmzjxg.Edit1.Text:=frmzjxg.ADODataSet1.fieldbyname('女方姓名').AsString;
frmzjxg.Edit2.Text:=frmzjxg.ADODataSet1.fieldbyname('男方姓名').AsString;
frmzjxg.Edit3.Text:=frmzjxg.ADODataSet1.fieldbyname('女方单位').AsString;
frmzjxg.Edit4.Text:=frmzjxg.ADODataSet1.fieldbyname('卡号').AsString;
frmzjxg.edit11.Text:=frmzjxg.ADODataSet1.fieldbyname('办证时间').AsString;
frmzjxg.Edit5.Text:=frmzjxg.ADODataSet1.fieldbyname('登记机构').AsString;
frmzjxg.Edit6.Text:=frmzjxg.ADODataSet1.fieldbyname('育妇婚姻状况').AsString;
frmzjxg.Edit7.Text:=frmzjxg.ADODataSet1.fieldbyname('丈夫婚姻状况').AsString;
frmzjxg.Edit8.Text:=frmzjxg.ADODataSet1.fieldbyname('女方出生年月').AsString;
frmzjxg.Edit9.Text:=frmzjxg.ADODataSet1.fieldbyname('男方出生年月').AsString;
frmzjxg.Edit10.Text:=frmzjxg.ADODataSet1.fieldbyname('结婚日期').AsString;
frmzjxg.ComboBox1.Text:=frmzjxg.ADODataSet1.fieldbyname('是否作废').AsString;
frmzjxg.ComboBox2.Text:=frmzjxg.ADODataSet1.fieldbyname('作废条件').AsString;
frmzjxg.Show;
end;procedure Tfrmuq.ADODataSet1AfterOpen(DataSet: TDataSet);
begin
statusbar1.Panels[0].Text:='记录数为'+inttostr(adodataset1.recordcount);
end;procedure Tfrmuq.Button7Click(Sender: TObject);
begin
if application.MessageBox('你确认要删除这条记录吗?', '提示',32+4)=mrno  then  exit;
   ADOdataset1.Delete;
end;end.

解决方案 »

  1.   

    if SaveDialog1.Execute then
      begin
         Screen.Cursor:=crHourGlass;
         try
         if not VarIsEmpty(xlApp) then
         begin
              xlApp.DisplayAlerts:=false;
              xlApp.Quit;
              VarClear(xlApp);
         end;
    出错,请高手给看看
      

  2.   

    先屏蔽下两句试试
    //  savedialog1.Filter:='Excel文件(*.xls)|*.xls';
    //  SaveDialog1.Options:=[ofShowHelp,ofEnableSizing];
    其他地方没有看出什么问题。
      

  3.   

    不多..请高手给看看procedure Tfrmuq.CopyDbDataToExcel(target: TDbGrid);
      

  4.   

    procedure Tfrmuq.CopyDbDataToExcel(target: TDbGrid);
    这个代码没问题啊。。我试了一下,运行的挺好。
      

  5.   

    测试代码如下:运行的挺好
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      //Dialogs, StdCtrls, Grids, DBGrids,ComObj, DB, ADODB;
      Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ComCtrls,OleServer,Excel2000,Excel97,ComObj;type
      TForm1 = class(TForm)
        Button1: TButton;
        DBGrid1: TDBGrid;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        SaveDialog1: TSaveDialog;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure CopyDbDataToExcel(target: TDbGrid);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CopyDbDataToExcel(target: TDbGrid);
    var
       icount,jcount:integer;
       xlApp: variant;
       sheet:variant;
       temp:string;
       cnum:integer;begin
       savedialog1.Filter:='Excel文件(*.xls)|*.xls';
      SaveDialog1.Options:=[ofShowHelp,ofEnableSizing];
      if SaveDialog1.Execute then
      begin
         Screen.Cursor:=crHourGlass;
         try
         if not VarIsEmpty(xlApp) then
         begin
              xlApp.DisplayAlerts:=false;
              xlApp.Quit;
              VarClear(xlApp);
         end;
         ///////////////////create excel object by ole
         try
            xlApp:=CreateOleObject('Excel.Application');
         except
            Screen.Cursor:=crDefault;
            exit;
         end;
         xlApp.WorkBooks.Add[XLWBatWorkSheet];
         xlApp.WorkBooks[1].WorkSheets[1].Name:='exlsheet';
         sheet:=xlApp.WorkBooks[1].WorkSheets['exlsheet'];     if not target.DataSource.DataSet.Active then
         begin
              Screen.Cursor:=crDefault;
              exit;
         end;
         target.DataSource.DataSet.First;
         cnum:=1;
         for icount:=0 to target.Columns.Count-1 do
              if target.Columns[icount].Visible=true then
                begin
                sheet.cells[1,cnum]:=target.Columns.Items[cnum-1].Title.Caption;
                inc(cnum);
                end;
         jcount:=2;
         while not target.DataSource.DataSet.Eof do
         begin
               cnum:=1;
               for icount:=0 to target.Columns.Count-1 do
               begin
                //  if icount=0 then
                //  begin
                if target.Columns[icount].Visible=true then
                  begin
                   temp:=target.Columns.Items[icount].Field.AsString;
                   insert('''',temp,1);
                   sheet.cells[jcount,cnum]:=temp;
                   inc(cnum);
                  end;
                //  end
                 // else            //后面也可能有多位数字的字段
                //  sheet.cells[jcount,icount+1]:=target.Columns.Items[icount].Field.AsString;
              end;
              inc(jcount);
              target.DataSource.dataset.Next;     end;
         sheet.SaveAs(SaveDialog1.FileName);
         application.MessageBox('数据导出成功!','提示信息',64+0);
         xlApp.Quit;
         SaveDialog1.Options:=[ofOverwritePrompt,ofShowHelp,ofEnableSizing];
         finally
         Screen.Cursor:=crDefault;
         end;     
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      CopyDbDataToExcel(DBGrid1);
    end;end.
      

  6.   

    看看你的formshow,中的代码,有没有影响的
      

  7.   

    没有试,我猜的。问题是不是在这里if frmxianshi.ListBox2.Items.Count>0 then
          begin
            for i:=0 to frmuq.DBGrid1.Columns.Count-1 do
               begin
                  frmuq.DBGrid1.Columns.Items[i].Visible:=false;
               end;
       for i:=0 to frmxianshi.listbox2.Items.Count-1 do
           begin
              for t:=0 to frmuq.DBGrid1.Columns.Count-1 do
                begin
                  if frmuq.DBGrid1.Columns[t].FieldName=frmxianshi.ListBox2.Items.Strings[i] then
                  begin
                    frmuq.DBGrid1.Columns.Items[t].Visible:=true;
                 end;
           end;
      end;