2009-02-16 69 views
3

我有一個彈出菜單,我希望其中一個項目打開一個帶有動態創建列表的子菜單(它是用戶定義的標誌列表)。下面是我如何創建菜單項(FlagAs是菜單項我要附加的子菜單):在Delphi中動態創建一個子菜單

lNewMenuItems: array[0..flagCount] of tMenuItem; 

for I := 0 to flagCount do 
begin 
    { Create a new menu item } 
    lNewMenuItems[I] := tMenuItem.Create(FlagAs); 
    lNewMenuItems[I].Caption := FlagNames[I]; 
    lNewMenuItems[I].Tag := I; { Tag with the flag number } 
    lNewMenuItems[I].OnClick := miFlagClick; 
end; 

FlagAs.Add(lNewMenuItems); 

miFlagClick處理程序只是切換其發送者的檢查狀況:

procedure TMyForm.miFlagClick(Sender: TObject); 
begin 
    (Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked; 
end; 

這些項目完美添加,但當我點擊它們時,它們不會被檢查。事件處理程序被稱爲編輯:發件人是正確的菜單項,但下次打開菜單時不會出現複選標記。

我在做什麼錯?還是我以錯誤的方式去了解菜單創建? (注意:flagCount在將來可能會改變,但在代碼中被定義爲一個常量)

編輯:上面沒有實際工作 - 見下文

回答

4

我的答案我試着德爾福2009年,它的下面工作得很好:

procedure TForm5.FormCreate(Sender: TObject); 
var 
    i : Integer; 
    mis : array[0..3] of TMenuItem; 
begin 
    for i := 0 to 3 do begin 
    mis[i] := tMenuItem.Create(SubMenu); 
    NewMenu(mis[i]); 
    end; 
    SubMenu.Add(mis); 
end; 

procedure TForm5.NewMenu(var mi: TMenuItem); 
begin 
    mi.Caption := 'Test'; 
    mi.OnClick := TestClick; 
end; 

procedure TForm5.TestClick(Sender: TObject); 
begin 
(Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked; 
end; 
+0

我正在使用德爾福2007年,但(作爲我的回答下面)這是我的錯誤在代碼中的其他地方。對不起,浪費你的時間。 – 2009-02-16 11:47:51

+1

幫助他人絕不是浪費時間。 – 2009-02-16 11:50:39

0

這是我的錯 - 我的代碼另一位被修改Checked狀態,我已經忘記了。我現在感到很蠢。對不起浪費時間...

0

你可能有一個附加到FlagAs的事件處理程序,它會清除您選中的標誌嗎?

2

只是一個在旁邊(我知道你已經找到了原因)

你爲什麼要使用lNewMenuItems:數組tMenuItem的[0..flagCount]而不是使用一個單一的變量?

此外,是否有沒有使用AutoCheck屬性的原因?

var 
    NewMenuItem: TMenuItem; 
    I : Integer; 
    begin 
    for I := 0 to flagCount do 
    begin 
     { Create a new menu item } 
     NewMenuItem := TMenuItem.Create(FlagAs); 
     NewMenuItem.Caption := FlagNames[I]; 
     NewMenuItem.Tag := I; { Tag with the flag number } 
     // NewMenuItem.OnClick := miFlagClick; 
     NewMenuItem.AutoCheck := True; 
     FlagAs.Add(NewMenuItem); 
    end; 
    end;