RM报表 刷新打印机列表


procedure
TRMReport.ShowPreparedReport; var s: string; lPreviewForm: TRMPreviewForm; begin RMCurReport := Self; Flag_PrintBackGroundPicture := True; if (not FThreadPrepareReport) and (EndPages.Count = 0) 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 = 2) then Exit;

  lForm := TRMPrintDialogForm.Create(nil);//打印对话框

 

procedure TRMPrintDialogForm.FormShow(Sender: TObject);
begin
  cmbPrinters.Items.Assign(RMPrinters.Printers);//读取打印机列表
  cmbPrinters.Items.Delete(1);//删除虚拟打印机
  FOldIndex := CurrentPrinter.PrinterIndex;
  if FOldIndex <= 1 then
    cmbPrinters.ItemIndex := 0
  else
    cmbPrinters.ItemIndex := FOldIndex - 1;
  if cmbPrinters.ItemIndex < 0 then
    cmbPrinters.ItemIndex := 0;
  chkCollateClick(nil);

  cmbPrintAll.ItemIndex := 0;
  cmbPrintAll.Left := Label5.Left + Label5.Width + 11;

  cmbScalePapers.ItemIndex := -1;

  cmbPrintersChange(nil);
  FSpinOffsetTop.Value := FPrintOffsetTop / 10000;
  FSpinOffsetLeft.Value := FPrintOffsetLeft / 10000;
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 := 4;
    end
    else
    begin
      lFlags := PRINTER_ENUM_LOCAL;
      lLevel := 5;
    end;
    
    lCount := 0;
    EnumPrinters(lFlags, nil, lLevel, nil, 0, lCount, lNumInfo);
    if lCount > 0 then
    begin
      GetMem(lBuffer, lCount);
      try
        if not EnumPrinters(lFlags, nil, lLevel, PByte(lBuffer), lCount, lCount, lNumInfo) then
          Exit;

        lPrinterInfo := lBuffer;
        for I := 0 to lNumInfo - 1 do
        begin
          if lLevel = 4 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^ <> #0 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(0, RMLoadStr(SDefaultPrinter), tmp); //默认打印机
    
    tmp := TRMPrinterInfo.Create(nil, PChar(RMLoadStr(SVirtualPrinter)), nil); // 虚拟打印机
    FPrinters.InsertObject(1, RMLoadStr(SVirtualPrinter), tmp);
  finally
    Flock.Release;
  end;
end;

 

 

 

procedure TRMPrinterList.Refresh;
begin
  FLock.Acquire;
  try
    BuildPrinterList;
  finally
    Flock.Release;
  end;
end;

 

