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;
我的打印预览当数据库记录数超过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;