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;

来源:https://www.cnblogs.com/caibirdy1985/p/5810575.html

相关阅读 >>

Delphi fmx检查应用程序状态更改

Delphi mediaplayer 实现录音

Delphi 让窗口一直置顶,并且焦点也不移出

Delphi 侧边栏隐藏窗体

Delphi 如何从一张图片中裁剪一部分距形图片另存为文件(使用canvas.copyrect)

Delphi firdac 对 sqlite 数字, int64也会被截断,会出现负数情况处理

Delphi10.3模拟读取百度网页,并读取相关头部信息

Delphi生成的webservice appdebug的程序,编译时出错

Delphi webbrowser 释放注意事项

datasnap 上传/下载大文件(本demo以图传片文件为例)

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...