線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:28193
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

很方便的多语言套件,免编译,第三方元件也搞定

 
kpdncsz
一般會員


發表:0
回覆:4
積分:0
註冊:2003-04-21

發送簡訊給我
#32 引用回覆 回覆 發表時間:2003-04-29 09:36:40 IP:61.154.xxx.xxx 未訂閱
购买后不知道有没有免费升级?但目前最关心的还是银子问题。 谢谢
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#33 引用回覆 回覆 發表時間:2003-04-29 13:02:04 IP:218.1.xxx.xxx 訂閱
To P.D.兄: 1.这是Demo版本,没有附资料字典管理员 2.MultiDemo.dpr的TAcroMultiStreamDD元件内含英文,中文简体/繁体三种语言,运行时根据你的系统环境,显示相应的语言,如果你的系统是日语,由于没有字典,就没有效果,看到的是英文。 3.http://www.acroprise.com.tw已经发布报价了,要购买的可以先以汇款方式进行。最近正在做电子商务,会很漂亮。 發表人 - mustapha.wang 於 2003/04/30 11:44:28 發表人 - mustapha.wang 於 2003/04/30 15:12:19
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#34 引用回覆 回覆 發表時間:2003-04-29 13:07:20 IP:218.1.xxx.xxx 訂閱
To kpdncsz: 版本升级按软件业惯例处理,Minor免费,Major会收取适当费用。 报价参考http://www.acroprise.com.tw 發表人 - mustapha.wang 於 2003/04/30 15:25:43
------
江上何人初见月,江月何年初照人
bugy
一般會員


發表:4
回覆:8
積分:2
註冊:2003-01-15

發送簡訊給我
#35 引用回覆 回覆 發表時間:2003-04-29 13:28:43 IP:219.68.xxx.xxx 未訂閱
有Single User Licence with Source 的價格嗎? Site Licence 太貴了,個人也用不到
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#36 引用回覆 回覆 發表時間:2003-04-30 10:56:53 IP:61.66.xxx.xxx 未訂閱
引言: To P.D.兄: 1.这是Demo版本,没有附资料字典管理员 2.MultiDemo.dpr的TAcroStreamDD元件内含英文,中文简体/繁体三种语言,运行时根据你的系统环境,显示相应的语言,如果你的系统是日语,由于没有字典,就没有效果,看到的是英文。 3.http://www.acroprise.com.tw/DD/DDIndex.htm已经发布报价了,要购买的可以先以汇款方式进行。最近正在做电子商务,会很漂亮。
mustapha.wang 兄 我查了一下在 MulitDemo中(D5版本), 似乎並沒有置入TAcroStreamDD元件, 我安裝後(直接以下載的bpl加入到component), 好像也沒有 TAcroStreamDD 元件, 但有一個TAcroMultiStreamDD, 因為我必須評估給老闆看, 所以再次麻煩, 感謝!
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#37 引用回覆 回覆 發表時間:2003-04-30 11:40:38 IP:218.1.xxx.xxx 訂閱
To P.D.兄: 对的,是TAcroMultiStreamDD元件,我打错了,它是在设计时就加载字典,随dpr编译进exe中,避免外带字典文件,适合于一些小游戏,工具。 在Demo专案的Main Form的OnCreate里,有写 procedure TFormMain.AcroMultiReplacer1BeforeReplace(Sender: TObject); begin AcroMultiReplacer1.OwnerOption.CodePage:=InttoStr(GetACP); end; 即,按操作系统的当前语言来显示画面。 当然,你可以按实际需求,如在ini文件配置显示的语言,改为 AcroMultiReplacer1.OwnerOption.CodePage:='936';{中文简体} AcroMultiReplacer1.OwnerOption.CodePage:='950';{中文繁体} 如果你要显示的语言不是系统当前的语言,那么就要相应改变Delphi VCL元件的Font.Charset(一般的VCL都有ParentFont属性,预设也为true,你只需改变Form的Font.CharSet就行了,或者设定AcroMultiReplacer1.OwnerOptions.Font.Charset,并把AcroMultiReplacer1.OwnerOptions.ReplaceFont设为True)。 但我们并不推荐你这样做,因为显示语言与系统当前语言不一致时,Delphi的某些VCL元件,如TPageControl等,不能正常显示,看起来会是乱码。 (为了避免此问题,你可以使用UniCode。) 另外还有两个字典元件, TAcroMultiFileDD,从文件读取字典, TAcroMultiDBDD,从TDataSet读取字典. ColorBall游戏没有使用TAcroMultiReplacer,是使用TAcroMultiSreenEye,当一个Form要Activate时,ScreenEye会发现它,并按你设定的参数来转换它的显示语言,这样,对一些三方元件包内的Form,如ReportMachine的打印设置Form,你不用修改它的原码,就可以把它多语言化。 此处不便长篇论述,具体使用看说明文件。谢谢。 發表人 - mustapha.wang 於 2003/05/06 15:36:17
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#38 引用回覆 回覆 發表時間:2003-04-30 17:34:30 IP:218.1.xxx.xxx 訂閱
To BiiLee: BCB6版本的已经传到http://delphi.ktop.com.tw/topic.php?TOPIC_ID=29748了。 抱歉,手上暂时没有
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#39 引用回覆 回覆 發表時間:2003-04-30 17:43:01 IP:218.1.xxx.xxx 訂閱
To bugy兄: 抱歉,不提供Single User Licence with Source。 价格你可以参考 http://www.devexpress.com http://www.multilizer.com http://www.dream-com.com http://www.korzh.com/delphi/localizer/ 中国人写的报表: http://www.delphireport.com.cn http://www.qwerks.com/product.asp?ProductID=6097 比较比较 發表人 - mustapha.wang 於 2003/05/06 16:05:47
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#40 引用回覆 回覆 發表時間:2003-05-06 09:03:58 IP:218.1.xxx.xxx 訂閱
To P.D.兄: 我们对你的Mail的回复被退回来了,现在答复于此。 你问到: 1.所謂 site Licence 的合法授權範圍為何? 2.如果我購買SingleUser版本, 對我的客戶分發及使用時, 有何限制及客戶端是否有要安裝任何轉換引擎系統 3.SingleUser 是否有提供 Source Code的報價 4.由於報價是註明美元, 是否有標準的台幣價格, 5.如何購買, 購買後的售後服務(含諮詢, 未來昇級)如何? 6.由於我取得資訊是來自大陸, 不知這組是由台灣開發出來抑或對岸? 7.購買是否能取得發票? 答复: 1. Site Licence的合法授權範圍係指在一公司內所有的開發工程師都可使用。 2. Single User Licence或Site Licence是對開發者的限制,對終端客戶(End User)沒有限制,亦不需要安裝任何轉換系統。 3. Single User Licence目前不提供Source Code。 4. US$N x 35 = NT$M,另加5%營業稅。 5.1 我們會在網頁上說明帳號,您可使用匯款或ATM轉帳,收到證明後三日內會將軟體EMail給您。五月下旬將支援網路下載。 5.2 售後服務包括一年的免費EMail諮詢及次版本升級: 5.2.1 V3.0.1升級至V3.1.1免費。 5.2.2 V3.0.1升級至V4.0.1計價。 6. 安德華母公司在台灣,子公司在上海。 7. 開立發票。
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#41 引用回覆 回覆 發表時間:2003-05-12 14:41:09 IP:218.1.xxx.xxx 訂閱
上传了字典管理员的功能说明,在: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30293 秉承“集中管理,分散使用”的原则,它可以将字典文件保存到文件或数据库,可以输出一种或几种语言的字典,也可以在Delphi的DFM文件和字典之间双向传送字典资料,自动把旧专案转换成“原语”专案。
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#42 引用回覆 回覆 發表時間:2003-05-16 15:48:49 IP:218.1.xxx.xxx 訂閱
上传了字典管理员(DDManager)的试用版3.0.1,在 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30566
------
江上何人初见月,江月何年初照人
wwww
一般會員


