procedure TRMReport.ShowPreparedReport;
var
s: string;
lPreviewForm: TRMPreviewForm;
begin
RMCurReport := Self;
Flag_PrintBackGroundPicture := True;
if (not FThreadPrepareReport) and (EndPages.Count = ) then Exit; FCurrentBand := nil;
FCurrentPage := nil;
FMasterReport := Self;
FDocMode := rmdmPreviewing;
s := RMLoadStr(SPreview);
if ReportInfo.Title <> '' then
s := s + ' - ' + ReportInfo.Title
else if FileName <> '' then
s := s + ' - ' + ExtractFileName(FileName)
else
s := s + ' - ' + RMLoadStr(SUntitled); if Assigned(Preview) then
begin
FCurPreview := Preview;
Preview.ShowReport(Self);
end
else
begin
if csDesigning in ComponentState then
lPreviewForm := TRMPreviewForm.Create(nil)
else
lPreviewForm := TRMPreviewForm.Create(Self);//这里
  { TRMPreviewForm }
TRMPreviewForm = class(TForm)
ImageList1: TImageList;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
FDoc: Pointer;
FViewer: TRMPreview;//这里 包括 预览对象
FPopupMenu: TRMPopupMenu;
FPopupMenuPrint: TRMPopupMenu;
  { TRMPreview }
TRMPreview = class(TRMVirtualPreview)
private
FShowToolbar: Boolean;
FOnBtnExitClickEvent: TNotifyEvent;
FOnSaveReportEvent: TRMPreviewSaveReportEvent; Dock971: TRMDock;
ToolbarStand: TRMToolbar;
BtnExit: TRMToolbarButton;
btn100: TRMToolbarButton;
btnOnePage: TRMToolbarButton;
btnPageSetup: TRMToolbarButton;
btnPageWidth: TRMToolbarButton;
btnShowOutline: TRMToolbarButton;
ToolbarSep972: TRMToolbarSep;
//{$IFDEF USE_TB2K}
// btnPrint: TRMSubmenuItem;
//{$ELSE}
btnPrint: TRMToolbarButton; //打印按钮
//{$ENDIF}
procedure TRMPreview.btnPrintClick(Sender: TObject);
begin
if (Report = nil) or (not btnPrint.Visible) then Exit; Print;//打印方法
end;
procedure TRMVirtualPreview.Print;
var
lSavePrinterIndex: Integer;
lNeedSave: Boolean;
lPages: string;
lForm: TRMPrintDialogForm;
begin
if FPrepareReportFlag then Exit;
if (GetEndPages = nil) or (RMPrinters.Count = ) then Exit; lForm := TRMPrintDialogForm.Create(nil);//打印对话框
procedure TRMPrintDialogForm.FormShow(Sender: TObject);
begin
cmbPrinters.Items.Assign(RMPrinters.Printers);//读取打印机列表
cmbPrinters.Items.Delete();//删除虚拟打印机
FOldIndex := CurrentPrinter.PrinterIndex;
if FOldIndex <= then
cmbPrinters.ItemIndex :=
else
cmbPrinters.ItemIndex := FOldIndex - ;
if cmbPrinters.ItemIndex < then
cmbPrinters.ItemIndex := ;
chkCollateClick(nil); cmbPrintAll.ItemIndex := ;
cmbPrintAll.Left := Label5.Left + Label5.Width + ; cmbScalePapers.ItemIndex := -; cmbPrintersChange(nil);
FSpinOffsetTop.Value := FPrintOffsetTop / ;
FSpinOffsetLeft.Value := FPrintOffsetLeft / ;
end;
constructor TRMPrinterList.Create;
begin
inherited Create; FLock := TCriticalSection.Create; FPrinters := TStringList.Create;
BuildPrinterList;//读取打印机列表
GetDefaultPrinter;
end;
procedure TRMPrinterList.BuildPrinterList;
var
lLineCur, lPort: PChar;
lBuffer, lPrinterInfo: PChar;
lFlags, lCount, lNumInfo: DWORD;
I: Integer;
lLevel: Byte;
tmp: TRMPrinterInfo;
lStr: string;
begin
FLock.Acquire;
try
FreePrinterList; FPrinters.Clear;
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
lFlags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
lLevel := ;
end
else
begin
lFlags := PRINTER_ENUM_LOCAL;
lLevel := ;
end; lCount := ;
EnumPrinters(lFlags, nil, lLevel, nil, , lCount, lNumInfo);
if lCount > then
begin
GetMem(lBuffer, lCount);
try
if not EnumPrinters(lFlags, nil, lLevel, PByte(lBuffer), lCount, lCount, lNumInfo) then
Exit; lPrinterInfo := lBuffer;
for I := to lNumInfo - do
begin
if lLevel = then
begin
with PPrinterInfo4(lPrinterInfo)^ do
begin
tmp := TRMPrinterInfo.Create(nil, pPrinterName, nil);
FPrinters.AddObject(pPrinterName, tmp);
Inc(lPrinterInfo, sizeof(TPrinterInfo4));
end;
end
else
begin
with PPrinterInfo5(lPrinterInfo)^ do
begin
lLineCur := pPortName;
lPort := FetchStr(lLineCur);
while lPort^ <> # do
begin
lStr := Format(SDeviceOnPort, [pPrinterName, lPort]);
tmp := TRMPrinterInfo.Create(nil, pPrinterName, lPort);
FPrinters.AddObject(lStr, tmp);
lPort := FetchStr(lLineCur);
end; Inc(lPrinterInfo, sizeof(TPrinterInfo5));
end;
end;
end;
finally
FreeMem(lBuffer, lCount);
end;
end; tmp := TRMPrinterInfo.Create(nil, PChar(RMLoadStr(SDefaultPrinter)), nil);
FPrinters.InsertObject(, RMLoadStr(SDefaultPrinter), tmp); //默认打印机 tmp := TRMPrinterInfo.Create(nil, PChar(RMLoadStr(SVirtualPrinter)), nil); // 虚拟打印机
FPrinters.InsertObject(, RMLoadStr(SVirtualPrinter), tmp);
finally
Flock.Release;
end;
end;
procedure TRMPrinterList.Refresh;
begin
FLock.Acquire;
try
BuildPrinterList;
finally
Flock.Release;
end;
end;

