我有二个打印机,用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来调出预视时的文件进行打印。
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来调出预视时的文件进行打印。
解决方案 »
- delphi 获取较系统时间并和指定的字符串时间进行比较,当指定时间小于等于系统时间时弹出提示框。
- 考试系统~~~~从数据库随机抽题~~~~~~~~
- 急急急!!在DELPHI中对EXCEL有改动时,怎么屏蔽系统弹出的对话框。见下代码。
- 语法小问题?
- ADOQUERY中的变量付值问题
- 如何做一个OLE自动化的服务器(如EXCEL),可以嵌入到宿主程序Word中
- 怎么更改一个文件的文件名?
- ole 不能在多线程里面???
- 请问哪位大侠有Delphi的Messages单元中所有参数的详细中文说明??
- 请问各位高手们有什么控件能够实现和串口的简单通讯??
- CxPivotGrid难题
- 设置了很多断点,那个快捷键是 清楚所有断点的
后面设置一个等待时间
sleep(3000);
就是在向打印机发送打印内容了啊?
如何设置等候时间?
是在
TRvRenderPrinter.Render(‘tmp.ndr')
之前设成这样的吗?
sleen(3000)
TRvRenderPrinter.Render(‘tmp.ndr')
但我也这样设过,没有作用啊
然后中间加入一个时间 sleen(3000)
接着再传送到打印机B上
建议楼主如果不麻烦的话,一个用rave输出,一个用print程序打印输入,因为print是可以选择打印机的索引。用程序改变默认打印机的方法是不可以的,因为每次只是读入一次默认打印机。除非重启程序。
2 Rave功能强大,可以选择打印机,而不用更改默认打印//随时BCB代码,但更改简单
//选择你要使用的打印机
if(!RvNDRWriter1->SelectPrinter("Microsoft Office Document Image Writer"))
{
ShowMessage("ydlchina提示,打印机不存在!");
return;
}
RvProject1->Open();
RvProject1->Execute();
rvproject.projman.findreport(report_name).print=getPrint('小票打印')getprint只是从INI文件中读出打印的配置.这样无须设什么默认打印机就可以,也不用等待,直接就可以打印了,但是在INI文件中的打印机名称一定要正确.否则它还是会打在默认的打印机上.