發表:1
回覆:3
積分:0
註冊:2003-06-25

發送簡訊給我
#43 引用回覆 回覆 發表時間:2003-06-25 14:09:49 IP:61.228.xxx.xxx 未訂閱
大家好..我是個新手~~最近才在學的~~^^ 我也有抓這套件下來.但怎樣都沒反應.請大家說說詳細的安裝過程.讓我參考一下行嗎.這裡的文字不知是繁簡合併.還是怎稿的我看過程中.粉多文字卻是空白的.繁體簡體空白穿插編輯.看到我真的頭暈ㄌ...我是用Delphi7ㄉ~~還不熟..謝謝大家~~^^
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#44 引用回覆 回覆 發表時間:2003-06-25 14:30:14 IP:218.1.xxx.xxx 訂閱
何为没反应?设计时是英文,运行时就变成中文了,是不是太方便了,你没有觉察到这一变化?
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#45 引用回覆 回覆 發表時間:2003-12-18 16:59:54 IP:218.1.xxx.xxx 訂閱
http://www.acroprise.com.tw/DD/DDWeb.html 有新版本发布,免费下载试用     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#46 引用回覆 回覆 發表時間:2004-02-25 15:26:18 IP:218.80.xxx.xxx 訂閱
总有朋友电话或mail来问一些问题,看来是我们疏忽了,现在写在此:    安裝多語言套件步驟 http://www.acroprise.com.tw/DD/help/InstallComponent/InstallComponent.htm    DDManager.exe與多語文元件簡易說明 http://www.acroprise.com.tw/DD/help/EasyDDManager/EasyDDManagerHelp.htm    多語言套件使用說明 http://www.acroprise.com.tw/DD/FAQ/HowToUseMultiLang.htm     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#47 引用回覆 回覆 發表時間:2007-10-06 21:14:37 IP:58.41.xxx.xxx 訂閱
本产品在"慧都控件"网新增代理
http://www.evget.com/zh-CN/product/1409/feature.aspx
------
江上何人初见月,江月何年初照人
編輯記錄
mustapha.wang 重新編輯於 2007-10-10 20:12:08, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#48 引用回覆 回覆 發表時間:2007-10-10 00:36:22 IP:61.67.xxx.xxx 未訂閱
mustapha.wang 兄潛到馬里亞那海溝好久,終於浮上來了,雖然現在時機不太對,不過還是想請問一下
1.目前這套版本是否有支援到Delphi2007
2.對於VISTA的架構是否可以上,沒有問題
3.此產品已交由大陸代理,台灣地區我看網頁還在,是否台灣地區還可以做銷售
4.未來的支援是交由大陸處理,還是台灣呢?

謝謝!
===================引 用 mustapha.wang 文 章===================
本产品在新增慧都控件网代理
http://www.evget.com/zh-CN/product/1409/feature.aspx
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#49 引用回覆 回覆 發表時間:2007-10-10 20:09:15 IP:222.68.xxx.xxx 訂閱
哈哈,因为KTop停站一段时间,加上忙,所以KTop复站后也很少来了。
1、本套元件支delphi2007 win32;
2、Vista我没有测试过,不清楚是否有问题;
3、台湾地区的销售仍然有效;(如果下了订单没有回复请给我mail告知)
4、服务移到大陆由我维护。
谢谢。
------
江上何人初见月,江月何年初照人
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#50 引用回覆 回覆 發表時間:2007-11-10 11:44:40 IP:203.204.xxx.xxx 訂閱
從前面的說明上的了解,
這套控件似乎只處理介面的多語轉換, 那資料部份呢?

我的意思是,
可否處理繁體資料庫內容於簡體系統轉成簡體顯示,
同時,可接受簡體輸入並轉成繁體存入繁體資料庫

以下如有錯誤解讀請告知,




anqiyao_801102
一般會員


發表:0
回覆:1
積分:0
註冊:2007-11-12

發送簡訊給我
#51 引用回覆 回覆 發表時間:2007-11-12 11:21:44 IP:222.66.xxx.xxx 訂閱
我们公司在用的,不支持输入内容的多语言化。但这套元件真是方便,我们系统是bpl作模块组装的,写bpl模块的人都感觉不到有这套元件存在, 没有直接使用它的任何一个单元和函数,最后在exe里跑时都多语言化了。你可以用用看。
編輯記錄
anqiyao_801102 重新編輯於 2007-11-12 11:22:57, 註解 無‧
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#52 引用回覆 回覆 發表時間:2007-11-12 23:58:34 IP:203.204.xxx.xxx 訂閱
謝謝你的回覆, 
看起來的確不錯,可惜不是我要的功能


===================引 用 anqiyao_801102 文 章===================
我们公司在用的,不支持输入内容的多语言化。但这套元件真是方便,我们系统是bpl作模块组装的,写bpl模块的人都感觉不到有这套元件存在, 没有直接使用它的任何一个单元和函数,最后在exe里跑时都多语言化了。你可以用用看。
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#53 引用回覆 回覆 發表時間:2008-03-02 21:53:12 IP:222.68.xxx.xxx 訂閱
上周买个台联想的笔记本,预装Vista,第一次使用vista,很多地方不习惯了。
delphi7和BDS2007都可以安装。本多语言元件也跑起来正常,但DDManager需要修改:
1、从注册表读全部CodePage语言有问题,codepage描述符不是可读的咚咚;
2、从exe用GetFileVersionInfo读不出正确的版本信息。

今天终于完成了Delphi.Net的版本,发布到www.evget.com去了。
http://www.evget.com/zh-CN/product/1534/feature.aspx
那个拦截Form的显示和拦截ResourceString的功能花了很多时间。

