打印预览当数据库记录数超过100条后执行的速度就很慢,竟用了3分多钟,是什么原因?(100分)

  • 主题发起人 主题发起人 freeskybird
  • 开始时间 开始时间
F

freeskybird

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
我的打印预览当数据库记录数超过100条后执行的速度就很慢,我测试了一下条记录用了3分多
钟。原因在我编的一段代码内(用{...}挂起来的是),这段代码是用来做如下处理的:由于记录
中的内容字段一行只能放60个字符,多于60一行就放不下了,须放到下一行,因此对该字段的
值进行每60个字符为单位来切割,分成多行显示;函数IsOdd()用来判断第个字符是汉字还是
英文字符。当我把这段代码注释掉后运行预览只要十秒左右就够了,不知道是什么原因这段代
码要运行那么长时间?各位帮我看一下,有否好的方法?

代码如下:
procedure Printprevie(strczpid:string);
type
TstrArray = array[0..6] of string;
var i,k,j,strlen,ReCount:integer;
strNr,strCont,strNrow,strPno,strID,strDW,strSName,strAnaco,strFName,strJName,strJb,strHz:string;
Tfdate,Tedate:Tdatetime;
charN:char;
isOd:Boolean;
strArray:TstrArray;
begin

fprintprevie.Qc_head.Close;
fprintprevie.Qc_detail.Close;
fprintprevie.Qc_detail.Params[0].AsString :=strczpid;
fprintprevie.Qc_detail.Open;
fprintprevie.Qc_head.Params[0].AsString :=strczpid;
fprintprevie.Qc_head.Open;
{ if fprintprevie.Qc_detail.RecordCount >0 then

begin

ReCount:=0;
fprintprevie.Qc_detail.First;
for i:=1 to fprintprevie.Qc_detail.RecordCountdo

begin

strNr:=fprintprevie.Qc_detail.FieldValues['CONTENT'];
strPno:=fprintprevie.Qc_detail.FieldValues['PNO'];
strCont:=strNr;
strlen:=60;
if Length(strNr)>strlen then

begin

strID:=fprintprevie.Qc_detail.FieldValues['CZPID'];
strDw:=fprintprevie.Qc_detail.FieldValues['SDW'];
if varisnull(fprintprevie.Qc_detail.FieldValues['SNAME']) then

strSName:=''
else

strSName:=fprintprevie.Qc_detail.FieldValues['SNAME'];
if varisnull(fprintprevie.Qc_detail.FieldValues['FDATE']) then

Tfdate:= strtodatetime('1900-01-01 00:00:00')
else

Tfdate:=vartodatetime(fprintprevie.Qc_detail.FieldValues['FDATE']);
if varisnull(fprintprevie.Qc_detail.FieldValues['EDATE']) then

Tedate:= strtodatetime('1900-01-01 00:00:00')
else

Tedate:=vartodatetime(fprintprevie.Qc_detail.FieldValues['EDATE']);
if varisnull(fprintprevie.Qc_detail.FieldValues['ANACORRECT'])then

strAnaco:=''
else

strAnaco:=fprintprevie.Qc_detail.FieldValues['ANACORRECT'];
if varisnull(fprintprevie.Qc_detail.FieldValues['FNAME']) then

strFName:=''
else

strFName:=fprintprevie.Qc_detail.FieldValues['FNAME'];
if varisnull(fprintprevie.Qc_detail.FieldValues['JNAME']) then

strJName:=''
else

strJName:=fprintprevie.Qc_detail.FieldValues['JNAME'];
if varisnull(fprintprevie.Qc_detail.FieldValues['JB']) then

strJb:=''
else

strJb:=fprintprevie.Qc_detail.FieldValues['JB'];
if varisnull(fprintprevie.Qc_detail.FieldValues['BZ']) then

strHz:=''
else

strHz:=fprintprevie.Qc_detail.FieldValues['BZ'];
charN:=succ(strCont[strlen]);
k:=0;
while Length(strCont)>strlendo

begin

if ord(charN) >128 then

begin

Isod:=IsOdd(strCont,strlen);
if Isod then

begin

strNrow:=copy(strCont,1,strlen-1);
strCont:=copy(strCont,strlen,length(strCont)-strlen+2);
strArray[k]:=strNrow;
if Length(strCont)>strlen then

charN:=succ(strCont[strlen])
else

begin

strArray[k+1]:=strCont;
end;

end
else

begin

strNrow:=copy(strCont,1,strlen);
strCont:=copy(strCont,strlen+1,length(strCont)-strlen+1);
strArray[k]:=strNrow;
if Length(strCont)>strlen then

charN:=succ(strCont[strlen])
else

begin

strArray[k+1]:=strCont;
end;

end;

end
else

begin

strNrow:=copy(strCont,1,strlen);
strCont:=copy(strCont,strlen,length(strCont)-strlen+1);
strArray[k]:=strNrow;
if Length(strCont)>strlen then

charN:=succ(strCont[strlen])
else

begin

strArray[k+1]:=strCont;
end;

end;

k:=k+1;
end;

for j:=kdo
wnto 0do

begin

if j=0 then

fprintprevie.Qc_detail.InsertRecord([strID,strPno,strDw,strSName,Tfdate,strArray[j],Tedate,strAnaco,strFName,strJName,strJb,strHz])
else

fprintprevie.Qc_detail.InsertRecord([strID,strPno,' ','','',strArray[j],'','','','','','']);
ReCount:=ReCount+1;
end;

// fprintprevie.QuickRep1.Preview;
fprintprevie.Qc_detail.First;
fprintprevie.Qc_detail.MoveBy(ReCount);
fprintprevie.Qc_detail.Delete;
fprintprevie.Qc_detail.First;
fprintprevie.Qc_detail.MoveBy(ReCount);
//fprintprevie.Qc_detail.Next;
end
else

begin

fprintprevie.Qc_detail.Next;
ReCount:=ReCount+1;
end;

end;

end;

}
fprintprevie.QuickRep1.Prepare;
fprintprevie.QRLabel9.Caption:=IntToStr(fprintprevie.QuickRep1.QrPrinter.PageCount)+']页';
fprintprevie.QuickRep1.Preview;
end;


function IsOdd(strName:string;len:integer):boolean;
var oddN,i:integer;
begin

oddN:=0;
if ord(succ(strName[len]))>128 then

for i:=1 to lendo

begin

if ord(succ(strName))>128 then

oddN:=oddN+1;
end;

if Odd(oddN) then

IsOdd:=true
else

IsOdd:=false;


end;

 
高手快进啊!帮帮忙!
 
高手请进,分全给你
 
后退
顶部