为什么会这样,将全部分奉送!(100分)

  • 主题发起人 主题发起人 zhao753
  • 开始时间 开始时间
Z

zhao753

Unregistered / Unconfirmed
GUEST, unregistred user!
我在编写报表时遇到一难题,如下:
在form1中有一Button,事件如下,即单击此按钮将显示一报表(form2)的预览.
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:='select mlno,text,paixu,sangxing,xiaxing,xiaxing1,xiaxing2,xiaxing3 from want_print_ds where meet_id=''4'' and shangxiaxing like ''1T%'' order by gongli';
ADOQuery1.sql.Clear;
//showmessage('ok');
ADOQuery1.sql.add(s);
ADOQuery1.Open;
ADOQuery1.Active:=true;
form2.quickrep1.Prepare;
form2.quickrep1.preview;
end;

在form2中,由于一字段值过长,所以用如下代码使之自动折行,并使其高度随此字段长度而定.
procedure TForm2.QRDBText3Print(sender: TObject;
var Value: String);
var i,l,w,h,p:integer;
s,cs:string;
begin
s:='';
i:=0;
l:=0;
w:=0;
p:=1;
l:=length(trim(value));
w:=trunc((QRDBText3.Width-2)/12*2)-36;
while pos(#13#10,value)>0do
begin
delete(value,pos(#13#10,value),2);
next;
end;
while pos(' ',value)>0do
begin
delete(value,pos(' ',value),2);
next;
end;
if l<=W then
QRDBText3.Height:=-Font.Height+10
else
if l>w then
begin
h:=trunc(l/w);
if l>h*w then
h:=h+1;
cs:=copy(value,1,w);
QRDBText3.Height:=-Font.Height *h+(h-1)*10;
for i:=1 to hdo
begin
cs:=copy(value,p,w);
if bytetype(cs,w) = mbTrailByte then
begin
// 整个汉字
cs:=copy(value,p,w);
p:=p+w;
end
else
//半个汉字
begin
cs:=copy(value,p,w-1);
p:=p+w-1;
end;
s:=s+cs+#13#10;
end;
value:=s;
end;
DetailBand1.Height:=QRDBText3.Top+QRDBText3.Height;
end;

可是,每次执行若干次单击Button1时却出现如下错误:
Access Violation at address 0040D3BA in module 'project1.exe'. read of address 00E38006.
请教高手如何解决,将全部家当奉上!!!!
 
试试.....
var s:string;
begin
s:='select mlno,text,paixu,sangxing,xiaxing,xiaxing1,xiaxing2,xiaxing3 from want_print_ds where meet_id=''4'' and shangxiaxing like ''1T%'' order by gongli';
ADOQuery1.Close;
ADOQuery1.sql.Clear;
//showmessage('ok');
ADOQuery1.sql.add(s);
ADOQuery1.Open;
form2.quickrep1.Prepare;
form2.quickrep1.preview;
检查一下是否有东西创建后,没有释放!
 
如何检查?请高手指教
 
上面那样改后还会出错吗?/........
 
会,同样错误
 
这里面有三个可能出问题,
一个是变量S,不过S每次都被清空过,应该可以排除
接着是ADOQ,如果ADOQ也没错就是quickrep1出错了,这里为什么加FORM2?
 
呵呵,别看了,这是控件的问题
我遇到多了,没什么好的解决方案
最好就是不用这个鬼控件
 
出现这种问题的原因可能有2种:
1.是创建对象没释放导致内存出错,
2.是控件的不健壮性!
 
form2.quickrep1.Prepare;
form2.quickrep1.cleanup;
form2.quickrep1.preview;
这个问题我认为还是可以解决的,应该是多次载入了对象
因为是在多次单击后出现错误的.
 
[:)]多谢各位的指导,按您的指示重试后发现若干次后,又出现此错误,另外每点击一次Button1内存使用就增多1M多,如何解决?
 
肯定是有东西没释放掉,最好程序创建东西后加TRY。。。FINALLY。。END!
你可以试着
//form2.quickrep1.Prepare;
//form2.quickrep1.preview;
屏蔽再看看,可以通过这方法找出到底什么那个占用了内存!
 
[:)]请问,将TRY。。。FINALLY。。END加在哪里,另外按您说的,将
//form2.quickrep1.Prepare;
//form2.quickrep1.preview;
屏蔽后,不报错,且内存使用一直维持不变
 
建议:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:='select mlno,text,paixu,sangxing,xiaxing,xiaxing1,xiaxing2,xiaxing3 from want_print_ds where meet_id=''4'' and shangxiaxing like ''1T%'' order by gongli';
ADOQuery1.Close;
ADOQuery1.sql.Clear;
//showmessage('ok');
ADOQuery1.sql.add(s);
ADOQuery1.Open;
form2.quickrep1.Prepare;
form2.quickrep1.preview;
button1.Enabled := False;//按钮只能按一次
end;
 
不行,我要连续打印
 
这里没打印啊!只是预览啊!
 
这是一个预览和打印功能都有的程序,要求是每次单击Button则预览或打印
 
预览和打印是分开实现的,打印可以在预览里面实现,你这个只是预览而已,点一次就够了!
 
终于看到您了,其实这只是程序的部分而已,此程序的最终用途是在form1的edit中每输入一个值,则自动打印一张相对应的报表,打印完毕返回form1界面,再输入另一个值,则自动打印一张相对应的报表,打印完毕返回form1界面,如此往复运行
 
form2.quickrep1.Prepare;
form2.quickrep1.print;
这样不行吗?
 
后退
顶部