因此名称也改了改:
Acro Multi-Language Suit for Delphi.Net
Acro Multi-Language Suit for Delphi Win32
------
江上何人初见月,江月何年初照人
編輯記錄
mustapha.wang 重新編輯於 2008-03-04 20:35:24, 註解 無‧
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#54 引用回覆 回覆 發表時間:2008-03-02 22:11:44 IP:222.68.xxx.xxx 訂閱
因为旧系统的缘故,有些用户的系统DFM上设计时全是中文。在使用本多语言元件时,为了偷懒,编辑字典时把原语DDKey用中文来输入,不按建议的方式用DDManager来置换为英文。碰到一个问题,就是程序在英文操作系统下运行,无论如何调整Charset,显示都会是一堆问号。
原因在于:delphi7的classes.pas中的TWriter对DFM的string按WideString转成utf存储,TReader读取时获得的是widestring,然后以string赋给元件,如TLale.Caption。即DFM本身的存储是unicode的,这里不会有问题,但是因为元件本身不是unicode的,在把unicode给ansi是,发生了问题。
ansi直接赋值给unicode时,调用了system.pas的_WStrFromLStr,它按操作系统的codepage转换。在设计时,因为你的操作系统是与你输入法的codepage一致,所以没有问题。
unicode直接赋值给ansi时,调用了system.pas的_LStrFromWStr,当你的程序在英文操作系统运行时,它实际上把DFM的unicode按英文来转成了ansi,所以肯定出问题。
要解决这个问题,只有改变TReader的行为,即可以改变_LStrFromWStr函数,可以用Hook的方法:
procedure MyLStrFromWStr(var Dest: AnsiString; const Source: WideString);
begin
Dest:=AcroMultiUtils.UnicodeDecode(Source,936);
end;
procedure MyLStrFromPWChar(var Dest: AnsiString; Source: PWideChar);
begin
Dest:=AcroMultiUtils.UnicodeDecode(Source,936);
end;
function MyLoadResString(ResStringRec: PResStringRec): string;
var
WS:WideString;
nLen:integer;
begin
if ResStringRec = nil then Exit;
if ResStringRec.Identifier < 64*1024 then
begin
Setlength(WS,4096);
nLen:=LoadStringW(FindResourceHInstance(ResStringRec.Module^),
ResStringRec.Identifier, PWideChar(WS), Length(WS));
SetLength(WS,nLen);
end
else
WS:= PWideChar(ResStringRec.Identifier);
Result:=AcroMultiUtils.UnicodeDecode(WS,936);
Result:=AcroMultiResource.ResourceStorage.GetDisplayValue(Result);
end;
begin
Application.Initialize;
TrapAPI.TrapStorage.Trap('rtl70.bpl','@System@@LStrFromWStr$qqrr17System@AnsiStringx17System@WideString',@MyLStrFromWStr);
TrapAPI.TrapStorage.Trap('rtl70.bpl','@System@@LStrFromPWChar$qqrr17System@AnsiStringpb',@MyLStrFromPWChar);
// TrapAPI.TrapStorage.Trap('rtl70.bpl','@System@LoadResString$qqrp20System@TResStringRec',@MyLoadResString);
TrapAPI.TrapStorage.Trap(@System.LoadResString,@MyLoadResString);
Application.CreateForm(TFormChineseDDKey, FormChineseDDKey);
Application.Run;
end.
以上方法只能是你的程序用Runtime Package编译时才有效。如果你DFM使用的是繁体中文,把以上的936全部改950
------
江上何人初见月,江月何年初照人
編輯記錄
mustapha.wang 重新編輯於 2020-06-30 08:40:53, 註解 無‧
goat
高階會員


發表:53
回覆:130
積分:134
註冊:2002-06-03

發送簡訊給我
#55 引用回覆 回覆 發表時間:2008-05-08 17:33:04 IP:203.160.xxx.xxx 訂閱
王兄
原來這套軟體您持續都還有在開發!加油!
有個問提要請教您,網頁方面如果要做多國語言,在不重新轉寫程式碼的前提下,有沒有比較好的解決方案?
或是您這裡有什麼建議嗎?謝謝!

另外Delphi寫的COM 的元件有辦法支持嗎?
編輯記錄
goat 重新編輯於 2008-05-09 10:07:33, 註解 無‧
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#56 引用回覆 回覆 發表時間:2009-03-18 20:46:10 IP:124.76.xxx.xxx 訂閱
杨兄:自前年这个网站挂了一段时间后,好久就没来了。今天逛过来才看到你的帖子。
网站开发方面,不知道你用的是哪种技术?delphi自带的intraweb/internetSnap,还是asp/php。我们这套元件也许能扩展到intraweb/internetsnap开发方式上,也可能可以扩展到delphi for php开发上。
至于Com 元件,不明白你的意思,COM 不涉及UI啊?
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#57 引用回覆 回覆 發表時間:2020-06-30 08:49:33 IP:1.83.xxx.xxx 訂閱
哈哈,又十年没有来,这个网站还在,厉害,老delphier的情怀。
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#58 引用回覆 回覆 發表時間:2020-06-30 09:10:12 IP:1.83.xxx.xxx 訂閱
部分老同事和客户还在用delphi下的这套多语言元件:Acro Multi-Language Suite for Win32/64,偶尔按反馈在修改。
版本维护历史:
2020/5/16, 6.0.4
1、修改acroMultiResource.pas,在64bit下用uniGUI开发isapi时,可能出现的av错误。
2、修改acroMultiLib.pas,增加函数:MultiHook(AProc:TGetDDAndLCIDProc),即提供动态的DD和LCID,在uniGUI开发的后台,
需要根据前端browser设定的语言来动态改变,如:uniGUIApplication.UniSession.LanguageCountry。
3、增加acroCulture_Browser.pas,处理浏览器的语言Tag与LCID的映射关系。
-------------------------------------------------------------------------------------------------------------------------------
2019/11/1, 6.0.2
1、为了避免本元件使用到的第三方模组DDetours与用户使用的版本冲突,把DDetours的文件名加以前缀acro*.pas
-------------------------------------------------------------------------------------------------------------------------------
2019/3/16, 6.0.1
1、支持Delphi 10.3 rio版本
2、支持64bit
-------------------------------------------------------------------------------------------------------------------------------
2014/1/26, 5.1.15
1、TacroMultiCustomDD增加DDKeyCodePage属性,预设是1252(英文)。修正:当Form设计时使用非英文字串做DDKey时,如果字典中没有对应翻译条目,
当把DDKey转码成Ansi或Unicode时,需要指定使用哪个CodePage,否则可能出现乱码。
-------------------------------------------------------------------------------------------------------------------------------
2013/11/16, 5.1.15
1、支持DelphiXE5
-------------------------------------------------------------------------------------------------------------------------------
2013/01/13, 4.1.15
1、修正,在delphi xe3下TRadioGroup和TDBRadioGroup里面的项目没有翻译

2012/09/16, 4.1.15
1、修改MultiClass_dxbar.pas的Proc_TdxBarCustomCombo函数,如果设计时ItemIndex>0,翻译后可能ItemIndex=-1,就是预选项丢失。

