我有二个打印机,用RAVE做的报表。同时要打印:一个报表送到打印机A,一个报表送到打印机B上。使用了以下例程:
function TPrintselect.SetPrinter(const PrinterName: String): boolean;
var
  s2 : string;
  dum1 : Pchar;
  xx, qq : integer;
  pr_name:string;
const
  cs1 : pchar = 'Windows';
  cs2 : pchar = 'Device';
  cs3 : pchar = 'Devices';
  cs4 : pchar = #0;begin
  xx := 254;
  GetMem( dum1, xx);
  pr_name:=Copy(printName,1,pos(',',printname)-1);
  printer.PrinterIndex:=printer.Printers.IndexOf(pr_name);
  Result := False;
  try
    qq := GetProfileString( cs3, pchar( pr_name ), #0, dum1, xx);
    if (qq > 0) and (trim( strpas( dum1 )) <> '')    then begin
      s2 := pr_name + ',' + strpas( dum1 );
      while GetProfileString( cs1, cs2, cs4, dum1, xx) > 0 do
        WriteProfileString( cs1, cs2, #0);
      WriteProfileString( cs1, cs2, pchar( s2 ));
      case Win32Platform of
       VER_PLATFORM_WIN32_NT :
       begin
         SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(cs1));
         changeRegPrint; //同时修改注册表
       end;
       VER_PLATFORM_WIN32_WINDOWS :
         SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, LongInt(cs1));
     end; 
  Result := True;
end;
finally
  FreeMem( dum1 );
end;
end;
通过注册表、打印机控制面板都能看到打印机在变动,但是RAVE报表只能打在程序开始进入时的那个默认打印机上。请问该如何解决?程序使用了:TRvRenderPrinter.Render来调出预视时的文件进行打印。

解决方案 »

  1.   

    TRvRenderPrinter.Render
    后面设置一个等待时间
    sleep(3000);
      

  2.   

    TRvRenderPrinter.Render(‘tmp.ndr')
    就是在向打印机发送打印内容了啊?
    如何设置等候时间?
    是在
    TRvRenderPrinter.Render(‘tmp.ndr')
    之前设成这样的吗?
    sleen(3000)
    TRvRenderPrinter.Render(‘tmp.ndr')
    但我也这样设过,没有作用啊
      

  3.   

    设置先报表送到打印机A
    然后中间加入一个时间 sleen(3000) 
    接着再传送到打印机B上 
      

  4.   

    我也曾经用rave做过双打印机程序,但是没有成功。总是不能转换打印机,需要打印的时候在设置打印机。
    建议楼主如果不麻烦的话,一个用rave输出,一个用print程序打印输入,因为print是可以选择打印机的索引。用程序改变默认打印机的方法是不可以的,因为每次只是读入一次默认打印机。除非重启程序。
      

  5.   

    1 API选择打印机。(资料网上有,不在赘述)
    2 Rave功能强大,可以选择打印机,而不用更改默认打印//随时BCB代码,但更改简单
    //选择你要使用的打印机
    if(!RvNDRWriter1->SelectPrinter("Microsoft Office Document Image Writer"))
    {
       ShowMessage("ydlchina提示,打印机不存在!");
       return;
    }
       RvProject1->Open();
       RvProject1->Execute();
      

  6.   

    我已经成功解决了这一问题:使用了rvpage本身就有的属性:printer.因为我这个报表是要在运行时才知道打到那台机器上的,所以我使用了:
    rvproject.projman.findreport(report_name).print=getPrint('小票打印')getprint只是从INI文件中读出打印的配置.这样无须设什么默认打印机就可以,也不用等待,直接就可以打印了,但是在INI文件中的打印机名称一定要正确.否则它还是会打在默认的打印机上.