RMReport3.51破解手札㈡

 前文再续,书接上一回。

 破解步骤二——代码分析:
  在跟踪过程发现,RMReport对打印的限制来自于rm_class.dcu文件,通过Dcu2Pas对rm_class.dcu反翻译得到_DoPrintReport函数的汇编源码,再结合D6对汇编代码的跟踪,得到如下的关键源码段:

  1.   procedure _DoPrintReport;
  2.   var
  3.     i: Integer;
  4.     j: Integer;
  5.     lipgList: TStringList;
  6.     lPrinter: TRMPrinter;
  7.     liNeedNewPage: Boolean;
  8.     lFactorX: Double;
  9.     lFactorY: Double;
  10.     lSavePrintInfo: TRMPageInfo;
  11.     lOldPageNumber: Integer;
  12.     lPageWidth: Integer;
  13.     lPageHeight: Integer;
  14.   asm
  15.     @@474{8D 53 58                } lea     edx, [ebx+$58]                   
  16.     @@477{8B 45 F0                } mov     eax, [ebp-$10]                   
  17.     @@480{E8 00 00 00 00          } call    TRMPrinter.FillPrinterInfo       
  18.     @@485{8B 45 F0                } mov     eax, [ebp-$10]                   
  19.     @@488{E8 00 00 00 00          } call    TRMCustomPrinter.BeginDoc        
  20.     @@493{8B 45 08                } mov     eax, [ebp+$08]                   
  21.     @@496{80 78 0C 00             } cmp     byte ptr [eax+$0C], $00          
  22.     @@500{74 4D                   } jz      @@579                            
  23. ---------------------------------------------------------------------好戏开场,逐份打印方式
  24.     @@502{33 DB                   } xor     ebx, ebx                         
  25.     @@504{EB 33                   } jmp     @@557                            
  26.     @@506{55                      } push    ebp               -----12F56C
  27.     @@507{33 C0                   } xor     eax, eax                         
  28.     @@509{E8 00 00 00 00          } call    _CanPrint         ------EAX=1,EBX=0,ECX=0,EDX=12F504
  29.     @@514{59                      } pop     ecx                              
  30.     @@515{84 C0                   } test    al, al            -----if _CanPrint then _PrintOnePage(....)
  31.     @@517{74 09                   } jz      @@
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值