Thursday, April 03, 2008

修改对话框每行字数的源码

在对话框调整器里面有这个功能。对话框每行字数并不是由程序自身决定的,而是在对话文件中写的“*”决定换行的位置。

对话文件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: