一台电脑安装了两台打印机(A和B )
要打印机两种报表,一种报表指定用A打印机打,一种报表指定用B打印机打
可是打印时,打印机是切换过来了,可是纸张不对procedure TPayFrm.N6Click(Sender: TObject);
var strsql:string;
    DaXie:string;
    printno:integer;
begin
  inherited;
  //是否已交费
  if not IsPay(adomst.fieldbyname('yhyear').AsString,
               adomst.fieldbyname('yhmonth').AsString,
               adomst.fieldbyName('yhcode').AsString ) then
  begin    exit;
  end;
  SetPrinter(0);//设置打印机
  if adomst.IsEmpty then exit;  strsql:='select * from v_payvoince where yhyear='+
    adomst.fieldbyname('yhyear').AsString+
    ' and yhmonth='+adomst.fieldbyname('yhmonth').AsString+
    ' AND YHCODE='''+adomst.fieldbyname('yhcode').AsString+'''';
  //  showmessage(strsql);  quyprint.Connection:=FrmQCDM.ADOCon;
  quyprint.Close;
  quyprint.SQL.Clear;
  quyprint.SQL.Text:=strsql;
  quyprint.Open;  DaXie:=XiaoXieToDaXie( FormatFloat('#.00', quyprint.FieldByName('payamount').AsFloat) );
  With PrintFrm do
  begin
   BASIC_USE.DataSet:=quyprint;
   RMReport1.LoadFromFile('.\report\Payvoince.rmf');
   Diaxie:=DaXie;
   RMReport1.PrinterName:=printer.Printers[printer.PrinterIndex];
   
   RMReport1.ShowReport;  end;
end;//污水费收据
procedure TPayFrm.N8Click(Sender: TObject);
var strsql:string;
    sda:widestring;
    P:Boolean;
    digits:array[0..6] of string;
    DaXie:array[0..8] of string;
    i,n:integer;
begin
  inherited;
  if adomst.IsEmpty then exit;
  SetPrinter(1);  //设置打印机
  P:=IsPayPWF(adomst.fieldbyname('yhcode').AsString,
                 adomst.fieldbyname('yhyear').AsInteger,
                 adomst.fieldbyname('yhmonth').AsInteger);
  if (P=False) AND (MessageDlg('你确认已收到< '+adomst.fieldbyname('yhcode').AsString+' >'+
     adomst.fieldbyname('yhyear').AsString+'年'+adomst.fieldbyname('yhmonth').AsString+'月的污水费吗?',
     mtInformation,[mbYes,mbNO],0) =mrNo) then exit;
  UpdatePWF_LOCK(adomst.fieldbyname('yhcode').AsString,
                 adomst.fieldbyname('yhyear').AsInteger,
                 adomst.fieldbyname('yhmonth').AsInteger
                );  strsql:=' select dbo.CalLast(a.yhyear,a.yhmonth) as PrevDate,a.yhaddress,a.pwf,PWFSFBQ,a.pwfprice,b.kaipiaoren,b.soukuangren '+
          ' from v_usedatabymonth a inner join yh_paydata b '+
          ' on a.serno=b.ref_useno '+
          ' where b.yhyear='+adomst.fieldbyname('yhyear').AsString+' and b.yhmonth='+
          adomst.fieldbyname('yhmonth').AsString+
          ' AND b.YHCODE='''+adomst.fieldbyname('yhcode').AsString+'''';
  //showmessage(strsql);  quyprint.Connection:=FrmQCDM.ADOCon;
  quyprint.Close;
  quyprint.SQL.Clear;
  quyprint.SQL.Text:=strsql;
  quyprint.Open;
  
  n:=0;
  for i:=0 to High(DaXie) do
    DaXie[i]:='0';  sda:=Small2Big(quyprint.fieldbyname('pwf').AsFloat );
 // showmessage(sda[1]);
  DaXie[Length(sda)]:='¥';
  for i:=Length(sda) downto 1 do
  begin
   // showmessage(sda[i]);
    DaXie[n]:=sda[i];
    Inc(n);
  end;  With PrintFrm do
  begin
   BASIC_USE.DataSet:=quyprint;   RMReport1.LoadFromFile('.\report\PWFVoince.rmf');
//   Diaxie:=DaXie;   baiwan:=DaXie[8];
   shiwan:=DaXie[7];
   wang  :=Daxie[6];
   qian  :=Daxie[5];
   bai   :=DaXie[4];
   shi   :=Daxie[3];
   yuan  :=Daxie[2];
   jiao  :=Daxie[1];
   feng  :=Daxie[0];
   RMReport1.PrinterName:=printer.Printers[printer.PrinterIndex];
   RMReport1.ShowReport;  end;
end;procedure TPayFrm.SetPrinter(serno:integer);
var
  Mydevice,Mydriver,MyPort,s:array[0..255] of char;
  MyHandle:THandle;
  i:integer;
  pDMode:PDevMode;
begin  if printer.Printers.Count=1 then exit;
  //printer.SetPrinter();
  printer.Refresh;
  printer.PrinterIndex:=Serno;  Printer.GetPrinter(Mydevice,
                     MyDriver,
                     MyPort,
                     MyHandle);  StrCat(MyDevice,',');
  StrCat(MyDevice,MyDriver);
  StrCat(MyDevice,',');
  StrCat(Mydevice,MyPort);  //write win.ini
  WriteProfileString('WINDOWS','DEVICE',Mydevice);
  //tell all application that windows ini file has changed ,
  //this will cause them all to recheck default printer
  SendMessage(HWND_BROADCAST,
              WM_WININICHANGE,
              0,
              LongInt(@MyDevice)
              );
end;

解决方案 »

  1.   

    根据打印要求,更改默认打印机就可以了更改默认打印代码:  ComboBox1.Items:=Printer.Printers; {populates ComboBox} //取打印机列表
      ComboBox1.ItemIndex:=Printer.PrinterIndex; //获得当前默认打印机
    //设任意一个打印机为默认打印机
      Printer.PrinterIndex:=ComboBox1.ItemIndex;
      Printer.GetPrinter(Device,Driver,Port,hDeviceMode);
      StrCopy(s,Device);
      StrCat(s,',');
      StrCat(s,Driver);
      StrCat(s,',');
      StrCat(s,Port);
      WriteProfileString ('windows','device',s);
      StrCopy(s,'windows');
      SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(@s));
      

  2.   

    整理一下思路。试试。1 设置Printer0的打印输出格式。
    2 设置Printer1的打印输出格式。
    3 程序生成Printer0要打印的报表。
    4 选择Printer0打印
    5 清除现有的报表。
    6 程序生成Printer1要打印的报表。
    7 选择Printer1打印