问题一
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中输入文字的
总高度。
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中输入文字的
总高度。
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;
比如第一个答案中:
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;
2、它有点象Word,还可以设段的左间隔与右间隔。
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后自动将多余的文字回车到下一行。