问一个问题,因生产需要增加些新的字段,然后打印。 
可是新增加了字段后打印的整个布局就改变了,要重新调整,因为是动态的字段。所以调整起来比较麻烦,能帮帮我嘛 
需要用到单元在附件里,帮我看看 好嘛 
原来打印时候页面布局,在我新增字段后,整个页面要改动,不知道如何改!就这个问题!
代码不太看的明白 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.