2016-01-28 77 views
2

在我的系統上,主菜單是完全動態的,是從數據庫中的數據建立的。TMainMenu生成菜單項動態

我有一個特定的情況,一些菜單項需要在顯示之前組裝。

讓我們假設我的菜單有以下主要項目:

文件 - 客戶 - 報告 - 關於

當我報告單擊菜單項必須組裝項目,他們是前顯示。

我做了TMainMenu,TMenu和TMenuItem類中的代碼分析。不幸的是我還沒有找到解決這個問題的簡單方法。

存在一種在顯示之前創建這些項目的方法嗎?

+0

可能您將不得不將您的TMainMenu替換爲其他實現。像TActionMainMenuBar或SpTBXLib中的菜單一樣。 – Torbins

回答

6

有一個技巧,你可以使用。您需要在報告下添加一個虛擬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; 
+0

除了隱藏物品之外,您還可以將此邏輯添加更高一級,所以點擊*客戶*即可。但是您的解決方案更好,因爲如果您需要另一個子菜單而不是報告,它不會重新生成該項目。 – GolezTrol

+0

@GolezTrol如果我理解正確報告是主菜單的項目,而不是客戶。如果它是客戶中的項目,那麼您的邏輯也可以應用。 –

+0

啊,我沒有那樣解釋,但是再讀一遍,我認爲你是對的。那麼,這仍然使你的答案是一個很好的答案。 – GolezTrol

0

允許假設你有一個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;