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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение 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 - это ошибка (если нет, то совсем непонятно) и причина рантаймов кроется именно в этом.
Может кто-нибудь прояснит ситуацию?
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение 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 не работает.. :(
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

Видимо потому что не освобождаете по DisposeLoadMenu
}
DisposeLoadMenu(l)
}
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

функция RunLoadMenu выгружает загруженное меню lMenu. Тоже сначала думал, что дело в этом, но нет.

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

function ConcatMenu (
dstMenuId : longInt;
srcMenuId : longInt;
) : boolean;
...
После вызова данной функции идентификатор srcMenuId считается невалидным, т.е меню srcMenuId нельзя удалять автономно.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

ну тогда наверное имеет смысл накопить в массив, а после Runloadmenu выгрузить.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

И массивом я делал - тот же рантайм. После вызова RunLoadMenu для DstMenuId происходит освобождение и всех SrcMenuId, DisposeLoadMenu для SrcMenuId делать нельзя.
Ответить