RM报表 刷新打印机列表的更多相关文章

  1. [C#] 获取打印机列表

    一:获得本地安装的打印机列表 注:(如果在"设备和打印机"中已经添加了局域网的打印机设备,也算是本地安装的打印机:没有添加的则算作局域网打印机) 1,通过 C# 中 Printer ...

  2. C# 获取打印机列表以及串口

    C# 获取打印机列表以及默认打印机.串口列表. /// <summary> /// 获取本地已安装的打印机 /// </summary> /// <returns> ...

  3. C#获取本地打印机列表,并将指定打印机设置为默认打印机

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  4. C-Lodop获取打印机列表Create_Printer_List

    C-Lodop获取打印机列表Create_Printer_List,此方法Lodop不支持,是C-Lodop特有的函数,客户端本地打印单独用c-lodop,或集中打印等,可以获得本机或云主机的打印机列 ...

  5. Lodop在页面获取打印机列表 选择打印机预览

    利用GET_PRINTER_COUNT,获取打印机个数,然后用GET_PRINTER_NAME(intPrinterIndex);循环获取打印机名称,添加到list列表里,可以让用户在页面就选择打印机 ...

  6. 怎么在Win7系统清除DNS缓存和刷新DHCP列表

    如何清除DNS缓存?开始-运行,如下图所示: 2 在谈出的对话框中输入“cmd”,如下图所示: 3 在出现的DOS命令窗口输入“ipconfig /flushdns”,然后就清除DNS缓存了,在我们遇 ...

  7. 获取WINDOWS打印机列表

    获取WINDOWS打印机列表 如何知道WINDOWS已经安装了哪些打印机? 1) usesVcl.Printers 2) Printer.Printers  // property Printers: ...

  8. 关于调用notifyDataSetChanged刷新PullToRefreshListView列表无反应解决办法

    文章转载自:关于调用notifyDataSetChanged刷新PullToRefreshListView列表无反应解决办法 | TeachCourse

  9. 清除DNS缓存和刷新DHCP列表

    ipconfig /release 只是释放IP地址,然后还需要ipconfig /renew在重新获取一下 如何清除DNS缓存?开始-运行,如下图所示: 在谈出的对话框中输入“cmd”,如下图所示: ...

随机推荐

  1. cublas相关的知识

    下面链接给出了一个例子,怎么用cublas进行矩阵的运算提速,也说明了cublas的大致的使用方法. http://www.cnblogs.com/scut-fm/p/3756242.html cub ...

  2. epoll中et+多线程模式中很重要的EPOLL_ONESHOT实验

    因为et模式需要循环读取,但是在读取过程中,如果有新的事件到达,很可能触发了其他线程来处理这个socket,那就乱了. EPOLL_ONESHOT就是用来避免这种情况.注意在一个线程处理完一个sock ...

  3. Android 自定义Toast

    自定义Toast 其实就是自定义布局文件 感觉利用Dialog或者PopupWindow做也差不多 上图上代码 public class MainActivity extends Activity { ...

  4. Java用WebSocket + tail命令实现Web实时日志

    原文:http://blog.csdn.net/xiao__gui/article/details/50041673 在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail - ...

  5. Google V8扩展利器发布:v8-native-binding-generator

    用C++扩展Google V8很简单,但是类比较多时还是很烦的.前段时间开发cantk-runtime-v8时,我写了一个代码产生器v8-native-binding-generator,让扩展Goo ...

  6. Java 中String常用方法

    java中String的常用方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len ...

  7. NOIP 2014 普及组 T3 螺旋矩阵

    [题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...

  8. 如何理解和熟练使用JS 中的call apply

    有时候看一两个关于apply或call的小例子,感觉能够理解一点点但是下次碰到又要纠结半天才能转过弯来-而且不知道怎么应用到实际工作当中去- call 和 apply 都是为了改变某个函数运行时的 c ...

  9. Django数据库设置

    设置数据库,创建您的第一个模型,得到一个简单介绍 Django的自动生成管理网站. 数据库设置 现在,打开 mysite / settings.py . 这是一个普通的Python模块 模块级变量代表 ...

  10. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...