如何限制RichEdit的滚动条?

xhzok 2011-06-01 02:44:19
问题一
Delphi7中设定Richedit1属性如下:

RichEdit1.Width:=160;
RichEdit1.WordWrap:=false;
RichEdit1.ScrollBars:=ssHorizontal;

请问:如何控制RichEdit1中当水平方向输入内容像素点超过其宽度比如500时能自动回车换行?

问题二
Delphi7中设定Richedit1属性如下:

RichEdit1.Width:=160;
RichEdit1.Height:=160;
RichEdit1.WordWrap:=true;
RichEdit1.ScrollBars:=ssVertical;

请问:如何控制RichEdit1中当垂直方向输入内容高度达到或超过一个固定值比如500时末行禁止回车换行,而
第1行~倒数第2行还可回车换行,但此时超过500高度的行将自动被删除?即限制RichEdit1中输入文字的
总高度。
...全文
286 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhzok 2011-06-07
  • 打赏
  • 举报
回复
各位辛苦了,谢谢大家,结帖了。
xhzok 2011-06-03
  • 打赏
  • 举报
回复
各位说的设置边界的是如下方法:
var
R: TRect;
begin
RichEdit1.Width:=150;
RichEdit1.Height:=100;
with RichEdit1 do
begin
R:=Rect(10,10,100,80);
SendMessage(Handle, EM_SETRECT, 0, Longint(@R));
Refresh;
end;
end;


但仅限于不超过RichEdit1大小的范围内有效,如果设 RichEdit1.WordWrap:=false;
RichEdit1.ScrollBars:=ssHorizontal;
则如想让输入文字的宽度超过RichEdit1.Width后在某点自动换行,则上述方法无效,比如:
RichEdit1.Width:=150;

R:=Rect(10,10,200,80);
SendMessage(Handle, EM_SETRECT, 0, Longint(@R));

当输入文字长度超过200时,只要你不回车,它就永远不会自动换行。
目前发现TScrollInfo还有点靠谱,但就是不知怎样才能在超过200后自动将多余的文字回车到下一行。

lyhoo163 2011-06-03
  • 打赏
  • 举报
回复
1、TRichEdit可以自动换行。你只设置有关参数即可。
2、它有点象Word,还可以设段的左间隔与右间隔。
chu_czx444 2011-06-03
  • 打赏
  • 举报
回复
mark up
xhzok 2011-06-01
  • 打赏
  • 举报
回复
bdmh:你好!

经测试,你的方法计算的数值不准确,而且当每行文字大小不等时就更不适用了。
比如第一个答案中:
w := size.cx;
if w > RichEdit1.Width then
还没到RichEdit1.Width就ShowMessage('ok')了。

我原来有个比较精确的方法,但苦于不知如何加入回车才能保持每行的文字像素总长不超过1个定值,请高手指点:
(以第1个问题为例)

RichEdit1.Width:=160;
RichEdit1.WordWrap:=false;
RichEdit1.ScrollBars:=ssHorizontal;

procedure TForm1.RichEdit1Change(Sender: TObject);
var
SI: TScrollInfo;
begin
SI.cbSize := SizeOf(TScrollInfo);
SI.fMask := SIF_ALL;
GetScrollInfo(RichEdit1.Handle, SB_HORZ, SI);
if SI.nMax>=RichEdit1.Width then
begin
ShowMessage('已经到了右边!');
exit;
//我的困惑之处:如何刚好删除每行超过的文字又能回车将超过的文字移入下一行?
end;
end;




wmz110 2011-06-01
  • 打赏
  • 举报
回复
RichEdit控件会自动换行,不需要人工控制,至于限制输入高度,可以在事件内做下判断,至于什么事件,就不用说了吧。
xhzok 2011-06-01
  • 打赏
  • 举报
回复
谢谢高手,我去试一下,如果行就结贴。
dinoalex 2011-06-01
  • 打赏
  • 举报
回复
外加tscrollbar
bdmh 2011-06-01
  • 打赏
  • 举报
回复
第一个

procedure TForm1.RichEdit1Change(Sender: TObject);
var
s:string;
w:Integer;
dc:HDC;
size:TSize;
begin
s := Self.RichEdit1.Lines.Strings[RichEdit1.Lines.Count-1];
dc := GetDC(RichEdit1.Handle);
GetTextExtentPoint(dc,PAnsiChar(s),Length(s),size);
w := size.cx;
if w > RichEdit1.Width then
begin
ShowMessage('ok');//这里回车
end;
end;

第二个同理

procedure TForm1.RichEdit1Change(Sender: TObject);
var
s:string;
w:Integer;
dc:HDC;
size:TSize;
begin
s := Self.RichEdit1.Lines.Strings[RichEdit1.Lines.Count-1];
dc := GetDC(RichEdit1.Handle);
GetTextExtentPoint(dc,PAnsiChar(s),Length(s),size);
w := size.cy*RichEdit1.Lines.Count;
if w > 200 then
begin
ShowMessage('ok');//这里可以做个全局标记,那样在会车时,判断这个标记
end;
end;

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