错误提示:
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.
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.
begin
Screen.Cursor:=crHourGlass;
try
if not VarIsEmpty(xlApp) then
begin
xlApp.DisplayAlerts:=false;
xlApp.Quit;
VarClear(xlApp);
end;
出错,请高手给看看
// savedialog1.Filter:='Excel文件(*.xls)|*.xls';
// SaveDialog1.Options:=[ofShowHelp,ofEnableSizing];
其他地方没有看出什么问题。
这个代码没问题啊。。我试了一下,运行的挺好。
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.
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;