2012/05/05, 4.1.15
-------------------------------------------------------------------------------------------------------------------------------
1、把acroMultiReplacer.pas的HookMM和UnHookMM函数在interface区段宣告,使有特殊需要的用户(如为了效率)可以调用;
2、TCustomMultiDD增加SaveToFile函数,可以把即时增加到Hash表中的字典保存到文件。

2012/01/29, 4.1.14
-------------------------------------------------------------------------------------------------------------------------------
1、修改,字典中的语言标识,从CodePage改为LCID。需要注意TacroMultiDDEvents的OnBeforeReplaceComponent等事件,
其参数不同了,需要重新产生,否则运行起来可能出现AV错误。
2、支持Delphi XE2(vcl,fmx,fmi三种框架)
3、DDManager增加从Excel文件汇入的功能。

2011/03/20, 4.0.13
-------------------------------------------------------------------------------------------------------------------------------
1、修正,在acroMultiLangDelphiIDE150.dpk中,不能翻译THistoryPropComboBox类的两个元件,否则,Delphi XE启动时,会出现AV错误。

2010/11/21, 4.0.12
-------------------------------------------------------------------------------------------------------------------------------
1、修改,acroMultiScreen的Hook方式,如果Build with RunTime Package,就使用另一种Hook方式,某些情况下可以大幅提高效率,并避免闪烁;
2、去掉一些编译时的无关紧要的warning提示;
3、修正,TComboBox.Sorted为true时,可能导致ItemIndex指向的字串不是翻译前的字串;
4、修正,TcxComboBox.Sorted为true时,可能导致Properties.Items里面的字串没有全部翻译,同时可能导致ItemIndex指向的字串不是翻译前的字串;
5、修改,MultiClassMethod_cxExtEditors.pas,增加注册TcxListBox和TcxCustomCheckComboBox的替换函数

2010/10/11, 4.0.11
-------------------------------------------------------------------------------------------------------------------------------
1、增加acroMultiLib.pas,封装了几个函数在里面
2、增加对Delphi XE的支持。
3、按命名惯例,把Acro改为acro
4、修正,在ocx元件中可能不能翻译资源字串的问题;
5、修正,当反复创建释放Form时,可能出现某些元件不会被翻译的问题;
6、修正DDManager,在cell中输入空白的DDKey后,离开该行,然后再也不能修改该行的DDKey,也不能取消,只能强制退出的问题。
7、为了尽量不引入不需要的元件,devexpress元件的支持函数分解到多个pas和dpk中。
8、增加了几个flash演示影片

2010/06/15, 4.0.10
-------------------------------------------------------------------------------------------------------------------------------
1、在IDataLocate接口增加DoBeforeReplaceComponent和DoAfterReplaceComponent函数,这样Class的ReplaceMethod就可以在替换
集合元件时触发事件,让用户有机会决定是否替换其中的子元件,如TdxBarManager
2、在TAcroMultiResourceRepository增加函数:
function GetDisplayValue(ADDKeyRec:PResourceStringRec):string;
function GetDisplayValueAnsi(ADDKeyRec:PResStringRec):ansistring;overload;
function GetDisplayValueUnicode(ADDKeyRec:PResStringRec):WideString;overload;
从原始ResourceString中获得翻译结果
3、在TMultiClassMethodStorage增加函数:
procedure RegisterClassMethod(AClass:TClass;AMethod:TMultiLanguageReplaceProc;
ABeginUpdateProc:TMultiLanguageBeginUpdateProc;
AEndUpdateProc:TMultiLanguageEndUpdateProc);overload;virtual;
在TAcroMultiScreen替换Form时,会调用每个元件注册的BeginUpdatePro和EndUpdateProc,这样可以很好的控制效率,
特别是cxTreeList/cxGrid元件,因为替换Column的Properties时也可能引起cxTreeList/cxGrid反复Repaint

2010/02/27, 4.0.9
-------------------------------------------------------------------------------------------------------------------------------
1、修正:在调用RegisterClassMethod注册替换函数时可能出现索引超界错误
2、修正:AcroMultiDBClassMethod.pas的注册函数没有更新,使得及时切换语言时,TDBGrid等元件不能切换语言
3、修正:把TAcroMultiStreamDD元件的元件编辑器3个菜单字串资源化,这样在IDE中就可以被AcroMultilangDelphiIDE140.dpk翻译
4、增加:每个元件的元件编辑器上增加版本显示菜单
5、修改,修改AcroMultilangDelphiIDE140.dpk,剔除一些不能翻译的元件和资源字串,避免IDE出现AV错误。

2009/10/31, 4.0.8
-------------------------------------------------------------------------------------------------------------------------------
1、在TAcroMultiDDStorage元件增加CollectionComponentDDKey函数,用来提取某个画面的DDKey列表。
2、在delphi2010启动时,增加元件logo显示

2009/09/05, 4.0.7.2147
-------------------------------------------------------------------------------------------------------------------------------
1、TAcroMultiResource增加对Twindows98的支持。
2、把Delphi标准的元件替换函数从AcroMultiClassMethod.pas分离到AcroDelphiClassMethod.pas
3、增加TAcroMultiDDKeyCatcher元件,用来在运行时把那些没有翻译的字串写到文件,
即提取DDKey来准备翻译。
4、增加AcroMultilangDelphiIDE120.dpk来翻译delphi IDE本身。安装后,在Desktop toolbar会有一个语言下来框来切换语言。
dpk本身包含了中文繁简体,英文语言,如果你有更好的翻译,可以把\DelphiIDELng\DelphiIDE.lng文件复制到delphi得bin目录下,
语言下拉框的语言数目由lng决定。

2009/08/05, 4.0.6.2146
-------------------------------------------------------------------------------------------------------------------------------
1、修正,在Windows2000系统,会出现“can`t hook!”错误。

2009/07/25, 4.0.5.2145
-------------------------------------------------------------------------------------------------------------------------------
1、修正,在Delphi2009编译后,如果在繁体或英文操作系统运行,会出现“can`t hook!”错误。
2、修改,DDManager编辑时都采用unicode,如果保存到ansi文件时才转换,从ansi文件读取时也转换。
不再采用编辑时把unicode转成ansi来处理的方式。

2009/04/26, 4.0.4.2144
-------------------------------------------------------------------------------------------------------------------------------
1、在TrapAPI.pas增加PatchAPI和UnPatchAPI这两个API Hook函数,它们是线程安全的,
TAcroMultiResourceStorage使用这两个函数来翻译ResourceString,修正多线程出现的AV错误;
2、修正即时翻译的一个bug,由于检查元件重复翻译的部分列表排序错误,即时切换语言后,
在翻译新创建的窗体时,其上的某些元件可能被判为已经翻译过儿不会被翻译。
3、修正DDManager,在从dfm/nfm抓取字串时,会漏掉相邻的一个字符串
4、Demo里面增加了一个拼图游戏和一个局域网五子棋游戏

