制报表出错,难!请高手请进!!(25分)

  • 主题发起人 主题发起人 心思思
  • 开始时间 开始时间

心思思

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一个班有名册报表,我的程序是想这样的:
(ClassReportFrm)查询报表的条件,按(BitBtPrintClick)后则进入报表界面(BanJimingceFrm),adoquery1已经连接了数据库,但当程序运行时,我一按(BitBtPrintClick)则会出错,出错在蓝色字段处。
出错信息:
Message ‘Access violation at address 00510AC3 in module
‘PROJECT1.EXE’.Read of address FFFFFFF’
然后光标停在此处:BanJimingceFrm.Adoquery1.close;
-----------------------------------------------------------
procedure TClassReportFrm.BitBtPrintClick(Sender: TObject);
var
CommandText:string;
begin
[blue]BanJimingceFrm.Adoquery1.close;[/blue]
BanJimingceFrm.adoquery1.sql.clear;
CommandText := 'select S.姓名,S.学号,S.性别,S.政治面貌,S.学生职务,' +
'S.联系电话,S.系名称,S.备注,C.班级名称 from 学生概况表 S '+
'left join 班级表 C on S.班级编号= C.班级编号 ' +
' where C.系名称=' + QuotedStr(ComboBox1.Text) +
' and C.班级名称='+ QuotedStr(ComboBox2.Text);
BanJimingceFrm.adoquery1.sql.add(CommandText);
ClassReportFrm.Close;
BanJimingceFrm.adoquery1.open;
BanJimingceFrm.quickrep1.preview;
end;
 
看看BanJimingceFrm是不是有nil,是不是悬空的,还有AdoQuery1.
 
to:caidao
BanJimingceFrm中没有nil,因为在BanJimingceFrm中没有写代码,只是在(ClassReportFrm)查询报表中写好查询的代码。而且adoquery1连接数据库的。
 
恐怕BanJimingceFrm在运行时确实为nil,你要在工程中确信BanJimingceFrm是提前创建的
Access violation at address 00510AC3 in module
只有在引用一个不存在的对象时才出现
 
to:wanderld
非常感谢你的提示,我试了你的方法,把BanJimingceFrm是提前创建,运行时可以进入的报表的预览中,但当一按预览窗口中的[关闭]则又出错同样的错误。
请指教!!
 
怎么没人回贴555555555[:(]
请问哪里位大侠能帮帮小妹啊!!
急~~``
 
你把断点设在BanJimingceFrm.Adoquery1.close;
跟踪到这里不要运行,然后你按CTRL+F7,输入BanJimingceFrm.Adoquery1
你就知道ADOQUERY1是否为NIL,再者,.Adoquery1是在BanJimingceFrm里的,你不要写了,
建议直接写Adoquery1.close;可以了
 
好的,谢谢,我先试一下!!
 
我输入了BanJimingceFrm.Adoquery1
但结果是显示这样:([csInheritable])
那应该怎么样做呢?请指教!!谢谢!!
 
说明没有为NIL,那你确认是在执行这句话后出错的
 
对啊
我把断点设在BanJimingceFrm.Adoquery1.close,运行后则出错,光标停留在BanJimingceFrm.Adoquery1.close处.
 
把你这个单元的代码都贴出来再看看
 
(ClassReportFrm)查询报表代码:
unit ClassReport;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DB, ADODB, datamodule, Buttons;

type
TClassReportFrm = class(TForm)
Label1: TLabel;
Label2: TLabel;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Label3: TLabel;
Bevel1: TBevel;
adoQuery: TADOQuery;
BitBtPrint: TBitBtn;
BitBtClose: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtCloseClick(Sender: TObject);
procedure BitBtPrintClick(Sender: TObject);
private
procedure LoadClassInfo;
public
{ Public declarations }
end;

var
ClassReportFrm: TClassReportFrm;

implementation

uses BanJiMingCe;

{$R *.dfm}

procedure TClassReportFrm.LoadClassInfo;
begin
with TADOQuery.Create(self) do
try
ComboBox1.Clear;
ComboBox2.Clear;
Connection := dmMain.adoConn;
SQL.Text := 'select 系名称, 班级名称 from 班级表';
Open;
while not eof do
begin
Combobox1.Items.Add(Fields[0].AsString);
Combobox2.Items.Add(Fields[1].AsString);
Next;
end;
finally
free;
end;
end;
procedure TClassReportFrm.FormCreate(Sender: TObject);
begin
LoadClassInfo;
end;

procedure TClassReportFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := cafree;
end;

procedure TClassReportFrm.BitBtCloseClick(Sender: TObject);
begin
Close;
end;

procedure TClassReportFrm.BitBtPrintClick(Sender: TObject);
var
CommandText:string;
begin

BanJimingceFrm.Adoquery1.close;
BanJimingceFrm.adoquery1.sql.clear;
CommandText := 'select S.姓名,S.学号,S.性别,S.政治面貌,S.学生职务,' +
'S.联系电话,S.系名称,S.备注,C.班级名称 from 学生概况表 S '+
'left join 班级表 C on S.班级编号= C.班级编号 ' +
' where C.系名称=' + QuotedStr(ComboBox1.Text) +
' and C.班级名称='+ QuotedStr(ComboBox2.Text);
BanJimingceFrm.adoquery1.sql.add(CommandText);
ClassReportFrm.Close;
BanJimingceFrm.adoquery1.open;
BanJimingceFrm.quickrep1.preview;
end;
end.
这是显示报表的代码:
unit BanJiMingCe;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, QRCtrls, QuickRpt, DB, ADODB, datamodule;

type
TBanJimingceFrm = class(TForm)
ADOQuery1: TADOQuery;
QuickRep1: TQuickRep;
QRBand1: TQRBand;
QRBand2: TQRBand;
QRBand3: TQRBand;
QRBand4: TQRBand;
QRLabel1: TQRLabel;
QRLabel2: TQRLabel;
QRLabel3: TQRLabel;
QRLabel4: TQRLabel;
QRLabel5: TQRLabel;
QRLabel6: TQRLabel;
QRLabel7: TQRLabel;
QRLabel8: TQRLabel;
QRDBText1: TQRDBText;
QRDBText2: TQRDBText;
QRDBText3: TQRDBText;
QRDBText4: TQRDBText;
QRDBText5: TQRDBText;
QRDBText6: TQRDBText;
QRDBText7: TQRDBText;
QRLabel9: TQRLabel;
QRDBText8: TQRDBText;
QRLabel10: TQRLabel;
QRDBText9: TQRDBText;
QRShape1: TQRShape;
QRShape2: TQRShape;
QRShape3: TQRShape;
private
{ Private declarations }
public
{ Public declarations }
end;

var
BanJimingceFrm: TBanJimingceFrm;

implementation

{$R *.dfm}
end.
 
程序出错时光标所停的位置不是真正出错的位置,是引发异常后从堆栈弹出的位置,这个问题在别人看来很难说清楚,建议你找到真正出错的语句,必须是程序执行这条语句前不出错,执行后出错,那才是真正的出错语句,再仔细检查是否每个变量都不为nil.这种异常只有引用对象为nil时才发生。
 
wanderld所得没错,光标停在这里,并不表示是这句出错,你要全面检查相关代码
 
同意wanderld
 
后退
顶部