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. caffe的db_lmdb.hpp文件

    先总的说一下: 类:LMDBCursor:  它干了点什么?它需要传入参数为:mdb_txn(传入它是因为用完它,把它absort掉), mdb_cursor;它应该是用来读出数据的: 类:LMDBT ...

  2. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  3. spring.hibernate设置参数的位置问题

    1.spring的注解设置在set方法上 2.hibernate的注解设置在get方法上

  4. 转:为什么C++中空类和空结构体大小为1?

    参考:http://www.spongeliu.com/260.html 为什么C++中空类和空结构体大小为1? On November 17, 2010, in C语言, 语言学习, by spon ...

  5. Phoenix - Hbase与SQL

    Phoenix - Hbase与SQL 2016-10-23 杜亦舒 Phoenix是什么 简单来说,Phoenix 是一个可以让我们通过SQL的方式操作HBase数据库的框架. HBase是一个No ...

  6. 常用SQL语句(交互)

    %-------通配符 select * from [EMoney_Club].[dbo].[GoldIdea_AdviceCollect] where [Content] like '%昵称%' s ...

  7. UIStepper

    @在IOS5中增加了一个UIStepper的新控件,UIStepper可以连续增加或减少一个数值.控件的外观是两个水平并排的按钮构成,一个显示为“+”,一个显示为“-”. 1. 初始化控件 UISte ...

  8. 使用XIB实现一个简单view

    技术处女贴 欢迎来探讨 转帖请注明出处 http://www.cnblogs.com/andy-zhou/p/4962135.html 微信: @Andy 1. AppDelegate AppDele ...

  9. Python 练习 11

    #!/usr/bin/python # -*- coding: UTF-8 -*- import math for i in range(10000): #转化为整型值 x = int(math.sq ...

  10. 1106c语言语法树