问一个问题,因生产需要增加些新的字段,然后打印。
可是新增加了字段后打印的整个布局就改变了,要重新调整,因为是动态的字段。所以调整起来比较麻烦,能帮帮我嘛
需要用到单元在附件里,帮我看看 好嘛
原来打印时候页面布局,在我新增字段后,整个页面要改动,不知道如何改!就这个问题!
代码不太看的明白 unit U_PrintGYK;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,adodb,db,StrUtils,math;
type
TprinterGYK=class(TObject)
public
procedure ExePrint(adq:Tadoquery;x:integer=160;y:integer=120;fontssize:integer=9;whz:boolean=false);//x:整体左移X+;y:
private
strL:TStrings;
function JudgeZFNumber(str:string):integer; //计算给定的字符串中非汉字字符的数目(不包括功能键)
function JudgeZFD_S(Number:integer):integer; //计算上述所得的字符数目是双"double",是单"single"
function Judge013Number(str:string):integer; //根据回车字符数目进行备注打印
public
constructor Create;
destructor Destroy;
end;
implementationuses printers;{ TprinterGYK }var
k:integer; //保存下一次获取字符串的起始位置
procedure TprinterGYK.ExePrint(adq:Tadoquery;x:integer=160;y:integer=120;fontssize:integer=9;whz:boolean=false);
var
ADEVICE,ADRIVER,APORT:array[0..255] of char;
HD:THandle;
PDM:PDeviceMode;
InitX,InitY:integer;
SeparateWidth:integer; tmpStr:string;
i,j,BZRows:integer; s,ss,sss:string; function strR(str:string):string;
var
i,j:integer;
tmpStr1,tmpStr2,tmpStr3,tmpStr4:string;
begin
i:=pos('*',str);
if i<>0 then
begin
tmpstr3:=leftstr(str,i);
tmpStr1:=rightstr(str,length(str)-i);
j:=pos('*',tmpStr1); if j<>0 then
begin
tmpStr2:=copy(tmpStr1,1,j-1);
tmpStr4:=rightstr(tmpStr1,length(tmpstr1)-j+1);
result:=tmpstr3+trim(format('%10.1f',[Roundto(strtofloat(tmpstr2)*0.975,-1)]))+tmpStr4;
end;
end;
end; function HightR(MultipleNum:integer):integer;
begin
result:=MultipleNum*53;
end;
function HightL(MultipleNum:integer;Number:integer=0):integer;
begin
if number<>0 then
result:=MultipleNum*(56-Number)
else
result:=MultipleNum*56;
end;
begin
//==============================================================================//设置打印机
//if Combobox1.ItemIndex<>-1 then
//printer.PrinterIndex:=combobox1.ItemIndex;
printer.GetPrinter(ADEVICE,ADRIVER,APORT,HD);
if HD=0 then
begin
printer.PrinterIndex:=printer.PrinterIndex;
printer.GetPrinter(ADEVICE,ADRIVER,APORT,HD);
end;
if HD<>0 then
begin
PDM:=GlobalLock(HD);
try
with PDM^ do
begin
dmFields:=dmPaperLength or dmPaperWidth;
dmPaperLength:=2200;
dmPaperWidth:=1330;
end;
finally
GlobalUnLock(HD);
end;
end;//==============================================================================//设置行间距离及初始字符位置
InitX:=x;
InitY:=y;
SeparateWidth:=490; //490
printer.Canvas.Font.Size:=fontssize;//============================================================================== printer.BeginDoc; //开始打印
//打印工艺左栏
try
printer.Canvas.Font.Size:=fontssize+3;
printer.Canvas.TextOut(InitX+50,InitY+HightL(0)-25,adq.fieldbyname('AT019').AsString);
printer.Canvas.TextOut(InitX+50,InitY+HightL(1)-25,adq.fieldbyname('AT003').AsString);
printer.Canvas.TextOut(InitX+50,InitY+HightL(2)-25,adq.fieldbyname('AT002').AsString);
printer.Canvas.Font.Size:=fontssize-2;
if (trim(adq.fieldbyname('AT059').AsString)<>'') and (not adq.fieldbyname('AT059').IsNull) then
printer.Canvas.TextOut(InitX-40,InitY+HightL(3)-15,adq.fieldbyname('AT059').AsString)
else begin
printer.Canvas.TextOut(InitX-40,InitY+HightL(3)-15,strR(adq.fieldbyname('AT006').AsString));
sss:=adq.fieldbyname('AT006').AsString;
ss:=strR(adq.fieldbyname('AT006').AsString);
end;
printer.Canvas.Font.Size:=fontssize;
printer.Canvas.TextOut(InitX+16,InitY+HightL(4),'');
printer.Canvas.TextOut(InitX+82,InitY+HightL(4),'');
printer.Canvas.TextOut(InitX+139,InitY+HightL(4),''); printer.Canvas.TextOut(InitX-60,InitY+HightL(5)-5,adq.fieldbyname('AT028').AsString);
printer.Canvas.TextOut(InitX+110,InitY+HightL(5),''); printer.Canvas.TextOut(InitX-60,InitY+HightL(6)-5,adq.fieldbyname('AT030').AsString);
printer.Canvas.TextOut(InitX+110,InitY+HightL(6),'');
printer.Canvas.TextOut(InitX-60,InitY+HightL(7),adq.fieldbyname('AT032').AsString);
printer.Canvas.TextOut(InitX+81,InitY+HightL(8),'');
printer.Canvas.TextOut(InitX+81,InitY+HightL(9),'');
tmpStr:=adq.fieldbyname('AT051').AsString;
printer.Canvas.Font.Size:=fontssize-2;
k:=Judge013Number(tmpStr);
if K>0 then
begin
inc(k);
for i:=1 to K do
begin
if (i<>1) and (i<k) then
begin
s:=copy(tmpStr,strtoint(strL.Strings[i-2])+2,strtoint(strL.Strings[i-1])-strtoint(strL.Strings[i-2])-2);
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,25)-70,s); end
else begin
if i=1 then
begin
s:=copy(tmpStr,1,strtoint(strL.Strings[i-1])-1);
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,25)-70,s); end;
end;
if i=k then
begin
s:=copy(tmpStr,strtoint(strL.Strings[i-2])+2,length(tmpStr)-strtoint(strL.Strings[i-2]));
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,25)-70,s); end;
end; end
else
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,15),tmpStr); printer.Canvas.Font.Size:=fontssize;
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(0)-25,'');
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(1)-25,adq.fieldbyname('AT020').AsString); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(2),''); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(3),''); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(4),adq.fieldbyname('AT021').AsString);
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(5),adq.fieldbyname('AT022').AsString);
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(6),''); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(7),'');
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(8),'');
printer.EndDoc; //打印完成
except
printer.Abort;
end;
//==============================================================================end;function TprinterGYK.JudgeZFNumber(str: string): integer;
var
i:integer;
Number:integer;
begin
Number:=0;
for i:=0 to length(str)-1 do
if (ord(str[i])<128) and (ord(str[i])>31) then
inc(Number);
result:=Number;
end;function TprinterGYK.JudgeZFD_S(Number: integer): integer;
var
i:integer;
begin
I:=Number mod 2;
if i=0 then
result:=0
else
result:=1;
end;function TprinterGYK.Judge013Number(str: string): integer;
var
i:integer;
ZF_013Number:integer;
begin
strL.Clear;
ZF_013Number:=0;
if length(str)>0 then
for i:=0 to length(str) do
begin
if ord(str[i])=13 then
begin
Inc(ZF_013Number);
strL.Add(inttostr(i));
end;
end;
result:=ZF_013Number;
end;constructor TprinterGYK.Create;
begin
inherited Create;
strL:=TStringList.Create;
end;destructor TprinterGYK.Destroy;
begin
strL.Free;
inherited Destroy;
end;end.
可是新增加了字段后打印的整个布局就改变了,要重新调整,因为是动态的字段。所以调整起来比较麻烦,能帮帮我嘛
需要用到单元在附件里,帮我看看 好嘛
原来打印时候页面布局,在我新增字段后,整个页面要改动,不知道如何改!就这个问题!
代码不太看的明白 unit U_PrintGYK;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,adodb,db,StrUtils,math;
type
TprinterGYK=class(TObject)
public
procedure ExePrint(adq:Tadoquery;x:integer=160;y:integer=120;fontssize:integer=9;whz:boolean=false);//x:整体左移X+;y:
private
strL:TStrings;
function JudgeZFNumber(str:string):integer; //计算给定的字符串中非汉字字符的数目(不包括功能键)
function JudgeZFD_S(Number:integer):integer; //计算上述所得的字符数目是双"double",是单"single"
function Judge013Number(str:string):integer; //根据回车字符数目进行备注打印
public
constructor Create;
destructor Destroy;
end;
implementationuses printers;{ TprinterGYK }var
k:integer; //保存下一次获取字符串的起始位置
procedure TprinterGYK.ExePrint(adq:Tadoquery;x:integer=160;y:integer=120;fontssize:integer=9;whz:boolean=false);
var
ADEVICE,ADRIVER,APORT:array[0..255] of char;
HD:THandle;
PDM:PDeviceMode;
InitX,InitY:integer;
SeparateWidth:integer; tmpStr:string;
i,j,BZRows:integer; s,ss,sss:string; function strR(str:string):string;
var
i,j:integer;
tmpStr1,tmpStr2,tmpStr3,tmpStr4:string;
begin
i:=pos('*',str);
if i<>0 then
begin
tmpstr3:=leftstr(str,i);
tmpStr1:=rightstr(str,length(str)-i);
j:=pos('*',tmpStr1); if j<>0 then
begin
tmpStr2:=copy(tmpStr1,1,j-1);
tmpStr4:=rightstr(tmpStr1,length(tmpstr1)-j+1);
result:=tmpstr3+trim(format('%10.1f',[Roundto(strtofloat(tmpstr2)*0.975,-1)]))+tmpStr4;
end;
end;
end; function HightR(MultipleNum:integer):integer;
begin
result:=MultipleNum*53;
end;
function HightL(MultipleNum:integer;Number:integer=0):integer;
begin
if number<>0 then
result:=MultipleNum*(56-Number)
else
result:=MultipleNum*56;
end;
begin
//==============================================================================//设置打印机
//if Combobox1.ItemIndex<>-1 then
//printer.PrinterIndex:=combobox1.ItemIndex;
printer.GetPrinter(ADEVICE,ADRIVER,APORT,HD);
if HD=0 then
begin
printer.PrinterIndex:=printer.PrinterIndex;
printer.GetPrinter(ADEVICE,ADRIVER,APORT,HD);
end;
if HD<>0 then
begin
PDM:=GlobalLock(HD);
try
with PDM^ do
begin
dmFields:=dmPaperLength or dmPaperWidth;
dmPaperLength:=2200;
dmPaperWidth:=1330;
end;
finally
GlobalUnLock(HD);
end;
end;//==============================================================================//设置行间距离及初始字符位置
InitX:=x;
InitY:=y;
SeparateWidth:=490; //490
printer.Canvas.Font.Size:=fontssize;//============================================================================== printer.BeginDoc; //开始打印
//打印工艺左栏
try
printer.Canvas.Font.Size:=fontssize+3;
printer.Canvas.TextOut(InitX+50,InitY+HightL(0)-25,adq.fieldbyname('AT019').AsString);
printer.Canvas.TextOut(InitX+50,InitY+HightL(1)-25,adq.fieldbyname('AT003').AsString);
printer.Canvas.TextOut(InitX+50,InitY+HightL(2)-25,adq.fieldbyname('AT002').AsString);
printer.Canvas.Font.Size:=fontssize-2;
if (trim(adq.fieldbyname('AT059').AsString)<>'') and (not adq.fieldbyname('AT059').IsNull) then
printer.Canvas.TextOut(InitX-40,InitY+HightL(3)-15,adq.fieldbyname('AT059').AsString)
else begin
printer.Canvas.TextOut(InitX-40,InitY+HightL(3)-15,strR(adq.fieldbyname('AT006').AsString));
sss:=adq.fieldbyname('AT006').AsString;
ss:=strR(adq.fieldbyname('AT006').AsString);
end;
printer.Canvas.Font.Size:=fontssize;
printer.Canvas.TextOut(InitX+16,InitY+HightL(4),'');
printer.Canvas.TextOut(InitX+82,InitY+HightL(4),'');
printer.Canvas.TextOut(InitX+139,InitY+HightL(4),''); printer.Canvas.TextOut(InitX-60,InitY+HightL(5)-5,adq.fieldbyname('AT028').AsString);
printer.Canvas.TextOut(InitX+110,InitY+HightL(5),''); printer.Canvas.TextOut(InitX-60,InitY+HightL(6)-5,adq.fieldbyname('AT030').AsString);
printer.Canvas.TextOut(InitX+110,InitY+HightL(6),'');
printer.Canvas.TextOut(InitX-60,InitY+HightL(7),adq.fieldbyname('AT032').AsString);
printer.Canvas.TextOut(InitX+81,InitY+HightL(8),'');
printer.Canvas.TextOut(InitX+81,InitY+HightL(9),'');
tmpStr:=adq.fieldbyname('AT051').AsString;
printer.Canvas.Font.Size:=fontssize-2;
k:=Judge013Number(tmpStr);
if K>0 then
begin
inc(k);
for i:=1 to K do
begin
if (i<>1) and (i<k) then
begin
s:=copy(tmpStr,strtoint(strL.Strings[i-2])+2,strtoint(strL.Strings[i-1])-strtoint(strL.Strings[i-2])-2);
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,25)-70,s); end
else begin
if i=1 then
begin
s:=copy(tmpStr,1,strtoint(strL.Strings[i-1])-1);
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,25)-70,s); end;
end;
if i=k then
begin
s:=copy(tmpStr,strtoint(strL.Strings[i-2])+2,length(tmpStr)-strtoint(strL.Strings[i-2]));
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,25)-70,s); end;
end; end
else
printer.Canvas.TextOut(InitX-60,InitY+HightL(12)+hightl(i,15),tmpStr); printer.Canvas.Font.Size:=fontssize;
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(0)-25,'');
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(1)-25,adq.fieldbyname('AT020').AsString); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(2),''); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(3),''); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(4),adq.fieldbyname('AT021').AsString);
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(5),adq.fieldbyname('AT022').AsString);
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(6),''); printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(7),'');
printer.Canvas.TextOut(InitX+SeparateWidth,InitY+HightR(8),'');
printer.EndDoc; //打印完成
except
printer.Abort;
end;
//==============================================================================end;function TprinterGYK.JudgeZFNumber(str: string): integer;
var
i:integer;
Number:integer;
begin
Number:=0;
for i:=0 to length(str)-1 do
if (ord(str[i])<128) and (ord(str[i])>31) then
inc(Number);
result:=Number;
end;function TprinterGYK.JudgeZFD_S(Number: integer): integer;
var
i:integer;
begin
I:=Number mod 2;
if i=0 then
result:=0
else
result:=1;
end;function TprinterGYK.Judge013Number(str: string): integer;
var
i:integer;
ZF_013Number:integer;
begin
strL.Clear;
ZF_013Number:=0;
if length(str)>0 then
for i:=0 to length(str) do
begin
if ord(str[i])=13 then
begin
Inc(ZF_013Number);
strL.Add(inttostr(i));
end;
end;
result:=ZF_013Number;
end;constructor TprinterGYK.Create;
begin
inherited Create;
strL:=TStringList.Create;
end;destructor TprinterGYK.Destroy;
begin
strL.Free;
inherited Destroy;
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货