2009/03/29, 4.0.4.2143
-------------------------------------------------------------------------------------------------------------------------------
1、TrapAPI.pas在Trap/UnTrap时增加CriticalSection保护,避免多线程时出现线程冲突;

2009/03/25, 4.0.4.2142
-------------------------------------------------------------------------------------------------------------------------------
1、修正TAcroMultiReplacer的UnReplaceComs设置被忽略的问题;
2、DDManager补上“工具”工具栏,即原来的“文件ansi/unicode繁简转化”、“数据库繁简体转化”

2009/02/21, 4.0.3.2141
-------------------------------------------------------------------------------------------------------------------------------
1、修正:即时切换语言时,对非TComponent元件查找旧的DDKey时可能找到错误的DDKey,
从而导致翻译错位
2、DDManager修正:字典文件从windows档案管理员拖入DDManager时,可能出现AV错误。

2009/02/14, 4.0.2.2140
-------------------------------------------------------------------------------------------------------------------------------
1、支持即时更换语言,不再需要重新建立Form才能切换语言
2、DDManager修正:错误提示“DDKey重复”;工具栏增加切换语言的列表框

2008/12/26, 4.0.1.2138
-------------------------------------------------------------------------------------------------------------------------------
1.增加支持到Delphi2009
2.DDManager用Delphi2009编译,全面支持unicode;提高新节点创建速度,重复原语检查速度。
使用TRibbon元件做工具栏。

2008/07/03, 3.5.2.2023
-------------------------------------------------------------------------------------------------------------------------------
1、TAcroMultiDD增加IsUnicode属性,让用户标记这个字典是否是unicode的,便于给tnt元件使用时,
如果发现是Ansi就可以转成Unicode;
2、IDataLocate接口增加两个函数以明确获得ansi和unicode
function GetDisplayValueAnsi(ADDKey,ACodePage,ASeqNo:string):string;
function GetDisplayValueUnicode(ADDKey,ACodePage,ASeqNo:string):WideString;
3、TAcroMultiDDStorage增加ReplacedObjectList来避免重复替换元件

2007/1/5, 3.5.1.1302
-------------------------------------------------------------------------------------------------------------------------------
1、修改了AcroMultiClassMethod.pas的一個筆誤,這導致註冊的元件的父子關係錯誤;
P:=Parent.Son;
while P<>nil do
begin
Next:=P.Brother;
if P.InheritsFrom(AClass) then //修改為if P.MLClass.InheritsFrom(AClass) then
begin

2006/11/07, 3.4.26.1258
-------------------------------------------------------------------------------------------------------------------------------
1、增加TAcroMultiDDEvents元件,讓用戶更精確知道哪些元件真正被替換了;
2、修改AcrMultiScree.pas的Acroprise_ShowWindow函數,訪問Screen.Forms[i].Handle時,
一定要檢查Screen.Forms[i].HandleAllocated,否則可能出現嚴重問題。

2006/10/29, 3.4.25.1145
-------------------------------------------------------------------------------------------------------------------------------
1.修改所有TCollectionItem的AssignTo函数错误,不能调用inherited;
2.修改TacroScreenEvents一个bug;
2.增加Unicode支持;

2006/10/28, 3.4.24.1087
-------------------------------------------------------------------------------------------------------------------------------
1.修改了某些元件的图标;
2.增加安装TAcroMultiScreenEvents元件,使用户能直观的设置多种Form的替换参数及处理事件;
3.增加安装TAcroMultiResourceEvents元件,使用户能直观的设置多种Library的替换参数及处理事件;

2006/10/25, 3.4.23.1023
-------------------------------------------------------------------------------------------------------------------------------
1.修改ScreenEye的方式,改爲Hook API:ShowWindow,
增加並建立全局元件
var
ScreenStorage:TAcroMultiScreenEye;
不再安裝TAcroMultiScreenEye元件;
TAcroMultiScreenEye.HookScreenEvent改成Hook
TAcroMultiScreenEye.UnHookScreenEvent改成UnHook

2006/10/20, 3.4.22.943
-------------------------------------------------------------------------------------------------------------------------------
1.TAcroMultiScreenEye在拦截Screen的OnActiveFormChanged事件的时候替换Screen.ActiveForm,
但在某些情况下(TdxBarManager),对文本替换可能产生很多别的动作,导致触发这个事件的环境改变,
事件后面的代码执行可能出现异常,因此使用了PostMessage以异步方式处理,让触发的事件先执行完毕,然后再替换。

2006/06/01, 3.4.21.928
-------------------------------------------------------------------------------------------------------------------------------
1.从AcroMultiDDReader.pas和AcroMultiDDWriter.pas提取DecodeDelphiDFMStr和EncodeDelphiDFMStr函数,
放到AcroMultiUtils.pas,供外部程序,如DDManager使用

2006/05/24, 3.4.20.912
-------------------------------------------------------------------------------------------------------------------------------
1.TAcroMultiFileDD在设置FileName后,按文件扩展名设置DDReaderID
2.TAcroMultiStreamDD设计期从文件载入资料时,也按文件扩展名设置DDReaderID
3.增加delphi2006的dpk

2004/11/04, 3.4.19.830
-------------------------------------------------------------------------------------------------------------------------------
1.不注册TCustomControl,因为dev express的cx系列元件从这里继承,
包括TcxEdit等,因此,降一级注册,注册TCustomPanel,TCustomGroupBox

2004/10/25, 3.4.18.721
-------------------------------------------------------------------------------------------------------------------------------
1.在TacroMultiReplacer、TAcroMultiScreenEye等出现
TmultiReplaceOption的地方增加UseOwnerOption布尔属性(预设为True),
使不必去设置每个元件的替换参数;
2.在TcustomMultiDD增加ImportFromReader,
在TacroMultiFileDD增加ImportFromFile等方法,
使DD元件在运行时可以合并多本字典。
对AcroMultiResourceStorage来说,
它只能指定一本字典来处理ResourceString,
当主程序写好后,插件里自己的ResourceString处理原来
必须把DD资料编辑在主程序的这本字典里,(1)不符合分离原则;
(2)如果主程序没有提供DD文件呢?
因此,现在可以在运行时再合并多本字典。

2003/05/28, 3.4.17.548
-------------------------------------------------------------------------------------------------------------------------------
1.欧阳的VM2要用,回头支持Delphi4了

2003/05/21, 3.4.16.532
-------------------------------------------------------------------------------------------------------------------------------
1.把字串常量全部移到AcroMultiConsts.pas,作为资源(ResourceString)
2.增加AcroMultiResource.pas单元,内有TAcroMultiResource元件,
它拦截系统API函数LoadStringA,在读取资源字串时转换文字。因此,只要
三方元件按照windows系统的资源规范,我们在不修改它的原码的情况下,也
可以把它的消息等文字转换掉。

2003/04/28, 3.3.15.373
-------------------------------------------------------------------------------------------------------------------------------
1.TMultiReplaeData改成TMultiReplaceDatum
TMultiReplaceDatas改成TMultiReplaceData
2.TAcroMultiFileDD的FileName支持相对路径(相对exe的路径),并写了属性编辑器

