-
Возникла проблема с TMenu. Пишу аналог контекстного меню проводника. Каждый раз перед выводом пункты меню могут сильно отличаться, в зависимости от типа файла и иных обстоятельств, и мне проще его каждый раз уничтожать и создавать заново: if assigned(ContextFilePopUp) then ContextFilePopUp.Destroy;
ContextFilePopUp:=NewMenu(Applet,0,[],nil); Но это приводит к весьма странным последствиям. При первом создании все вроде нормально, ну а потом то пункты меню не срабатывают, то вовсе приложение падает. А если не уничтожать, а items'ам присваивать новые значения, то как быть с сепараторами, они не могут быть сконвертированы из обычных и наоборот. Может как как то неправильно уничтожаю?
-
> if assigned(ContextFilePopUp) then ContextFilePopUp.Destroy; > ContextFilePopUp:=NewMenu(Applet,0,[],nil);
инфы просто завались... делаешь один общий обработчик + итемы в нем различаешь не по индексу, а по назначенному при создании тэгу
-
У меня и так общий обработчик. И различать тоже могу. А вот как переделать уже созданное меню. Код не из простых получится. Это надо держать список созданных итемов, если их меньше чем нужно - прятать, если больше инсертить. Гемор в общем.
-
Создай меню один раз. Далее очисть и заполняй теми пунктами, какие нужны в текущий момент для выбранного файла. Не забывая задать обработчики этих пунктов меню. Ничего там сложного нет. Либо создай для каждого типа файла (к примеру, текстовый, исполняемый, картинка) свое меню и показывай именно то, которое соответствуют выбранному типу файла.
-
>Далее очисть Как? Через Destroy? Метода Clear я чет не вижу
-
Не все есть в КОЛе, много чего есть в WinAPI (DeleteMenu). Число итемов есть в КОЛ, далее перебираем все пункты и удаляем. Потом создаем заново и показываем. Если лень, то удалять и создавать заново.
-
Спасибо, попробую через DeleteMenu
-
В общем если не уничтожать старое меню, то вылетов не наблюдается, но с каждым вызовом меню процесс отжирает памяти в 4кб. Если старое меню уничтожать системной функцией DestroyMenu, то она возвращает 1-цу, т.е. указывает на якобы успешное завершение. Но память все равное утекает на те же 4кб всякий раз при создании нового меню.
-
Зато под wine все прекрасно! Никаких утечек.
-
епрст я фигею пункт меню имеет такой же тип PMenu как все меню, то есть он уничтожается также, без всякого фуфломицина с DeleteMenu + пересоздать пункты можно только 65535 раз изза внутреннего счетчика т.е. пересоздать динамическое меню полностью надежней
-
Ваше Высокомерие, епрст, я и deletemenu и destroy.. Одно другого надежнее. Все равно результат один. Коректно ли меню, созданное колом, уничтожать с помощью апиай? Может остаются какие то данные от КОЛа?
-
конечно остаются, этож очевидно, этож при любом раскладе объектная обертка над апи, также как и ВКЛ
|