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
其的确为功能相当强大的软体,但中文
便不支援,特改写其中一项函数,
针对其 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