C++ Builder(BCB)的 IDE 本身就是一個巨大的 VCL 應用程式,透過 ToolsAPI 即可在設計階段存取並修改 IDE 的元件、選單、編輯器等物件。本文示範如何撰寫一個設計時套件,動態列舉主選單項目、匯出至 INI 檔、並載入中文化字串替換原始英文標題,達到 IDE 介面中文化的效果。
.bpl),非一般執行檔。Register() 函數,IDE 載入套件時自動呼叫。BorlandIDEServices->QueryInterface(__uuidof(INTAServices), ...) 取得 _di_INTAServices 介面,進而存取 MainMenu、ComponentCount 等 IDE 內部物件。void __fastcall EnumerateMenuItem(TMenuItem* MenuItem)
{
DoMenuItem(MenuItem); // 處理單一項目
for (int i = 0; i < MenuItem->Count; ++i)
EnumerateMenuItem(MenuItem->Items[i]); // 遞迴處理子項目
}
DoMenuItem 可選擇將可見屬性設為 true、將 Name 與 Caption 寫入 INI(NeedWriteToIni 旗標控制)。
void __fastcall LocalizeAppMenu()
{
_di_INTAServices IDE;
if (SUCCEEDED(BorlandIDEServices->QueryInterface(__uuidof(INTAServices), (void**)&IDE))) {
TComponent* AppBuilder = IDE->MainMenu->Owner; // IDE 主表單
TStringList *sections = new TStringList, *idents = new TStringList;
try {
chsini->ReadSections(sections);
for (int s = 0; s < sections->Count; ++s) {
chsini->ReadSection(sections->Strings[s], idents);
for (int i = 0; i < idents->Count; ++i) {
AnsiString val = chsini->ReadString(sections->Strings[s], idents->Strings[i], "NULL");
if (val != "NULL") {
TMenuItem* mi = dynamic_cast<TMenuItem*>(AppBuilder->FindComponent(idents->Strings[i]));
if (mi) mi->Caption = val; // 直接替換標題
}
}
}
} __finally { delete idents; delete sections; }
}
}
TIniFile 物件指向專案目錄下的 .ini(原始備份)與 CHS.ini(中文化資料)。NeedLocalize 為真,呼叫 LocalizeAppMenu() 套用中文化。INTAServices,透過 AppBuilder->ComponentCount 尋找 TMainMenu。NeedWriteToIni 決定是否匯出原始標題至 INI。[FileMenu]
FileMenu=檔案(&F)
FileNewItem=新增(&N)...
FileOpenItem=開啟舊檔(&O)...
FileSaveItem=儲存(&S)
...
[EditMenu]
EditMenu=編輯(&E)
EditUndoItem=復原(&U)
EditCopyItem=複製(&C)
...
[ProjectMenu]
ProjectMenu=專案(&P)
ProjectCompileItem=編譯(&C)
ProjectBuildItem=建置(&B)
...
格式為 [選單名稱] 區段,鍵值對應元件 Name 與中文 Caption。分隔線項目以 - 表示。
.bpl 需放入 IDE Bin 目錄或透過 Component | Install Packages 載入。掌握 ToolsAPI 後,可進一步實作:
透過 ToolsAPI 操作 IDE 物件模型,開發者能將 BCB 打造為符合團隊習慣的專屬開發環境。中文化選單只是冰山一角,更多客製化潛力等待發掘。