• Delphi VCL 在TRichEdit控件中设置WordWrap属性后无法自动换行的问题


    最近在使用RAD XE7时,在WIN10上开发一个类似记事本的工具,使用的是TRichEdit控件,在实现自动换行功能时,发现设置WordWrap后无法自动换行,经过检查发现和滚动条ScrollBars属性有关系,只要设置水平滚动条( RichEdit1.ScrollBars := TScrollStyle.ssBoth; 或 RichEdit1.ScrollBars := TScrollStyle.ssHorizontal;)均会导致WordWrap失效。

    印象中在XP和WIN7上并没有碰到该问题,而查看了VCL实现方法应该和以前Delphi7差别不大,推测可能和WIN10后的TRichEdit控件有关系,毕竟该控件依赖于系统的RICHEDIT控件。

    解决方法有如下2种,推荐第二种:

    方法一(重载TRichEdit):

    type
    TRichEditHotFix = class(TRichEdit) private protected procedure CreateParams(var Params: TCreateParams);override; end; implementation { TRichEditHotFix } procedure TRichEditHotFix.CreateParams(var Params: TCreateParams); const WordWraps: array[Boolean] of DWORD = (0, ES_AUTOHSCROLL or WS_HSCROLL); begin inherited; // 修复WordWrap=True时没有自动换行的问题(WIN10以前的版本应该不存在该问题) with Params do Style := Style and not WordWraps[WordWrap]; end;

    上面这种方法是在CreateParams中自动去掉 ES_AUTOHSCROLL 和 WS_HSCROLL 属性,相当于在设置WordWrap=True时,去掉水平滚动条。

    不过这种方法需要将重载的控件动态创建或安装到IDE使用,相对麻烦,

    所以推荐用下面的方法,在Form中多几行代码即可(会影响程序的运行效率,但微乎其微,关系不大)

    方法二:

    procedure TForm1.ChangeWordWrap();
    begin
      RichEdit1.WordWrap := not RichEdit1.WordWrap;
      if RichEdit1.WordWrap then
        RichEdit1.ScrollBars := TScrollStyle.ssVertical
      else
        RichEdit1.ScrollBars := TScrollStyle.ssBoth;
    end;
  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/caibirdy1985/p/5810575.html
Copyright © 2020-2023  润新知