转载于:https://www.cnblogs.com/CodeGear/p/4873962.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
版本:1.0.0.1 更新日志: 1. 修正部分用户使用中用到插件的分割符号,致使插件不能正常使用,本版中间使用xml格式,不会和用户使用的符号有冲突。 2. 重新构件了ocx,jar两个地方的源码,使结构更 3. 增加图片、图表的支持 4。 增加了在线设计 5。增加对每个按纽是否可用的控制 注意事项: 1. 这个版本的功能和前一个版本的功能是一样的,如果运行得可以就可以不用更新 严重声名: 插件用到的第三方控件如果涉及版权问题,请自觉向其所再单位获得授权。 声明: 任何个人或组织可以自由使用,可以任意修改、复制、发布,但要保留本人的声明以遵重本人的劳动成果,并且不能用于任何商业目的。 本人提供的是免费报表,不与商家争长短,但希望对你有用: 使用方法: 范例使用的是access数据库,首先在odbc 注册ReportDemo.mdb 数据源,名字随你喜好, 然后修改classes文件下的 db.properties 的连接。 然后把项目放在tomcat下运行既可: 起作用的关键文件:RMVIEWP.CAB 文件,客户端插件 Lib下的两个包:rmview1.0.0.1.jar 使用接口: package common.rmview; /* * 设计的第一步,首先定义字段的类型, * 然后通过AddRow将结果加入缓存中 * */ import common.rmview.surperInterface.IDataSet; import common.rmview.until.Types; public interface IRMDataSet extends IDataSet { public void addField(String fieldName, Types.filedType type, int fieldLength, Boolean isNull);//1:将段类型加入 public void addField(String fieldName, Types type, int fieldLength);//1:将段类型加入,isNull 默认为 false public void AddRow(IRMDataRecord rmd);//2:在 IRMDataRecord实现类赋值完成一条记录后使用一次,循环加入. } package common.rmview; import common.rmview.surperInterface.IDataRecord; /* * 使用时的第二步 * 通过这个接口设置结果集 */ public interface IRMDataRecord extends IDataRecord { public void SetValue(String fieldName,Object objValue); } package common.rmview; /* * 第三步: * 前面IDataSet,IRMDataRecord实现类完成后,通过此接口的实现类向html也面输出ie到ie以方便ocx的取值使用 */ public interface IRMEngine { final int rmf=1; final int rls=2; public void SetReportFile(String urlandFileName,int fileFormat);//1:设置报表路径及文件名称 public void AddClientDataSet(String dataSourceName,IRMDataSet rmd);//2:设置数据源名称以ocx使用,并把IRMDataSet实现的结果加入 public String CreateViewer();//3:生成在html页面的编码 } 具体的使用方法请参照 index.jsp 报表的使用方法请自己参照官方的文档 RM报表的设计请另行学习。 需要更高版本 请联系作者购买 新建QQ群:29672297 有疑问请发邮件到 lujianfu123@yahoo.com.cn 下期计划:进行对 fastReport的封装。不过也要看呼声如何再决定。
VB控件 RMReport7 转:RMReport的使用方法及详解 1、不打印特定的MemoView,套打常用 a.页面设置-->其它-->不打印背景图 b.设置MemoView属性printable=False 2、 如何打印wwDBGrid? 修改rm.inc,如果想支持RX,GIF,JPEG,DimandAccess,Halcyon,DBISAM, EHLib,也需要修改rm.inc //{$DEFINE InfoPower} //修改这行,去掉"//" //{$Ehlib} 3.试用版安装方法(以下假设将文件释放到c:/rm目录中) (1)Tools->Environments Option->Libary->Libary Path中增加: c:/rm/souce c:/rm/bpl $(DELPHI)/Lib $(DELPHI)/Bin $(DELPHI)/Imports $(DELPHI)/Projects/Bpl (2)Component->Install Packages->Add,选bpl/rm_d70.bpl 4.在Delphi IDE中卸载以前的Report Machine版本,然后打开rm_r50.dpk,选"compile", 在打开rm_d50.dpk,选"Install". 包分成了Runtime package和Designer package,所以要安装顺序安装 5、单元格的变量格式用代码设置 t = TRMGridReportPage(RMGridReport1.Pages[0]).Grid.Cells[1, 1].View t = TRMMemoView(RMReport1.FindObject('memo1')); t.DisplayFormat := 'N0.001' //数字型 t.DisplayFormat := 'Dyyyy/mm/dd' //日期型 6、两遍报表如何用代码设置 GridReport1.DoublePass := True 7、用代码写数据字典: RMReport1.Dictionary.FieldAliases.Clear; RMReport1.Dictionary.FieldAliases['RMDBDataSet1'] := '动物'; RMReport1.Dictionary.FieldAliases['RMDBDataSet1."Name"'] := '姓名'; 这样在RM的设计器显示为自定义名称,为最终用户提供友好的显示 8、在报表中如何使用变量(或者如何给某个memoview赋值) a.RMVariables在RM_Class.pas中定义,是全局变量,这样定义后就可以在报表中使用变量"var1",例如: RMVariables['变量名称'] := Edit1.Text; b.用报表中数据字典,TRMReport.Dictionary.Variables,需要注意的是,如果变量是字符型的需要用AsString赋值,其他类型的用RMReport.Dictionary.Variables['var1'] := 1234,例如: RMReport1.LoadFromFile('1.rls'); RMReport1.Dictionary.Variables.AsString['变量名称'] := Edit1.Text; c. 直接对某个单元格赋值,例如: RMGridReport1.LoadFromFile('1.rls'); TRMGridReportPage(RMGridReport1.Pages[0]).Grid.Cells[1,1].Text := '值'; 如果是RMReportRMReport1.LoadFromFile('1.rmf'); t := RMReport1.FindObject('Memo1'); if t nil then // var t: TRMView t.Memo.Text := 'dsdsdsds'; d.脚本中直接引用Form的值 procedure Main; begin Memo1.Memo.Text := Form1.Edit1.Text; end; 9、自动换行 主项数据栏Stretched = true 文本框 Stretched = true WordWrap = true 10、RM内置变量(Script),增加中.... a.属性PrintAtAppendBlank=True CurReport.AppendBlanking=True时代表增加空行 在RM中,打印设置只能保存页面边距及打印份数、是否两遍打印以及
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值