急!如何让RichEdit不显示半行文字,请高手赐教!

tass0115 2009-06-04 08:57:24
加精
在RichEdit中输入文字时,遇到一页显示不下时,控件可以自动切换到下一页(此时不显示半行文字),等输入完成,重新移动光标到第一页,会出现半行文字,如何能让RichEdit无论在什么时候都不显示半行文字,遇到半行文字直接跳到下一页,曾想过在这行插入一个回车,但不知道怎么准确判断该行是半行?其实我就是想做一个文本分割并将其转为BMP图片,就是要保证没有半行的出现。头疼好多天了,请高手赐教!
...全文
583 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
深圳_阿信 2012-05-10
  • 打赏
  • 举报
回复
补充下,richedit2用来控制显示的内容,判断每行字体和行距,不要超过richedit2控制高度,如超过就转图,显示下页内容,richedit1会记录拷selstart位置,就这样一页一页下去,直到显示完,又从头开始
深圳_阿信 2012-05-10
  • 打赏
  • 举报
回复
你好此问题有解决吗?我现在也在做这功能,但我现在做的是用二个richedit,一个richedit1可以显示所有内容,当然也有半的情况,但richedit2是用来控制的,这里面的内容是和richedit1一样的,这里内容我没用 iSelStart := redt1.SelStart;
redt1.SelectAll;
redt1.CopyToClipboard;

redt1.SelStart := iSelStart;
redt2.Clear;
redt2.SelectAll;

redt2.PasteFromClipboard;

因为这方法老是会拷到回车符,最用流的方式,可以实现内容同步,不过我现在感觉用二个richedit还是不方便,因为要生成位,效率不高,所以现在想请教下你是什么方法,我的QQ:30881567,有机会可以交流下,谢谢!

SrcMS: TMemoryStream;
DesMS: TMemoryStream;
//SrcMS: TFileStream;
//DesMS: TFileStream;
Str: string;
FileStream: TFileStream;
Test: array[0..1000] of Char;
begin
redt1.Lines.SaveToStream(SrcMS);
SrcMS.Position := 0;
SetString(Str, nil, SrcMS.Size);
//mmo1.Lines.Add('1111:' + Str);
SrcMS.Read(Pointer(Str)^, SrcMS.Size);
//mmo1.Lines.Add('222222:' + Str);

DesMS.WriteBuffer(Pointer(Str)^, Length(Str));
DesMS.Position := 0;
redt2.Lines.LoadFromStream(DesMS);
lyhoo163 2009-12-28
  • 打赏
  • 举报
回复
up
hezongjun 2009-06-08
  • 打赏
  • 举报
回复
heh ,不懂!
lihj0926 2009-06-08
  • 打赏
  • 举报
回复
LZ可以试试通过假借打印,将内容按规定的高宽截取到内存,然后将内存中内容保存成BMP就OK了!
ioo88 2009-06-07
  • 打赏
  • 举报
回复
看不懂........
liu123456tao 2009-06-07
  • 打赏
  • 举报
回复
说的具体点 好给你看看
ccrun.com 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 tass0115 的回复:]
就是说当内容刚好只有一页,但最后一行是不完整时,nLineHeight恒大于0,不能执行插入空行的语句,但按要求这时也应该将最后一行下移。谢谢ccrun这么晚了还陪着我帮我解决问题!
[/Quote]
我现在发现问题了。原来我试验的时候,RichEdit最后有一个空行,干扰了对下一行的坐标位置的判断。目前正在寻找解决方法。
horon 2009-06-05
  • 打赏
  • 举报
回复
我也遇到过类似的情况,可能是版本问题。
heikeyanxi 2009-06-05
  • 打赏
  • 举报
回复
up
yangjue1 2009-06-05
  • 打赏
  • 举报
回复
wordwrap属性置为true
小笨象 2009-06-05
  • 打赏
  • 举报
回复
我留个书签。。。。
cycttt 2009-06-05
  • 打赏
  • 举报
回复
kankan
qqshenyunzcz 2009-06-05
  • 打赏
  • 举报
回复
学习
tass0115 2009-06-05
  • 打赏
  • 举报
回复
我想到一个办法,执行这部分代码前,强制在RichEdit最后添加一个空行,当判断到nLineHeight<0后再判断最后一个可视行的下一行是否为空,不为空时才执行转图命令。方法比较笨,不过应该是可行的。再次感谢ccrun!

// 如果下一行的行高小于0,说明显示不完全,就在最后一个可视行后加一空行
if (nLineHeight < 0) then
begin
if RichEdit21.Lines.Strings[nLastVisibleLine + 1] <> '' then
begin //下一行不为空
RichEdit21.Lines.Insert(nLastVisibleLine, '');
Application.ProcessMessages;
ConvertToBmp; //转图
end;
end;
我还得仔细测试测试。。。
yanggt628 2009-06-05
  • 打赏
  • 举报
回复
ddd
tass0115 2009-06-05
  • 打赏
  • 举报
回复
项目比较着急,就先用这个方案吧。再次对ccrun表示感谢,以后想到更好的方法别忘了告诉我哦!谢谢!谢谢大家!
结贴了。
ccrun.com 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 tass0115 的回复:]
我想到一个办法,执行这部分代码前,强制在RichEdit最后添加一个空行,当判断到nLineHeight <0后再判断最后一个可视行的下一行是否为空,不为空时才执行转图命令。方法比较笨,不过应该是可行的。再次感谢ccrun!

// 如果下一行的行高小于0,说明显示不完全,就在最后一个可视行后加一空行
if (nLineHeight < 0) then
begin
if RichEdit21.Lines.Strings[nLastVisibleLine + 1] <> '' then
begin //下一行不为…
[/Quote]

这个办法我考虑过,总感觉不是很完美。所以没有采用。不过到目前为止,我暂时还没有太好的解决方法。
wxbasl 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ccrun 的回复:]
Delphi(Pascal) codeuses RichEdit;

procedure TForm1.Button1Click(Sender: TObject);
var
r: TRect;
nCharPos: Integer;
// nFirstVisibleLine: Integer;
nLastVisibleLine: Integer;
nPrevLineCharPos: Integer;
dwPos: DWORD;
nLineHeight: Integer;
begin
RichEdit1.Perform(EM_GETRECT, 0, LPARAM(@r));
r.Left := r.Left + 1;
r.Top := r.Bottom - 2;

// …
[/Quote]

高人
pstrunner 2009-06-05
  • 打赏
  • 举报
回复
路过。
加载更多回复(22)

5,386

社区成员

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

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