DreamMemo 中文化(0分)

  • 主题发起人 主题发起人 jiichen
  • 开始时间 开始时间
J

jiichen

Unregistered / Unconfirmed
GUEST, unregistred user!
{日前使用过 DreamMemo 的套件,发现
其的确为功能相当强大的软体,但中文
便不支援,特改写其中一项函数,
针对其 WordWrap =true 时,在边缘会
产生乱码,将之改写成不会强硬分割中
文字的函数。
此举乃为抛砖引玉罢了。
不过,此 TDCMemo 是为英文专用,仍有
许多应修改之处,如游标位移时仍以一个
英文字母为单位,不会自动判断双位元
语系的字等等。
敝人的功力浅薄,望诸位高手相助。}

function TCustomDCMemo.FindWordBreak(const s : string;
var Pos : integer;
Len : integer) : string;
var
i : integer;
idx : integer;
// (JC) 新增之变数
tc:string;
j:integer;
begin
if length(s) - Pos > Len then
begin
idx := -1;
for i := Len + Posdo
wnto Posdo
if s in GetSource.DelimSet then
begin
idx := i;
break;
end;

if idx = -1 then
begin
idx := Len + Pos;
end;

// (JC)自订,加入判断中文,避免被切成两半
// 判断原理,首先 j:=0;
// 进入中文左半部时 inc(j);
// 进入中文右半部时 dec(j);
// 则判断完时 j 应为零,不是则为半字。
//
// 简繁应该皆可适用。
//
// 改写部分开头
tc:=Copy(s, pos, idx-pos+1);
j:=0;
i:=1;
while i<=(Length(tc))do
begin
if (tc>=#$81) and (tc<=#$fe) then
begin
inc(j);
if i<length(tc) then
begin
if (tc[i+1]>=#$40) and (tc[i+1]<=#$fe) then
begin
dec(j);
inc(i);
end;
end;
end;
inc(i);
end;

if j<>0 then
dec(idx,1);
// 改写部分结尾。
result := Copy(s, Pos, idx - Pos + 1);
Pos := idx + 1;
end
else
begin
result := Copy(s, Pos, length(s) - Pos + 1);
Pos := length(s) + 1;
end;
end;

m
 
呵呵, 我的解决方法可就复杂多了. 我用的是windows的GetTextExtentExPoint, 取得
每个字符(包括汉字)的宽度, 然后根据格式化宽度进行调整. 可以实现两端对齐式
wordwrap. 用此方法关于光标定位的问题也就迎刃而解了. 不过程序繁了点. 而且需要
额外内存记录至少一行中所有字符的宽度(我用的是array [0..1023] of Integer).
 
附加功能 将问题提前
 
接受答案了.
 

Similar threads

S
回复
0
查看
896
SUNSTONE的Delphi笔记
S
S
回复
0
查看
873
SUNSTONE的Delphi笔记
S
S
回复
0
查看
688
SUNSTONE的Delphi笔记
S
S
回复
0
查看
683
SUNSTONE的Delphi笔记
S
后退
顶部