当前位置: 首页 > news >正文

fastreport 如何 设置 richview 的 行高

richview中的行高改变有点特别。必须在AfterData 事件执行的时候才能修改;

也就是说,如果简单的放一个按钮,去发送消息给richView->RichEdit ,然后调用frxReport1->ShowReport 是没有用的

正确的做法如下

  • 在C++ BUILDER 中增加一个函数SetLineSpace,用来修改RichView的行高
  • 在Form的Create事件中,调用frxReport->AddFunction 方法注册一个函数SetLineSpace
  • 在Form的Create时间中,调用frxReport->ScriptText 添加AfterData 响应脚本 (这不是必须的,如果直接编辑脚本固定死,也可以)
  • 在AfterData的脚本中,调用SetLineSpace
  • 在frxReport1->frxReport1UserFunction 响应事件中,调用SetLineSpace 函数。完成设置

下面是实现的代码

 

头文件

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "frxClass.hpp"
#include "frxDBSet.hpp"
#include "frxPreview.hpp"
#include <ADODB.hpp>
#include <DB.hpp>
#include "frxRich.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TfrxReport *frxReport1;
    TfrxPreview *frxPreview1;
    TfrxDBDataset *frxDBDataset1;
    TADOConnection *ADOConnection1;
    TADOQuery *ADOQuery1;
    TButton *Button1;
    TfrxRichObject *frxRichObject1;
    TEdit *Edit1;
    TEdit *Edit2;
    TLabel *Label1;
    TLabel *Label2;
    void __fastcall FormCreate(TObject *Sender);
    Variant __fastcall frxReport1UserFunction(const AnsiString MethodName,
          Variant &Params);
    void __fastcall frxReport1EndDoc(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
    bool d_flag;

public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    void TForm1::SetLineSpace(AnsiString name);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "frxClass"
#pragma link "frxDBSet"
#pragma link "frxPreview"
#pragma link "frxRich"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    d_flag = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    ADOQuery1->Open();
//add event notify function
    frxReport1->AddFunction("void SetLineSpace(name:String)",
                        "SetLineSpace","change the linspace");
//add script for event handle
    frxReport1->ScriptLanguage = "C++Script";
    frxReport1->ScriptText->Clear();
    frxReport1->ScriptText->Add(
        "void richOnAfterData(TfrxComponent sender)"
        "{"
        "   SetLineSpace(Sender.Name); "
        "}" );
//don't forget it
    frxReport1->ScriptText->Add("{}");
//set the event handle for richview's onAfterData
    TfrxRichView* rich = dynamic_cast<TfrxRichView*>(
        frxReport1->FindObject("Rich1"));
    rich->OnAfterData = "richOnAfterData";
}
//---------------------------------------------------------------------------
void TForm1::SetLineSpace(AnsiString name)
{
    TfrxRichView* rich = (TfrxRichView*)frxReport1->FindObject(name);
    rich->RichEdit->SelectAll();
    PARAFORMAT2 Para;
    Para.cbSize = sizeof(Para);
    Para.dwMask = PFM_LINESPACING;
    Para.bLineSpacingRule = 4;
    Para.dyLineSpacing  = Edit1->Text.ToIntDef(200);
    SendMessage(rich->RichEdit->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));

    rich->RichEdit->SelAttributes->Size = Edit2->Text.ToIntDef(20);
}

Variant __fastcall TForm1::frxReport1UserFunction(
      const AnsiString MethodName, Variant &Params)
{
    if (MethodName.UpperCase() == AnsiString("SetLineSpace").UpperCase())
    {
        SetLineSpace(Params.GetElement(0));
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::frxReport1EndDoc(TObject *Sender)
{
    d_flag = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//if click quickly ,the d_flag'll protect the thread synchrolized
//otherwise your may get an error
    if (d_flag)
    {
     d_flag = false; //这句一定要放在前面 frxReport1
->ShowReport(); } } //---------------------------------------------------------------------------

 

实现的效果

 

此时文字重叠了

 

除了上述方法之外,还有一个更简单的办法。

 

在frxReport的OnBeginDoc事件中,调用下面的代码来修改行距,关键点是,给RichView发送消息,必须在BeginOnDoc事件或者是RichView的RTF被赋值之后调用修改行距的函数。

void TDataMod_T::SetRichEditLineSpace()
{

    TfrxRichView* rich = dynamic_cast <TfrxRichView *> (frxReport1->FindObject("Rich1"));

    if (rich != NULL && rich->Tag > 0)
    {
        rich->RichEdit->SelectAll();
        PARAFORMAT2 Para;
        Para.cbSize = sizeof(Para);
        Para.dwMask = PFM_LINESPACING;
        Para.bLineSpacingRule = 4;
        Para.dyLineSpacing  = rich->Tag*4;
        SendMessage(rich->RichEdit->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));
    }


}

除了OnBeginDoc,还可以使用frxReport组件的OnBeforePrint 

void __fastcall TForm1::frxReport1BeforePrint(TfrxReportComponent *Sender)
{
    TfrxRichView* rich = dynamic_cast<TfrxRichView*>(Sender);
    if (rich == NULL)
    {
        return;
    }
    rich->Tag = 20;
    if (rich != NULL && rich->Tag > 0)
    {
        rich->AllowExpressions = false;
        AnsiString text = rich->RichEdit->Text;
        rich->RichEdit->SelectAll();
        PARAFORMAT2 Para;
        Para.cbSize = sizeof(Para);
        Para.dwMask = PFM_LINESPACING;
        Para.bLineSpacingRule = 4;
        Para.dyLineSpacing  = rich->Tag*40;
        SendMessage(rich->RichEdit->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));
    }
}

 

转载于:https://www.cnblogs.com/songr/p/5638234.html

相关文章:

  • Windows Phone 7 不温不火学习之《页面导航》
  • 我的ipad应用备份
  • 我又回来了
  • windows向ubuntu过渡之常用软件安装
  • java.util.ConcurrentModificationException 异常
  • windows和linux的协议栈驱动
  • vmware的vmnet-概念的解说
  • typeScript.webpackreact的正确版quickStart
  • vmware的vmnet-感官和视觉上的效果
  • 学习笔记:树分治
  • vmware的vmnet-有机会还要看源码
  • Python中递归的最大次数
  • vmware的vmnet-理解全景后解答两个问题
  • vmware的vmnet-组网,升级和应用
  • lintcode:形状工厂
  • 3.7、@ResponseBody 和 @RestController
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ES6语法详解(一)
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JAVA SE 6 GC调优笔记
  • JavaScript函数式编程(一)
  • MQ框架的比较
  • MYSQL 的 IF 函数
  • Solarized Scheme
  • vue数据传递--我有特殊的实现技巧
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 看域名解析域名安全对SEO的影响
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 如何正确理解,内页权重高于首页?
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #1015 : KMP算法
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (003)SlickEdit Unity的补全
  • (3)(3.5) 遥测无线电区域条例
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (待修改)PyG安装步骤
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (转)http协议
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)创业的注意事项
  • (转)创业家杂志:UCWEB天使第一步
  • .net mvc部分视图
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net7 环境安装配置
  • .netcore如何运行环境安装到Linux服务器
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • ?php echo ?,?php echo Hello world!;?
  • @取消转义
  • [ C++ ] STL_list 使用及其模拟实现