RMReport3.51破解手札㈢

该博客详细介绍了RMReport3.51的打印逻辑,包括逐份打印和逐页打印的实现过程,涉及到Pascal语言中的汇编代码。文章通过解析源码,展示了如何判断打印条件、调用打印函数以及处理用户取消操作。
摘要由CSDN通过智能技术生成
破解步骤三——代码重建:
  在此需要将限制的代码恢复(改变)成原来正常的代码,正常打印的Pascal代码应该如下所示:
  1. procedure _DoPrintReport;
  2. var
  3.     i,j: integer;
  4. begin
  5.     if 逐份打印 then
  6.     begin
  7.         i := 0;
  8.         repeat
  9.             if CanPrint(i) then PrintOnePage(i);
  10.             i := i+1;
  11.         until ((i>=TRMEndPages.GetCount-1or (UserCancel));
  12.     end 
  13.     else begin
  14.         //逐页打印
  15.         for i:=0 to TRMEndPages.GetCount-1 do
  16.             for j:=0 to copies{打印份数} do 
  17.             begin
  18.                 if CanPrint(i) then PrintOnePage(i);
  19.                 if UserCancel then Break;
  20.             end;
  21.     end;
  22. end;
文章出自:《编程手札》http://blog.csdn.net/nhconch
作者:狂歌痛饮
请从《编程手札》阅读原文,引用或转载可能导致内容不全。

      根据Pascal代码可以很轻易的写出对应的汇编代码:
    1. //第一段
    2. asm
    3.     mov eax, [ebp + $08]
    4.     cmp byte ptr [eax + $0C], $00   //判断是否逐份打印
    5.     jz @@579                        //不是转到逐页打印
    6. //`````````````````逐份打印`````````````````````````````
    7.     xor ebx, ebx                    //ebx保存当前打印份数
    8.     jmp @@557
    9. @@506:
    10.     mov eax, [ebp + $08]
    11.     mov eax, [eax - $08]
    12.     mov eax, [eax + $58]
    13.     call TRMEndPages.GetCount    //取总页数
    14.     dec eax                         //eax=页数-1
    15.     mov ecx, eax                    //ecx保存循环次数
    16.     xor eax, eax                    //eax保存当前打印页码
    17. @@1:
    18.     push ecx
    19.     push eax
    20.     push ebp
    21.     call _CanPrint
    22.     test al, al                     //判断是否要打印
    23.     jz @@528
    24.     pop ecx {push ebp}
    25.     
    26.     pop eax
    27.     push eax
    28.     push ebp
    29.     call _PrintOnePage
    30. @@528:
    31.     pop ecx {push ebp}
    32.     pop eax
    33.     pop ecx
    34.     
    35.     inc eax
    36.     loop @@1
    37.     inc ebx                         //打印份数加1
    38. @@557:
    39.     mov eax, [ebp + $08]
    40.     cmp ebx, [eax - $0c]            //对比打印份数
    41.     jnl @@679                       //打完退出
    42.     mov eax, [ebp + $08]
    43.     mov eax, [eax - $08]
    44.     cmp byte ptr [eax + $30], 
    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 1
      评论
    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中,打印设置只能保存页面边距及打印份数、是否两遍打印以及
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值