紧急通缉张无忌(0分)

  • 主题发起人 bluepoint8868
  • 开始时间
B

bluepoint8868

Unregistered / Unconfirmed
GUEST, unregistred user!
张大哥,小妹我知道你是delphibbs上最最nb的!
回答一个问题好吗?
我搞了一个打印管理程序,其中有一个过程是在一个*.prn(打印机自动生成的文件,它以16进制的格式记录了所有的打印信息,包括页面设置,页面大小,打印份数,打印尺寸等等,我们判断打印信息的过程就是读这个文件的过程)中判断打印页数(比如说是以AAA为换页的标志,出现几次就代表总共有多少页),打印尺寸(比如说123为A4,出现了A4,那么在同一个*.prn文件中就不会再出现其他的打印尺寸)!
我是先把这个*.prn文件全部读一遍,在用POS函数加循环来判断AAA的个数,得到打印页数,同样的方法的到打印尺寸。程序本身没有错。如果这个*.prn文件不大,还不明显。如果超过30M的话,时间就暴慢啊,(我看和死机没什么区别啊)
我的问题是有没有什么算法何以缩短时间
小妹我无限感动,你如果有什么要求可以提啊!
 
晕~~不要“小妹我”“小妹我”的,就怕别人不知道你是小妹~~~
 
艾,我真是服了你了,有点尊严好不好???
 
把程序发过来,我来帮小妹妹看看!weiiguo@sohu.com
 
