範例展示掃描指定資料夾下的 .txt 檔案,動態建立 TPopupMenu 項目,並共用同一個 OnClick 事件處理函數,點選後在 TRichEdit 顯示檔案內容。
private:
POINT MousePos; // 儲存滑鼠位置
int PopCount; // 選單項目數
void __fastcall MyClick(TObject *Sender); // 共用點擊事件
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 清除舊選單項目
for (int i = PopCount - 1; i >= 0; i--)
PopupMenu1->Items->Delete(i);
TSearchRec Sr;
TMenuItem *NewItem;
GetCursorPos(&MousePos); // 取得目前滑鼠位置
if (FindFirst("C:\\Program Files\\3LTyping\\data\\*.txt", 0, Sr) == 0) {
do {
NewItem = new TMenuItem(PopupMenu1);
int len = Sr.Name.Length();
Sr.Name.SetLength(len - 4); // 移除 .txt
NewItem->Caption = Sr.Name;
PopupMenu1->Items->Add(NewItem);
NewItem->OnClick = MyClick; // 指定共用事件
} while (FindNext(Sr) == 0);
FindClose(Sr);
}
PopCount = PopupMenu1->Items->Count;
PopupMenu1->Popup(MousePos.x, MousePos.y); // 在滑鼠處彈出
}
void __fastcall TForm1::MyClick(TObject *Sender)
{
Form1->Caption = ((TMenuItem*)Sender)->Caption;
RichEdit1->PlainText = true;
RichEdit1->Lines->LoadFromFile(
"C:\\Program Files\\3LTyping\\data\\" +
((TMenuItem*)Sender)->Caption + ".txt");
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
PopCount = 0;
}
TMenuItem 時指定 Owner (如 PopupMenu1),由 Owner 負責釋放記憶體。Sender 參數判斷來源。MainMenu 等其他選單元件。