現代應用程式普遍具備「最近開啟檔案」功能,讓使用者能快速存取先前使用過的文件。這項技術早已成為擁有檔案選單之應用程式的標準配備,如 WPS 與 Office 系列。在 DOS 年代,程式設計師通常透過建立文字檔記錄檔案清單;但在 Windows 環境下,利用登錄機制則是更優雅的解決方案。本文將示範如何運用 C++ Builder 5.0 的 TRegistry 類別,在登錄中實作歷史檔案列表功能。
首先建立新專案 Project1,在 Form1 上放置以下元件:
TOpenDialog,名稱為 OpenDialog1TMainMenu,名稱為 MainMenu1在 MainMenu1 中新增選單項目,屬性設定為:Name: Items1、Caption: 開啟檔案。
private:
TRegistry *Registry;
String Items[3]; // 儲存歷史檔案路徑的陣列
int ItemsCount;
void __fastcall Display(); // 更新選單顯示
void __fastcall TForm1::Items1Click(TObject *Sender)
{
String TempFile, Files;
OpenDialog1->Filter = "All Files(*.*)|*.*";
if (OpenDialog1->Execute())
{
Files = OpenDialog1->FileName; // 取得完整檔案路徑
for (int i = 0; i < 3; i++)
TempFile = Items[0];
if (ItemsCount < 3)
ItemsCount++;
for (int i = ItemsCount - 1; i > 0; i--)
Items[i] = Items[i - 1]; // 將舊紀錄往後推
Items[0] = Files; // 最新開啟的檔案置於最前
}
Display();
}
void __fastcall TForm1::Display()
{
TMenuItem *NewItem;
// 移除現有的歷史檔案選單項 (保留前兩個固定項目)
while (MainMenu1->Items->Items[MainMenu1->Items->Count - 1]->Count > 2)
{
MainMenu1->Items->Items[MainMenu1->Items->Count - 1]->
Delete(MainMenu1->Items->Items[MainMenu1->Items->Count - 1]->Count - 1);
}
// 重建歷史檔案列表
for (int i = 0; i < ItemsCount; i++)
{
NewItem = new TMenuItem(MainMenu1);
NewItem->Caption = Items[i];
MainMenu1->Items->Items[MainMenu1->Items->Count - 1]->
Insert(MainMenu1->Items->Items[MainMenu1->Items->Count - 1]->Count, NewItem);
}
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
Registry = new TRegistry;
ItemsCount = 0;
Registry->RootKey = HKEY_LOCAL_MACHINE;
// 開啟或建立登錄機碼
Registry->OpenKey("SOFTWARE\\MYCOMPANY\\Remember", TRUE);
Items[0] = Registry->ReadString("Item1");
ItemsCount++;
Items[1] = Registry->ReadString("Item2");
ItemsCount++;
Items[2] = Registry->ReadString("Item3");
ItemsCount++;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (ItemsCount < 3)
for (int i = ItemsCount + 1; i <= 3; i++)
Items[i] = "";
Registry->WriteString("Item1", Items[0]);
Registry->WriteString("Item2", Items[1]);
Registry->WriteString("Item3", Items[2]);
}
程式已在 Windows 98 與 C++ Builder 5.0 環境下測試通過。同樣的 TRegistry 技術也常用於自動儲存視窗大小、記住使用者密碼等功能,有興趣的讀者不妨自行嘗試。