2003/02/27, 3.3.14.359
-------------------------------------------------------------------------------------------------------------------------------
1.AcroMultiFormInfo.pas改成AcroMultiScreen.pas
2.修改了TAcroMultiScreenEye的参数
3.TMultiReplaceOption增加了ReplaceSelf:Boolean属性,以决定是否替换此元件本身,
如我注册Panel1到ReplaceComs,但只想替换Panel1上面的元件,不想替换Panel1本身,就可以设ReplaceSelf:=false;ReplaceSon:=true;
4.TAcroMultiReplacer.OwnerOption类型改成了TMultiReplaceOption

2003/02/14, 3.3.13.346
-------------------------------------------------------------------------------------------------------------------------------
1.AcroDataRecalim.pas改成AcroMultiDDReader.pas
2.AcroDBDataReclaim.pas改成AcroMultiDBDDReader.pas
3.增加了AcroMultiDDWriter.pas
4.增加了AcroMultiDBDDWriter.pas
5.TAcroMultiDD改成TAcroMultiFileDD
6.TAcroMultiMemoDD改成TAcroMultiStreamDD
7.AcroDDList改成AcroDDStorage
8.AcroClassMethod改成AcroClassMethodStorage
9.增加TAcroMultiReaderDD,为TAcroMultiFileDD和TAcroMultiStreamDD的共同祖先,
为了能让用户增加自己的字典文件格式,去掉了DDFormat属性,
增加了DDReaderID:string属性,设计时属性编辑器会为TCustomMultiReaderDD的
DDReaderID属性列出全部注册了的字典读取元件的标识字符串,如果用户的元件是在
运行时才注册,属性编辑器就无法列出,用户可以直接输入。
10.重整了字典资料读取元件,用TTextDFMStreamDDReader来读AcroTextDFM格式;
用TTextCSVStreamDDReader来读AcroTextCSV格式;
(原来为将就TAcroTable元件输出的lng文件,因为它的字段名称为汉字,无法识别,
都看成DDKey,CodePage,SeqNo,DisplayValue,CatalogID名称和顺序,为了通用性,
现在不作此特殊处理,故如果用户使用原来TAcroTable输出的lng文件,请将字段名称
改成英文)
用TBinaryStreamDDReader来读AcroBinary格式
11.增加了全局元件AcroDDReaderStorage:TAcroMultiDDReaderStorage来管理读取字
典资料的元件TCustomStreamDDReader
12.设计时,属性编辑器列出了所有创建的TCustomMultiDD的DDName,方便为
TReplaceOption.DDName挑选,但不是一定要从列表选取,如果用户是在子系统,可能设计
时TCustomMultiDD还没有创建(如果TCustomMultiDD是放在资料模组,可能资料模组
还没打开),属性编辑器就无法列出,用户可以直接输入。
13.相应修改了Help

2003/02/10, 3.2.12.290
-------------------------------------------------------------------------------------------------------------------------------
1.把TAcroMultiMemoDD的Dictionary属性从TStringList改成了TMultiDictionary,
以支持二进制的DD文件,编辑器加了Save dictionary to file...
2.修改了Dictionary编辑器的Load from file...没有调用Designer.Modified错误
3.写了使用说明HowToUseMultiLang.htm
4.AcroMultiDBClassMethod.pas
把procedure Proc_TDataSet(ATable:IDataLocate;AComponent:TObject;
ACodePage,ASeqNo:string;AFont:TFont);加到interface部分了,但没注册,
如果要替换TDataSet,可以直接调用,如:

begin
Proc_TDataSet(AcroMultiDD1,Query1,'936','0',nil);
end;

2003/02/09, 3.2.11.270
-------------------------------------------------------------------------------------------------------------------------------
1.AcroMultiClassMethod.pas的
TMultiLanguageProc=procedure(ATable:IDataLocate;AComponent:TObject;ACodePage,ASeqNo:string;AFont:TFont);
增加了AFont参数
全局元件ClassMethod改成了AcroClassMethod
2.AcroMultiDBClassMethod.pas没有注册TDataSet的替换方法了
3.修改了TMultiClassMethodList在UnRegisterClassMethod时的一个错误
4.增加了Delphi7的dpk

2003/01/28, 3.2.10.263
-------------------------------------------------------------------------------------------------------------------------------
1.主要修改了TAcroMsgBox,加了
function GetDisplayValue(ADDKey:string;ASeqNo:string='0'):string;
procedure ShowMessage2(AMsg:string;const Args: array of const;
ASeqNo:string='0');
function MessageBox2(hWnd:HWND;lpText,lpCaption:PChar;uType:Cardinal;
const Args: array of const;ASeqNo:string='0'):integer;
function MessageDlg2(const Msg:string;DlgType:TMsgDlgType;
Buttons:TMsgDlgButtons;HelpCtx:Longint;const Args: array of const;
ASeqNo:string='0'):integer;
_________________________________
说明:
1.属性还是只有DDName和CodePage,因为它们比较固定,对不同的DDName和CodePage可
以放多个TAcroMsgBox元件,但对一个系统,他的DDName可能就是MessageDD了,
CodePage也不过2-3个,而SeqNo的变化比较多,
如果SeqNo不放在procedure里做参数,也放到属性里,那从1到10你要放10个TAcroMsgBox,
还是要这样调用,
AcroMsgBox1.SeqNo:='5';
AcroMsgBox1.ShowMessage('wwwwwww');
那SeqNo属性还有何意义呢?

一般的系统,应该有全局变数
var
DefaultCodePage:string;
DefaultSeqNo:string;
来记录系统的预设值(它们来只自Registry或ini),需要使用这些值时,是在这里来读,
不应该到TAcroMsgBox或TAcroMultiReplacer去找(当然,规则是自定的,他认为那个
地方找到值是对的,就行),特别是Package组装的系统,那更应该有此全局变数。
用户调用:
AcroMsgBox1.ShowMessage('wwwwwwwww',DefaultSeqNo);
AcroMsgBox1.ShowMessage('rrrrrrrrr','12');

2.DD元件注重通用,不想支援特定系统的做法,如eMax 1.0原来的
procedure ShowMessage(MsgID : string; aParam : TStringList);overload;
目的是处理格式化的消息,如'File [@@] at [@@] not found!'
它是用[@@]来作为参数的标记,那我们为何不用标准的Format格式呢?
'File %s at %s not found!'
本元件的ShowMessage2,MessageDlg2,MessageBox2就是支援此标准格式的,
没有用overload,暗地里因为VM不支持,如果用overload,为了使用它,再写个代理procedure,
别人会觉得奇怪;
ShowMessage,MessageDlg,MessageBox的参数也是比照标准的方法的参数,我认为旧系统的
某些地方还是改过比较好,扭曲地兼容,会使新系统臃肿和混乱。

