Страница 1 из 1

Создание нового меню функцией CreateMenu

Добавлено: 04 мар 2010, 18:53
Vik
Есть ли у кого-нибудь опыт работы с функцией CreateMenu ?

Код: Выделить всё

Назначение
Создать новое меню.
Описание
function CreateMenu : longInt;
Возвращаемое значение
Идентификатор созданного меню.
В случае, если меню не создалось, возбуждается исключение ExVip.ExLoadMenuError
Она у меня всегда возвращает ноль, исключение не генерируется, при этом меню создается (по нажатию правой кнопки я его вижу). Но если вызвать контекстное меню несколько раз подряд, галка вылетает по рантайму. При каждом нажатии выполняется примерно следующее:

Код: Выделить всё

lMenu := CreateMenu ; // возвращает почему-то всегда ноль - в доках не сказано, считать ли ноль ошибкой

for (i := 0; i < count(ArrMenuItemName); i++)
{
   var l : longint
   l := LoadMenuEx (ArrMenuItemName[i], true, false)
   
   if (l != 0) // в доках для LoadMenuEx ясно сказано, что 0 это ошибка
   {
      ConcatMenu(lMenu, l) ; // именно в этом месте я получаю рантайм при многократном вызове контекстного меню
   }
}

AddMenuItem(lMenu,'separator',666);

AddMenuItem(lMenu,'Новый пункт меню', cmNEW);

PutHotCommand(RunLoadMenu(lMenu));
Здравый смысл подсказывает, что нулевая ссылка на меню при выполнении CreateMenu - это ошибка (если нет, то совсем непонятно) и причина рантаймов кроется именно в этом.
Может кто-нибудь прояснит ситуацию?

Добавлено: 04 мар 2010, 19:09
Vik
Обошел так :

Код: Выделить всё

lMenu := LoadMenuEx (ArrMenuItemName[0], true, false)

for (i := 1; i < count(ArrMenuItemName); i++) 
{ 
   var l : longint 
   l := LoadMenuEx (ArrMenuItemName[i], true, false) 
    
   if (l != 0)
      ConcatMenu(lMenu, l) ; // никаких рантаймов
    
} 

AddMenuItem(lMenu,'separator',666); 

AddMenuItem(lMenu,'Новый пункт меню', cmNEW); 

PutHotCommand(RunLoadMenu(lMenu)); 
Все работает. Вот только получается функция CreateMenu не работает.. :(

Добавлено: 04 мар 2010, 19:15
edward_K
Видимо потому что не освобождаете по DisposeLoadMenu
}
DisposeLoadMenu(l)
}

Добавлено: 04 мар 2010, 19:28
Vik
функция RunLoadMenu выгружает загруженное меню lMenu. Тоже сначала думал, что дело в этом, но нет.

Выгружать вручную меню l тоже я так понял нельзя (DisposeLoadMenu(l) приводил к тому, что меню вообще не создавалось):

function ConcatMenu (
dstMenuId : longInt;
srcMenuId : longInt;
) : boolean;
...
После вызова данной функции идентификатор srcMenuId считается невалидным, т.е меню srcMenuId нельзя удалять автономно.

Добавлено: 04 мар 2010, 21:02
edward_K
ну тогда наверное имеет смысл накопить в массив, а после Runloadmenu выгрузить.

Добавлено: 05 мар 2010, 11:43
Vik
И массивом я делал - тот же рантайм. После вызова RunLoadMenu для DstMenuId происходит освобождение и всех SrcMenuId, DisposeLoadMenu для SrcMenuId делать нельзя.