在对话框调整器里面有这个功能。对话框每行字数并不是由程序自身决定的,而是在对话文件中写的“*”决定换行的位置。
对话文件talk.grp和talk.idx的格式非常简单,talk.grp文件只要把全部内容按位取反就是Big5的明码,星号表示换行而0表示一条结束。talk.idx里面保存的是每条对话的长度,也可以认为是下一条的起始位置。
我在重整对话文件“*”位置时使用的是如下的方法。算法本身很简单,根据读入的第一个字节判断字符是否是Big5码里面的,这时需要把2个字节作为一个字符处理,idx文件就直接生成一个新的。
这个算法是用 Object Pascal 写的,一些不太关键的代码略去了,注意这里并没有先取反,而是直接操作的。
file0:=Fileopen(edit2.text,fmOpenread);
//file0用来打开原始的talk.grp文件
length:=Fileseek(file0,0,2);
filegrp:=filecreate('talk1.grp');
fileidx:=filecreate('talk1.idx');
i:=0;
fileseek(file0,0,0);
while i<length do
begin
fileread(file0,ch,1);
i:=i+1;
if (c=0) and (ch>=128) and (ch<>213) then
begin
filewrite(filegrp,ch,1);
p:=p+1;
x:=x+1;
c:=0;
end;
//以上是对字符为标准ASCII字符的处理
if ch=213 then
begin
end;
if (c=0) and (ch<127) and (ch>0) then
begin
filewrite(filegrp,ch,1);
fileread(file0,ch,1);
i:=i+1;
filewrite(filegrp,ch,1);
p:=p+1;
x:=x+2;
end;
//以上是对Big5字符的处理
if (p>=p0) and (ch<>0) then
begin
p:=0;
ch1:=213;
Filewrite(filegrp,ch1,1);
x:=x+1;
end;
//在适当位置添加星号
if (ch=0) then
begin
x:=x+1;
filewrite(fileidx,x,4);
Filewrite(filegrp,ch,1);
p:=0;
end;
//重新编制索引
end;
有兴趣的朋友可以据此减少重复工作的时间。
No comments:
Post a Comment