在我的系統上,主菜單是完全動態的,是從數據庫中的數據建立的。TMainMenu生成菜單項動態
我有一個特定的情況,一些菜單項需要在顯示之前組裝。
讓我們假設我的菜單有以下主要項目:
文件 - 客戶 - 報告 - 關於
當我報告單擊菜單項必須組裝項目,他們是前顯示。
我做了TMainMenu,TMenu和TMenuItem類中的代碼分析。不幸的是我還沒有找到解決這個問題的簡單方法。
存在一種在顯示之前創建這些項目的方法嗎?
在我的系統上,主菜單是完全動態的,是從數據庫中的數據建立的。TMainMenu生成菜單項動態
我有一個特定的情況,一些菜單項需要在顯示之前組裝。
讓我們假設我的菜單有以下主要項目:
文件 - 客戶 - 報告 - 關於
當我報告單擊菜單項必須組裝項目,他們是前顯示。
我做了TMainMenu,TMenu和TMenuItem類中的代碼分析。不幸的是我還沒有找到解決這個問題的簡單方法。
存在一種在顯示之前創建這些項目的方法嗎?
有一個技巧,你可以使用。您需要在報告下添加一個虛擬TMenuItem
,並將其Visible
屬性設置爲False
。然後將OnClick
事件添加到報告 item並在那裏執行您的填充邏輯。在添加新物品之前,您必須刪除現有的物品,但是您應該保留完整的虛擬物品。
喜歡的東西:
procedure TForm1.ReportItemClick(Sender: TObject);
var
Item: TMenuItem;
I: Integer;
begin
// Delete all items but first - dummy - one
for I := ReportItem.Count - 1 downto 1 do
ReportItem.Items[I].Free;
Item := TMenuItem.Create(ReportItem);
Item.Caption := 'abc';
// Item.OnClick := ...
// or
// Item.Action := ...
ReportItem.Add(Item);
Item := TMenuItem.Create(ReportItem);
Item.Caption := '123';
// Item.OnClick := ...
// or
// Item.Action := ...
ReportItem.Add(Item);
end;
允許假設你有一個DS(TDataSet的)如何加載所有的數據報告。在您放下報告菜單的那一刻,您可以調用UpdateMenuReport。
type
TMenuArray = array of TMenuItem;
var MyMenu: TMenuArray;
procedure TMain.MyClickPopupMenu(Sender: TObject);
begin
case TMenuItem(TMenuItem(Sender).Parent).Tag of
// do Something
end;
end;
procedure TMain.UpdateMenuReport;
procedure InitMyMenu(var AMenu: TMenuArray);
var i: Integer;
begin
if Length(AMenu)>0 then for i:= 0 to Length(AMenu)-1 do AMenu[i].Free;
SetLength(AMenu, 0);
end;
var j, i: integer;
begin
InitMyMenu(MyMenu);
Reports.Clear;
if DS.Active and (DS.RecordCount > 0) then
begin
SetLength(MyMenu, DS.RecordCount);
for i:= 0 to DS.RecordCount-1 do
begin
MyMenu[i] := TMenuItem.Create(Self);
MyMenu[i].Name := 'Reports_'+ IntToStr(i);
MyMenu[i].Caption := DS.FieldByname('NOM_REPORT').AsString;
MyMenu[i].Tag := DS.FieldByname('ID').AsInteger;
MyMenu[i].OnClick := MyClickPopupMenu;
end;
end;
end;
可能您將不得不將您的TMainMenu替換爲其他實現。像TActionMainMenuBar或SpTBXLib中的菜單一樣。 – Torbins