//-----------------------------------------------------------------
//目的: 得到PRN文件信息
//参数: sFileName:文件名称
// psCaption:文档名称(传指针)
// psSize:文档尺寸(传指针)
//返回值:布尔
//programed by Star Song 2002-09-16
//-----------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
F: TextFile;
sTextLine: String;
sText,s1,s: String;
sSubCaption:String;
sSubSize: String;
iPosbegin
: Integer;
iPosEnd: Integer;
i,PCount: Integer;
CopyCount: Integer;
PageSize,sFileName: String;
begin
try
sSubCaption:= '';
sSubSize:= '';
//读文件
AssignFile(F,sFileName);
Reset(F);
sText:= '';
while not eof(f)do
begin
ReadLn(F,sTextLine);
sText:= sText+ sTextLine;
end;
CloseFile(F);
//判断是否PCL6即PCL XL
//判断标志:PJL ENTER LANGUAGE=PCLXL;
{ if pos('PJL ENTER LANGUAGE=PCLXL',sText)>0 then
begin
msgbox('打印文件:' + sFileName + ' 不符合兼容要求,' + #13 + '请重新安装PCL 5版本的激光打印机驱动程序!'+ #13 + '此文件将不能打印!','打印管理',MB_OK);
i:= slFileNameRemove.IndexOf('sFileName');
if i<0 then
slFileNameRemove.Add(sFileName);
end;
}
//得到图纸名称
if Filename.Text<> '' then
begin
//取出文件的标题
if Pos('@PJL JOB NAME',sText)>0 then
begin
iPosbegin
:= Pos('@PJL JOB NAME',sText);
iPosEnd:= Pos('@PJL COMMENT',sText);
iPosbegin
:= iPosbegin
+ 13;
iPosEnd:= iPosEnd-2;
for i:=iPosbegin
To iPosEnddo
begin
sSubCaption:= sSubCaption + sText;
end;
//去掉图纸名称多余部分
// fucTrimDrawName(@sSubCaption);
end
else
begin
sSubCaption:= '';
end;
//psCaption^:= sSubCaption;
edit2.Text:= sSubCaption;
end;
// cbDrawSize.ReadOnly:= False;
//取出纸张的长度
// if psSize<> Nil then
// begin
if Pos('@PJL SET PAPER=',sText)>0 then
iPosbegin
:= Pos('@PJL SET PAPER=',sText)
// else
begin
//prn文件或某些plt文件不包含pjl头信息,原退出现改为:
//Result:= False;
//Exit;
//开始处理pcl数据
sTextLine := sText;
//计算页数
s1:= char(27)+char(42)+'b0M';
//页标记,HPLJ5000 PCL5
PCount:= 0;
if Pos(s1,sText)>0 then
begin
sText:= Copy(sText,Pos(s1,sText)+5,length(sText)-Pos(s1,sText)-5);
PCount:= 1;
// s:= Copy(sText,1,5);
while length(sText)>0do
begin
iPosbegin
:= Pos(s1,sText);
if iPosbegin
>0 then
begin
sText:= Copy(sText,Pos(s1,sText)+5,length(sText)-Pos(s1,sText)-5);
PCount:= PCount+1;
end
else
sText:='';
end;
end;
if PCount=0 then
PCount:= 1;
//查询打印份数
//Number of Copies of Copies (1 - 99)
//Ec&amp;l#X (x)
//027 038 108 #...# 088 (120)
//1B 26 6C #. # 58 (78)
sText:= sTextLine;
s1:= char(27)+char(38)+char(108);
i:= 0;
CopyCount:= 0;
while Pos(s1,sText)>0do
begin
s:= Copy(sText,Pos(s1,sText)+3,3);
if (Pos('x',s)>0) or (Pos('X',s)>0) then
begin
if Pos('x',s)>0 then
i:= Pos('x',s);
if Pos('X',s)>0 then
i:= Pos('X',s);
s:= Copy(s,1,i-1);
CopyCount:= strtoint(s);
sText:= '';
end;
sText:= Copy(sText,Pos(s1,sText)+3,length(sText)-Pos(s1,sText)-3);
end;
if (CopyCount=0) and (PCount>0) then
CopyCount:=1;
//万一没有份数则为1
psCount^:= floattostr(CopyCount*PCount);

//查询纸张尺寸
//Page Size A4
//Ec&amp;l26A (a)
//027 038 108 050 054 065 (097)
//1B 26 6C 32 36 41 (61)
PageSize:= '';
sText:= sTextLine;
s1:= char(27)+char(38)+char(108);
while Pos(s1,sText)>0do
begin
s:= Copy(sText,Pos(s1,sText)+3,3);
if (Pos('a',s)>0) or (Pos('A',s)>0) then
begin
if Pos('a',s)>0 then
i:= Pos('a',s);
if Pos('A',s)>0 then
i:= Pos('A',s);
s:= Copy(s,1,i-1);
if s='4' then
PageSize:= 'A5';
if s='26' then
PageSize:= 'A4';
if s='27' then
PageSize:= 'A3';
if s='100' then
PageSize:= 'B5';
sText:= '';
end;
sText:= Copy(sText,Pos(s1,sText)+3,length(sText)-Pos(s1,sText)-3);
end;
if (PageSize='') and (PCount>0) then
PageSize:='A4';
//万一没有则为A4
end;
iPosEnd:= Pos('@PJL SET TRAY1TEMP',sText);
iPosbegin
:= iPosbegin
+ 15;
iPosEnd:= iPosEnd-1;
for i:=iPosbegin
to iPosEnddo
begin
sSubSize:= sSubSize + sText;
end;
if PageSize='' then
begin
cbDrawSize.ReadOnly:= True;
psSize^:= sSubSize;
end
else
psSize^:= PageSize;
end;
//设置返回值
Result:= True;
except
Result:= False;
end;

end;

end.
 
帮忙顶!
 
呵呵,真的是小妹么,我想小妹都想疯了, 呵呵
张兄,你牛哇, 小妹点名要你,羡慕中!
 
怎么这样,采用CreateFileMapping函数,然后进行搜索,30M最好不要用pos
 
有人在吃醋,哈哈哈。。。哈哈。。。
 
dcsdcs大哥,说得明白点好吗?
我看了delphi的帮助
好象没有CreateFileMapping这个函数哦!
 
看你這德性,我就是知道也不告訴你.
 
真是羡慕,人家小妹都主動提出來了,還不了人家心願嘛。。張兄弟,看來你走桃花運哦。
 
经典。。。
 
CreateFileMapping 是 windows API 来的...你要看 windows sdk ...在 delphi 的帮助菜单有....
 
装个P, 我没见哪个MM来这句的"NB", 又一个玻璃.
 
不是MM也可以回答嘛,在这里又有几个是冲着MM来的。
稍微浏览了代码,没有认真研究,提几个粗浅建议:
1.把文件完全读到sText中,花了一次完全的读代价;
以后又对sText作n次循环,又花了n次时间代价;
2..prn不是文本,最好不要定义为textfile
定义为普通file,用一个定长buffer(array of char),读,
一次性从buffer中分析需要的各种元素,用完就扔掉buffer中的内容,重复使用
3.如果耗时还是不小,分析耗时代码所在,在循环间插入application.processMessage
或进度条之类,表示系统正在工作。
4.功底还可以,但一个过程太长,说明功能没有很好划分,不是良好的编程习惯
 
张兄已经离开原公司了,不知还来不来DFW了!
 
张鸿林大哥
谢谢你,本人是很菜的啊!
你能不能告诉我联系的方式,我们详细点谈!
本人的是杭州人,电话13606509710
qq66641467
信箱:bluepoint8868@263.net
 
定义一个TPrnReader类,大致这样规划:
type
TPrnReader=class(TObject)
private
function openFile;
function ReadBuffer ;//一个定长记录
function ReadFileName //图纸名
function GetPageNo;
function GetPageType
...
public
property PageNo;
Porperty FileName;
...
end;
有些过程并不需要每次都执行,如纸张尺寸,一个prn文件不会有多个纸张吧?
上面只是原型,具体要你自己详细规划。
不好意思,我很老土,没有qq,需要聊技术问题可以使用大富翁的聊天室
但还是这里讨论会得到更多支持
 
顶部