2003/01/27, 3.2.9.259
-------------------------------------------------------------------------------------------------------------------------------
1.修改了DD资料没有Catelog栏位时的错误
2.为TAcroMultiMemoDD加了两个元件编辑菜单
Edit dictionary...
Load dictionary from file...
Delphi的TStrings属性编辑器有时打开DD资料会报RichEdit的错误,
可以在外面编辑好字典内容,用Load dictionary from file载入
3.纠正了TAcroMultiReplacer没有调用OnBeforeReplace事件的错误

2003/01/26, 3.2.8.250
-------------------------------------------------------------------------------------------------------------------------------
1.把TAcroMultiReplacer的CodePage,DDName属性移到TMultiReplaceOption,
也就是与SeqNo一样,每个要替换的元件都要设置,这样,一个TAcroMultiReplacer
就可以解决所有元件的问题;由于有ReplaceOwned/ReplaceSon属性,因此,
一般用户注册到ReplaceComs的元件不会很多;
2.新增了AcroMultiFormInfo.pas
加入了TAcroMultiScreenEye元件,它监视Screen.OnActiveFormChange事件,如果
Screen.ActiveForm没有替换,也没有放TAcroMultiReplacer,就替换,如果FormReplaceDatas
有替换信息就用,没有就用预设的DefaultReplaceOption;
元件的注册都是用元件名称,这样就不用引用DD的单元,可以与DD完全隔离。
TMultiReplaceInfo的ComName为Self时,表示替换所有TMultiFormReplaceData.FormClassName
指定的Form类别的实例,不管它的名称为何;
用户要自己调用HookScreenEvent方法来监视Screen.OnActiveFormChange,
并在退出时调用UnHookScreenEvent来脱钩。
3.新增了TAcroMultiMemoDD元件,
它的字典资料从Dictionary:TStrings属性来,可以用来处理Package内的Form在设计时的多语言,
因为如果用FileName,不好确定文件放在何处。
4.全域元件DDList改成了AcroDDList

2003/01/23, 3.2.7.242
-------------------------------------------------------------------------------------------------------------------------------
1.增加了TMultiReplaceOption类别,来管理替换的参数
FSeqNo:string;
FFont:TFont; //替换的字体
FReplaceOwned:Boolean;
FReplaceSon:Boolean;
FReplaceFont:Boolean; //是否替换字体
2.去掉了AcroMultiClassMethod.pas和AcroMultiDBClassMethod
的implementation上的Proc_*****方法定义,原来是为了方便查看,
但可能觉得Global Procedure太多,比较乱,故删了
3.统一名称,AcroMultiClassMethod.pas的Global function ChangeLanguage
改成了GetDisplayValue,三方元件的Proc_****注意要做修改。
4.publish了TAcroMultiDBDD的UseDefaultFields和FieldsOption

2003/01/22, 3.2.6.212
-------------------------------------------------------------------------------------------------------------------------------
1.重新注册了Vcl60里的类别,具体看幻灯片classes.ppt
TControl的protected部分就有了Caption属性,但没有只注册TControl,
因为TTabSheet和TToolButton,虽然他们必须在PageControl和TToolBar上,不能单独存在,
但他们的owner是Form,它们是"游离"的,我们从PageControl和TToolBar来访问他们,避免
从Form二次访问到他们,而且方便把PageControl和TToolBar加入到TAcroReplacer.UnReplaceComs;
同样,没有注册TAction,TMenuItem;
因为TEdit和TMemo是接受用户输入的,没有注册
2.在TMultiClassMethodList加了procedure DumpToTree(ATree:TCustomTreeView);virtual;
可以把注册的元件类别写到一棵树来观看到底注册了哪些类别
3.TMultiClassMethodList增加了
procedure UnRegisterClassMethod(AClass:TClass);virtual;
用来卸载一个类别的替换方法,如果替换方法是在plug in的Package里注册,package卸载时,
应该同时卸载这些方法

2003/01/20, 3.2.5.201
-------------------------------------------------------------------------------------------------------------------------------
修改:
-------------------
1.重整了TCustomDataReclaim等元件结构层次
2.加了TBinaryFileDataReclaim,一种Binary格式文件,使FormDD的载入时间从0.6秒降到0.15秒;
对应类型改为TAcroMultiDDFileFormat=(dfTextDFM,dfTextCSV,dfBinary);
3.TCustomMultiDD加了FieldsOption属性,来对应DDKey,CodePage,SeqNo,DisplayValue栏位;
加了UseDefaultFields属性,如果为true,就是标准的那几个栏位名称;
加了onBeforeBuildDD和onBuildingDD事件
4.TAcroMultiReplacer,因为别人可能不用DDKey CodePage SeqNo组成一个Key;而只有DDKey;而且CodePage,SeqNo的区分也可能不是integer,
故把CodePage和SeqNo参数,由integer改成了string;
加了onBeforeReplace事件
5.AcroDataDump.pas改成了AcroDBDataReclaim.pas
6.Proc_TDataSet等procedure从AcroMultiDBDD移到AcroMultiDBClassMethod.pas

使用:
------------------
1.由于CodePage和seqNo改成了string,原来的dfm可能打不开,可以先用NodePAD打开dfm文件,
把它们先改成string;
它们的初值都为空,拉下TAcroMultiReplacer元件后,记得按需要赋值
2.如何获得Binary格式的DD文件?
调用AcroDataReclaim.pas的_SaveDataToBinaryFile方法,如:
procedure TFormMain.ToolButton4Click(Sender: TObject);
var
ADR:TDBDataReclaim;
begin
ADOQuery1.Open;
ADR:=TDBDataReclaim.Create(ADOQuery1);
_SaveDataToBinaryFile(ADR,'D:\DD\FormDD.bdd');
ADOQuery1.Close;
end;
注意:用ADO时,连接参数的autotranslate最好设为false;由于eMAXSYSTEMDB的FormDD表的
DisplayValue栏位为char,ADO读出会有空格,建议把栏位类型改成varchar,
并用update FORMDD set DisplayValue=rtrim(DisplayValue)语句修改资料
3.在使用Binary格式文件时,TAcroMultiDD的DDFormat设为dfBinary
4.要换TDBGrid,TQuery等,请引用AcroMultiDBClassMethod.pas
5.TAcroMultiReplacer替换的时机是Loaded方法,故要设置它的CodePage,SeqNo等属性时可以
在Form的Loaded方法前,如
procedure TForm1.Loaded;
begin
AcroMultiDD.DDFormat:=dfBinary;
AcroMultiDD.FileName:='D:\DD\FormDD.bdd';
AcroMultiReplacer1.CodePage:=GetAcp;
inherited;
end;
或者在TAcroMultiDD的onBeforeBuildDD事件,如:
procedure TForm1.AcroMultiDD1BeforeBuildDD(Sender:TObject);
begin
AcroMultiDD.DDFormat:=dfBinary;
AcroMultiDD.FileName:='D:\DD\FormDD.bdd';
AcroMultiReplacer1.CodePage:=GetAcp;
end;
在TAcroMultiReplacer的onBeforeReplacer事件,如:
procedure TForm1.AcroMultiReplacer1BeforeReplace(Sender:TObject);
begin
AcroMultiDD.DDFormat:=dfBinary;
AcroMultiDD.FileName:='D:\DD\FormDD.bdd';
AcroMultiReplacer1.CodePage:=GetAcp;
end;
那为什么TAcroMultiReplacer的替换时机要在Loaded呢?而不Hook到Form的OnCreate,
OnForm之类的事件呢?因为多次Hook事件后,在UnHook时最后可能不能正确恢复事件的原貌,如
var
Old:TNotifyEvent;
procedure TCom.MyCreate(Sender:TObject);
begin
if Assigned(Old) then Old(Sender);
....Replace Lanaguage....
end;
procedure TCom.Hook;
begin
Old:=Form1.OnCreate;
Form1.OnCreate:=ACreate;
end;
procedure TCom.UnHook;
begin
Form1.OnCreate:=Old;
Old:=nil;
end;
如果A元件Hook了Form1的OnCreate,把Form1原来的事件保存在A.Old,
B元件又来Hook了Form1的OnCreate,就把A.MyCreate保存到了B.Old,
如果B先UnHook,A再UnHook,没问题,最后Form1的OnCreate还是它原来的,
但如果A先UnHook,B再UnHook呢?最后Form1.OnCreate就是A.MyCreate。
因此,Hook/UnHook的顺序必须按堆栈的方式来进行,先进后出,
但Delphi并没有这样一个机制来让大家遵守。
6.如何只载入某个CodePage的资料?
在TAcroMultiDD的onBuildingDD事件,如:
procedure TForm1.AcroMultiDD1BuildingDD(Sender: TObject; ADDKey,
ACodePage, ASeqNo: String; var Accept: Boolean);
begin
Accept:=ACodePage='950';
end;

