是否可行:奇思异想的简繁双语程序的实现方式,是否可行,如何办到 [300+](300分)

  • 主题发起人 主题发起人 rogue
  • 开始时间 开始时间
顶,,也许用ini文件可以..问题是高手没有把相关作法公布..我们一般用的ini方法可能比较笨,,但如果 方法得当,应该不错的, 各位高手能否 把代码 献出呢..:)....
 
再顶!

用INI来做,一般都是用穷举法,把需要的类的属性都列出来才可以!
所以觉得不是很方便,最好一次性解决所有的麻烦!
 
我的解决方法是,所有界面(除主调用界面)都是动态生成,动态定义,定义的record转化成流(因为结构中的动态array和string类数据只包含4byte指针 所以必许把所指的数据写进流),然后把流整体转换成一数据区,内存中压缩后写入数据库的2进制字段。同样取出这个字段转换到相应结构后可动态创建这些窗体。结构包括 5个主要部分
R_bsky_mis=record
SQL:R_bsky_SQLText;//定义SQL命令组和须替换的参数(包括存储过程等)例;
// select * from cut where :cust_no
SQLpara:R_Bsky_Paracoms;//和前面参数对应的一组控件的定义,用于动态产生SQl
{条件部分 例:1 TBskyParaEdit 在其中输入 2001~3001(可以很复杂)
TBskyParaEdit.GetSqltextjiang 将得到 and(cust_no>=2001 and cust_no <=3001)
前面的and 根据的个控件的选者 夜课以是or 或没有}
viewform:R_bsky_form_view;//数据显示界面
printdefine:R_bsky_PrintDatas;//打印和导出定义 可有多个
DataInput:R_Bsky_DataInput;//数据录入定义
Right:Besky_MIS_Right//set类型 用户登录后对此project 的权限
end;
我本月底应该能完成示范程序了。 这样除了主界面和20几个控件的界面,其它界面 想要什么文字就定义什么文字。更重要的是 整个系统构成只需要写SQL 命令,其余动动鼠标,输入几个文字就数字就可以构成系统了。我辞职在家写此程序快半年了。
 
bmsr:
好象很強喔,
但是不能很好的理解,
也不能很好的把現有的項目轉化成您的項目
所以繼續跪求可行性方案
 
hook所有的显示API,如TextRect,TextOut...等等,在里面转换,你的源程序什么也不用改,如果你用简繁体混合录入数据,一样可以正确显示
 
to bmsr:
你的想法很不错,希望早日看到你的DEMO,不过还是有些问题,比如数据库中存储的数据万一出错(有各种原因的可能),那整个系统就不能正常运行了,有没有校验或者弥补的措施呢?
 
俺见过这个程序,不仅简繁体,还有英语
pb做的
知道英汉的转换,不知道简繁转换的是怎么弄得
 
pas装入dfm? 那是delphi自动装入的啊....查找同名文件

按楼主的想法修改dfm的字符那转换简繁字符不是要重新编译文件了??

应该是在通过代码在运行exe的时候自动转换字符才对啊,和pas还有dfm文件根本没关系啊
 
写一个程序,用正则表达式,找出所有DFM中的控件名和caption,自动生成INI不就行了。

还有,那不叫繁体字,叫做正体字,一点都不繁。
 
不错啊,现在还是英汉转换比较自在丫
 
我想主要用内码的角度去思考的好一些
 
to 孔明.net:
正则表达式如何使用?不太了解这方面,可否简单写些代码给个示范,多谢了!!
 
mzlsx,:
您这个想法就更历害了,但是可行性还得讨论讨论

hs-kill,:
如果您对delphi编译的软件结构有多一点了解的话,你就会发现
dfm文件是当做资源文件放在EXE中的,即然这样,它一定会有被载入的时候,
载入之前翻译,就是最好的时机

大家再顶啊
 
哦~~~哈哈 抱歉啊 没注意过这块,刚查了下相关资料,确实dfm文件是以资源文件形式存储在编译后的文件中的.....

刚参考以前的资料里的一个测试:
procedure TForm1.Button1Click(Sender: TObject);
begin
WriteComponentResFile('C:/FORM1.RES', form1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
NewForm: TForm1;
begin
NewForm := TForm1.CreateNew(Application);
ReadComponentResFile('C:/FORM1.RES', NewForm);
NewForm.Left := NewForm.Left + 100;
end;

于是产生了个初步的想法:
各窗体文件全部动态创建
制作的程序,主体exe文件只是调用其他窗体用
在creat以后先读取其资源文件(dfm文件)保存到临时目录
WriteComponentResFile('C:/FORM1.RES', form1);
然后写个简繁转换的函数把保存的文件中字符替换掉
最后在重新载入这个替换后的文件
ReadComponentResFile('C:/FORM1.RES', NewForm);

感觉理论上可以搞定......
 
hs-kill:
不是理論上可以實現,確實是可以實現

但是生成窗口的時候就已經load過一次,然后再load一次,
一會有性能的影響
我是想說,在它內部的調用里就把資源給轉換了,
那才叫做厲害啊,哈絕無性能影響
高手們,加油啊,
外語好的,在老外的網站上查查資料
 
可以所有窗口全部手动创建啊.......那样就可以手动load,替换创建了,而不用application.creatform
 
我采用Dll,其实跟ini的效果差不多,然后在窗口创建时使用自定义过程SetLabelCaption设置需要设置文字的控件
 
后退
顶部