procedure TRMCustomMemoView.WrapMemo1(aAddChar: Boolean);
var
  lCurHeight, lOneLineHeight, lMaxWidth: Integer;
  lWCanvas: TCanvas;

  procedure _OutLine(const lStr: WideString);
  begin
    FSMemo.Add(lStr);
    Inc(lCurHeight, lOneLineHeight);
  end;

  procedure _WrapOutMemo;
  var
    h, oldh: HFont;
    i: Integer;
  begin
    h := RMCreateAPIFont(lWCanvas.Font, , FFontScaleWidth);
    oldh := SelectObject(lWCanvas.Handle, h);

    try
      lCurHeight := ;
      lOneLineHeight := -lWCanvas.Font.Height + LineSpacing; //每一行高度;
      lMaxWidth := spWidth - spGapLeft *  - _CalcHFrameWidth(LeftFrame.spWidth, RightFrame.spWidth);
      ) then
        lMaxWidth := Round(lMaxWidth *  / FParentReport.FDesigner.Factor);

      ) and
        (RMWideCanvasTextWidth(lWCanvas, FMemo1[]) > lMaxWidth) and
        (FMemo1[] <> ][] = '[') then
        _OutLine(FMemo1[])
      else
      begin
        if not FNeedWrapped then //不需要换行
        begin
            do
            _OutLine(FMemo1[i]);
        end
        else if WordWrap or AllowHtmlTag then //自动换行
        begin
          lCurHeight := lCurHeight + RMWrapStrings(FMemo1, FSMemo, lWCanvas, lMaxWidth, LineSpacing {lOneLineHeight},
            WordBreak, CharWrap, AllowHtmlTag, True, aAddChar);

          FSMemo.Add(#);
        end
        else //不自动换行
        begin
            do
          begin
            _OutLine(FMemo1[i]);
          end;

          FSMemo.Add(#);
        end;
      end;
    finally
      FVHeight := lCurHeight - LineSpacing;
      LineHeight := lOneLineHeight;
      SelectObject(lWCanvas.Handle, oldh);
      DeleteObject(h);
    end;
  end;

  procedure _WrapOutMemo90;
  var
    h, oldh: HFont;
    i: Integer;
  begin
    h := RMCreateAPIFont(lWCanvas.Font, , FFontScaleWidth);
    oldh := SelectObject(lWCanvas.Handle, h);
    try
      lCurHeight := ;
      lOneLineHeight := -lWCanvas.Font.Height + LineSpacing;
      lMaxWidth := spHeight - spGapTop *  - _CalcVFrameWidth(TopFrame.spWidth, BottomFrame.spWidth);
      if not FNeedWrapped then
      begin
          do
          _Outline(FMemo1[i]);
      end
      else if WordWrap then
        lCurHeight := lCurHeight + RMWrapStrings(FMemo1, FSMemo, lWCanvas, lMaxWidth, LineSpacing {lOneLineHeight},
          WordBreak, CharWrap, AllowHtmlTag, True, aAddChar)
      else
      begin
          do
          _Outline(FMemo1[i]);
      end;
    finally
      FVHeight := lCurHeight - LineSpacing;
      LineHeight := lOneLineHeight;
      SelectObject(lWCanvas.Handle, oldh);
      DeleteObject(h);
    end;
  end;

  procedure _WrapOutMemo180;
  var
    i: Integer;
  begin
    lCurHeight := ;
    lOneLineHeight := -lWCanvas.Font.Height + LineSpacing; //每一行高度;
    lMaxWidth := spHeight - spGapTop *  - _CalcVFrameWidth(TopFrame.spWidth, BottomFrame.spWidth);

    ) and
      (RMWideCanvasTextWidth(lWCanvas, FMemo1[]) > lMaxWidth) and
      (FMemo1[] <> ][] = '[') then
      _OutLine(FMemo1[])
    else
    begin
      if not FNeedWrapped then //已经换行
      begin
          do
          _OutLine(FMemo1[i]);
      end
      else if WordWrap then //自动换行
      begin
        lCurHeight := lCurHeight + RMWrapStrings(FMemo1, FSMemo, lWCanvas, lMaxWidth, LineSpacing {lOneLineHeight},
          WordBreak, CharWrap, AllowHtmlTag, False, aAddChar);
      end
      else //不自动换行
      begin
          do
        begin
          _OutLine(FMemo1[i]);
        end;
      end;
    end;
    FVHeight := lCurHeight - LineSpacing;
    LineHeight := lOneLineHeight;
  end;

  procedure _ChangeFontSize;
  var
    i: Integer;
    lStr: string;
    lMaxWidth: Integer;
  begin
    lMaxWidth := spWidth - spGapLeft *  - _CalcHFrameWidth(LeftFrame.spWidth, RightFrame.spWidth);
     then Exit;

      do
    begin
      lStr := FMemo1[i];
      ) do
        lWCanvas.Font.Size := lWCanvas.Font.Size - ;
    end;

    Font.Size := lWCanvas.Font.Size;
  end;

begin
  if not AutoAddBlank then
    aAddChar := False;
  if RotationType <> rmrtNone then
    AllowHtmlTag := False;

  FParentReport.DrawCanvas.LockCanvas;
  try
    lWCanvas := FParentReport.DrawCanvas.Canvas;
    lWCanvas.Font.Assign(Font);
    lWCanvas.Font.Height := -Round(Font.Size *  / );
    SetTextCharacterExtra(lWCanvas.Handle, CharacterSpacing);
    case FScaleFontType of
      rmstByWidth:
        begin
          if DocMode <> rmdmDesigning then
            _ChangeFontSize;
        end;
      rmstByHeight:
        begin
        end;
    end;

    FSMemo.Clear;
    case RotationType of
      rmrt90, rmrt270: _WrapOutMemo90;
      rmrt180: _WrapOutMemo180;
    else
      _WrapOutMemo;
    end;

    SetTextCharacterExtra(lWCanvas.Handle, );
  finally
    FNeedWrapped := False;
    FParentReport.DrawCanvas.UnLockCanvas;
  end;
end;

RM报表 文本框 自动换行 相关代码的更多相关文章

  1. 基于jQuery的计算文本框字数的代码-jquery

    用户边输入计算同时进行,告诉用户还剩余多少可输入的字数,当超过规定的字数后,点击确定,会让输入框闪动 一.功能:  1.用户边输入计算同时进行,告诉用户还剩余多少可输入的字数;  2.当超过规定的字数 ...

  2. 解决ie文本框不能输入和获取焦点问题

    解决办法:    从正常的机器上拷贝c:\windows\system32\mshtmled.dll到本机的system32目录下即可.或者从安装盘中提取该文件.    加载mshtmled.dll: ...

  3. jQuery 文本框得失焦点应用

    一.文本框得失焦点一种是改变文本框的样式    得到焦点:               失去焦点: 二.文本框得失焦点另一种是改变文本框的值    得到焦点:     失去焦点:       三.jQ ...

  4. java学习:AWT组件和事件处理的笔记(1)--文本框

    java.awt包中的TextField类是专门用来建立文本框的,即TextField类创建的一个对象便是一个文本框. 1.TextField类的主要方法    (1)TextField()      ...

  5. jquery 文本框回车与change事件

    文本框的改变用change事件 要用bind,两个是有区别的,change只是在失去焦点的时候出发,很多时候不能满足需要.  代码如下   $('#flowfromid').bind("pr ...

  6. 同步文本框内容的JS代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. input文本框实现宽度自适应代码实例

    代码实例如下: <!DOCTYPE html> <html><head><meta charset="utf-8"><meta ...

  8. input文本框实现宽度自适应代码实例,input文本框

    本章节介绍一下如何让一个文本框的宽度能够随着文本框中的内容的宽度增长而增长,也就是能够实现宽度自适应效果. 代码实例如下: <!DOCTYPE html> <html> < ...

  9. 用JS添加文本框案例代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. POJ 1847 Tram --set实现最短路SPFA

    题意很好懂,但是不好下手.这里可以把每个点编个号(1-25),看做一个点,然后能够到达即为其两个点的编号之间有边,形成一幅图,然后求最短路的问题.并且pre数组记录前驱节点,print_path()方 ...

  2. OracleHelper(for produce)

    OracleHelper中,有一个用存储过程实现的Insert方法. 然后我把执行存储过程的方法 封装成了可以执行任何存储过程,参数是 存储过程名称 以及存错过程中的传入.传出参数 using Ora ...

  3. android-----JNI学习 helloworld

    (1)新建android工程 (2)添加NDK路径 (3)添加本地支持 给本地库起名 此时工程目录下会自动生成jni文件夹 此时Makefile也自动生成 LOCAL_PATH := $(call m ...

  4. 注册Dev的帮助文件

    Download the CHM files from… Code: https://www.devexpress.com/Support/Documentation/download.xml?pla ...

  5. #openstack故障处理汇总

    ##openstack故障处理汇总 排错 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ############# ...

  6. 此博客停更,转至lustforlife.cn

    新博客地址:lustforlife.cn

  7. matplotlib基本用法-【老鱼学matplotlib】

    本文介绍一下matplotlib的最基本用法. 这次我们要显示一个线性方程的直线. 首先要引入matplotlib库,一般是用plt这个简写的,我们就按照大多数人的惯例来进行命名: import ma ...

  8. 手动部署 kubernetes HA 集群

    前言 关于kubernetes HA集群部署的方式有很多种(这里的HA指的是master apiserver的高可用),比如通过keepalived vip漂移的方式.haproxy/nginx负载均 ...

  9. C++ 引用变量

    int rats; int & rodents = rats; rats 和 rodents 可以互换,他们指向相同的值和内存单元.其实就是给rats取了别名rodents. 修改其中任意一个 ...

  10. JavaScript基础笔记(八)DOM扩展

    DOM扩展 一.选择符API Selectors API是由W3C发起制定的一个标准,致力于让浏览器原生支持CSS查询. 一)querySelector() 在Document和Element类型实例 ...