2009-02-16 4 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; 

Элементы добавляются отлично, но они не проверяются, когда я нажимаю на них. Обработчик события вызывается EDIT: и Sender - правильный элемент меню, но галочка не появляется в следующий раз, когда я открываю меню.

Что я делаю неправильно? Или я собираюсь создать меню неправильно? (Примечание flagCount может измениться в будущем, но определяется как константы в коде)

EDIT: выше на самом деле работает - см мой ответ ниже

ответ

4

Я попытался следующие в Delphi 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

Я использовал Delphi 2007, но (как мой ответ ниже) это была моя ошибка где-то еще в коде. Жаль тратить свое время. –

+1

Помощь другим никогда не пустая трата времени. –

0

Это была моя ошибка - еще немного мой код был модифицирования Checked статуса, который я забыл о. Теперь я чувствую себя глупо. Извините за пустую трату времени ...

+0

Lol, не проблема, его понедельник ;-). –

0

Возможно, у вас есть привязка к флагам, которая очищает ваши флажки?

2

Просто в сторону (я знаю, что вы нашли причину)

Почему вы используете lNewMenuItems: массив [0..flagCount] из TMENUITEM; вместо использования одной переменной?

Также есть причина, по которой не используется свойство 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;