中文的段落处理?(50分)

  • 主题发起人 主题发起人 Gzwing
  • 开始时间 开始时间
G

Gzwing

Unregistered / Unconfirmed
GUEST, unregistred user!
在Tmemo 内如何处理中文的分段?
还有,分段落后,段头要空两个空格。

例:

这里是第一段...........(80字符后自动换行)
这里是上一段的.....

这里是第二段........

要求:

第一段前要空两格
" 这里是第一段...........(80字符后自动换行)
"这里是上一段的.....
"
" 这里是第二段........
"
"

谢谢!
 
你的限制80个字符自动换行应该是将属性WordWrap设为True了。
不知你注意了没有,TMemo中的每一行是一个String,所有的String组成了TStrings
所以它的Lines就是个TStrings.
将属性WordWrap设为True实现输入时的自动换行,实际上是他自动将你的一个String
分开了,成为两行了,所以说,如果你的TMemo中已经有数据的话,并且每段(输入
人心中想的)没有特殊标记的话,根本分辨不出那是段首,那是段中,所以就没法
在所谓首行缩进。
当然如果首行缩进在录入的时候进行的话,还是有办法的,一般来说,分段时,用户
要敲回车,所以我们只要扑获这个动作,并且自动在下一行上加上几个空格从而缩进
就可以了。你在那几个关于“键”的事件中选一个来实现吧。
并且在捕获上述事件的同时,可以将段首的行号记下来(用数组或其他什么结构都
行),并且随时跟踪这些行,保持“首行缩进”。
至于怎么判断首行缩进,这个应该简单了吧,前四个字符为空格,第五个字符不是空
格即可。注意判断全角的空格。
 
再说一点,不妨换个控件,网上这种东东多的很。
 
取得tmemo.text, 查找回车换行, 回车换行的地方就是本段尾, 回车换行后面就是下一段开始.
因此只要把回车换行(#13#10)替换成(#13#10+一定数量空格)即可模拟段首缩进. 至于要加多少
空格最好计算一下(不同字体不同):
function SpaceStr: string;
var
canvas: TCanvas;
begin
canvas := tcanvas.create;
canvas.handle := getdc(memo.handle);
canvas.font := memo.font;
result := stringofchar(' ',canvas.textwidth('测试') div canvas.textwidth(' '));
canvas.free;
end;

至于自动换行, 只要设置memo.wordwrap := true就行了.
 
Another_eYes的用法肯定会有问题的,因为TStrings的实现中,不同行之间
正是用“回车+换行”来分割的,也就是说你用Text属性取得的值中,每行之间都
有#13#10作为分割,而根本不管你什么分段之类的。
反过来也是这样,如果你直接对一个TStrings类的事例(用TStringList,
TStrings是抽象类)的text属性赋值,如
StringList.text := 'AB'+#13#10+'CD';
那么你会看到'AB'和"CD'在两个行上,也可查看行数,会是2。
你可以试一下就会明白的,例如在Form上放一个Memo,属性WordWrap为TRUE;
然后放个Button,写一个过程,显示Memo的行数。然后编译运行,在Memo中输入
文字,直到换行,点击Button,会告诉你到底memo中的Lines是几行。
 
我的方法有问题?
最简单的例子:
设计时: 设置wordwrap:=true;
点击lines,输入一整行长文字.
现在您在memo中看到已经自动换行了文本. 如果照ningliu说的, 每行后自动加上了#13#10,
那么如果我把memo的边框拉大回怎么样呀, 难道每行的字数不变吗?

事实胜与雄辩哦.

还不信的话, 可以事先写个txt, 只有一行长文本(也就是说其中只有一个#13#10). 用memo.loadfromfile加载, wordwrap:=true; 您看到的是几行文字了. 然后再用
memo.savetofile保存. 用notepad打开看看新文件, 到底有几行? 还是一行哦.
 
Another_eYes的方法没问题!
我试了一下,果然如Another_eYes所说。
但我将Memo的lines赋给(用Assign)一个我创建的TStringList的对象时
情况就如我所说的那样了。如果用text复制数据的话,是原来那样了。
看来Memo的Lines与TStringList的内部实现不太相同,虽然他们的共同祖先是
TStrings。
 
呵呵, 可以这样:
var
txttemp:TStrings;
i:integer;
begin
txtTemp:=Tstringlist.create;
txttemp.loadfromfile('tmemo.txt');
for i:=0 to txttemp.count-1 do
begin
txttemp.strings:=trimleft(txttemp.strings);
while copy(txttemp.strings,1,1)=' '
txttemp.strings:=copy(txttemp.strings,2,len(txttemp.strings));
txttemp.strings:='  '+txttemp.strings;
end;
memo1.lines.assign(txttemp);
end;
 
忘了说明一下:' '是全角空格,MEMO1.WORDWRAP:=TRUE;
 
我自己也想过了!我自己的方法跟 cytown 一样,觉得效果最好!
谢谢!
看看我的!
VAR
abc:TStringlist;

BEGIN
abc:=TStringlist.create;
for i:=0 to M1.Lines.Count-1 do
Abc.add('  '+M1.Lines);
M1.Lines.Clear;
M1.Lines.AddStrings(abc);
Abc.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部