2002/12/31, 3.1.4.187
-------------------------------------------------------------------------------------------------------------------------------
1.把单元,元件改成Acro打头
2.加了TAcroMsgBox
3.TDataReclaim和TFileDataReclaim的资料不用Variant,用string,FormDD载入时间降到0.642s

2002/12/27, 3.1.3.167
-------------------------------------------------------------------------------------------------------------------------------
1. 增加了类别
TFileDataReclaim=class(TInterfacedObject,IDataLink)
帮助一边解析DD文件,一边放入HashList,不必像TDataReclaim那样先暂存起来,
TMultiDD的LoadFromFile2和LoadFromAcroTableFile2使用了此方式,效率可提高13%,如FormDD.lng文件,从1.250s到1.082s
2.在IDataLink接口正增加了
function _FieldsOrderIsStandard:Boolean;
用来返回DD文件的字段是否是标准的顺序:
DDKey,CodePage,SeqNo,DisplayValue,CatalogID
如果是,在填入HashTable时,就用index来访问每个字段,比用字段名称快17%,如FormDD.lng,从1.082s到0.902s

用LoadFromAcroTableFile2比原来用LoadFromAcroTableFile整体效率提高28%
3.TCustomMultiDD的
procedure BuildHashTable(const ADataLink:IDataLink);virtual;
从protected移到Public
增加了组合翻译函数
function GetDisplayValueWordByWord(ADDKey:string;ACodePage,ASeqNo:integer):string;virtual;

2002/12/23, 3.0.2.154
-------------------------------------------------------------------------------------------------------------------------------
1.TMultiDD增加了DDFormat属性,指出FileName属性指向的文件的格式,如果是AcroTable的lng文件,用dfCSV值
2.修改了MultiClassMethod.pas的procedure Proc_TCustomTreeView
因为TTreeView.Items.Count包含了所有的节点,因此不必逐层去找

2002/06/06, 3.0.1.142
-------------------------------------------------------------------------------------------------------------------------------
1.TCustomMultiDD(TComponent,IDataLocate)
(1).procedure ReplaceLanguage(AReplacer:TMultiReplacer);
按AReplacer的内容替换
(2).procedure ReplaceComLanguage(ACom:TObject;ACodePage,ASeqNo:integer;ReplaceOwned,ReplaceSon:Boolean);
替换一个元件
(3).function GetDisplayValue(ADDKey:string;ACodePage,ASeqNo:integer):string;virtual;
获得一个字串的翻译字串
2.TMultiDD(TCustomMultiDD)
从文本文件读取DD资料,建立Hash表, 支持两种DD资料格式,分别为
(1).procedure LoadFromFile(const AFile:string;const SplitChar:Char=',';const QuoteChar:Char='"');
预设方法,如果Hash表还没建立,根据FileName用此方法建立
(2).procedure LoadFromAcroTableFile(const AFile:string);
如AcroTable输出的lng文件
(3).DDName:string
每本资料字典的唯一名称,TCustomMultiDD元件在创建时向
DDList:TMultiDDList元件注册,保证资料字典的唯一性
(4).FileName:string
DD资料文件,注意格式,自动创建是用LoadFromFile方法,
用AcroTable的lng文件,这样写:
with TMultiDD.Create(nil) do
begin
DDName:='FormDD';
LoadFromAcroTableFile('O:\DDTransferTable\FormDD.lng');
end;

3.TMultiDBDD(TCustomMultiDD)
从DataSet元件读取DD资料,建立Hash表
4.TMultiReplacer(TComponent)
(1).AutoReplace:Boolean;
是否在元件Loaded後替换
(2).CodePage:integer
(3).DDName:string
使用哪本资料字典
(4).OwnerOption.Replace:Boolean
是否替换TMultiReplacer元件的Owner
(5).OwnerOption.ReplaceOwned:Boolean
是否替换TMultiReplacer元件的Owner的所有Owned元件(Owner)
(6).OwnerOption.ReplaceSon:Boolean
是否替换TMultiReplacer元件的Owner的所有子元件(Parent)
(7).ReplaceComs:TReplaceComs
注册要替换的元件
(8).UnReplaceComs:TUnReplaceComs
注册不替换的元件
5.TMultiDDList(TObject)
有全局元件DDList
(1).function NewDD(ADDName:string;ADDFile:string):TCustomMultiDD;
新建一本DD,用LoadFrom方法
(2).function FindDD(ADDName:string):TCustomMultiDD;
按名称查找DD
(3).procedure DeleteDD(ADDName:string);
(4).procedure ClearDD;
(5).procedure ReplaceComLanguage(ADDName:string;ACom:TObject;ACodePage,ASeqNo:integer;ReplaceOwned,ReplaceSon:Boolean);
用ADDName字典替换元件
(6).function GetDisplayValue(ADDName,ADDKey:string;ACodePage,ASeqNo:integer):string;
在ADDName字典查找ADDKey的翻译字串
------
江上何人初见月,江月何年初照人
[<<] [1] [2] [>>]
系統時間:2024-04-30 4:41:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!