![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
| ||
![]() | ||
|
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
TMenu уничтожать или переделывать? [Delphi]
Sheleh (17.03.15 05:56)Возникла проблема с TMenu. Пишу аналог контекстного меню проводника.
Каждый раз перед выводом пункты меню могут сильно отличаться, в зависимости от типа файла и иных обстоятельств, и мне проще его каждый раз уничтожать и создавать заново:
if assigned(ContextFilePopUp) then ContextFilePopUp.Destroy;
ContextFilePopUp:=NewMenu(Applet,0,[],nil);
Но это приводит к весьма странным последствиям. При первом создании все вроде нормально, ну а потом то пункты меню не срабатывают, то вовсе приложение падает.
А если не уничтожать, а items'ам присваивать новые значения, то как быть с сепараторами, они не могут быть сконвертированы из обычных и наоборот.
Может как как то неправильно уничтожаю?
QAZ (17.03.15 16:21) [1]
> if assigned(ContextFilePopUp) then ContextFilePopUp.Destroy;
> ContextFilePopUp:=NewMenu(Applet,0,[],nil);
инфы просто завались...
делаешь один общий обработчик + итемы в нем различаешь не по индексу, а по назначенному при создании тэгу
Sheleh (17.03.15 17:56) [2]У меня и так общий обработчик. И различать тоже могу.
А вот как переделать уже созданное меню. Код не из простых получится.
Это надо держать список созданных итемов, если их меньше чем нужно - прятать, если больше инсертить. Гемор в общем.
Dimaxx © (17.03.15 23:50) [3]Создай меню один раз. Далее очисть и заполняй теми пунктами, какие нужны в текущий момент для выбранного файла. Не забывая задать обработчики этих пунктов меню. Ничего там сложного нет. Либо создай для каждого типа файла (к примеру, текстовый, исполняемый, картинка) свое меню и показывай именно то, которое соответствуют выбранному типу файла.
Sheleh (18.03.15 02:25) [4]>Далее очисть
Как? Через Destroy? Метода Clear я чет не вижу
Dimaxx © (18.03.15 20:00) [5]Не все есть в КОЛе, много чего есть в WinAPI (DeleteMenu). Число итемов есть в КОЛ, далее перебираем все пункты и удаляем. Потом создаем заново и показываем. Если лень, то удалять и создавать заново.
Sheleh (19.03.15 04:07) [6]Спасибо, попробую через DeleteMenu
Sheleh (19.03.15 06:43) [7]В общем если не уничтожать старое меню, то вылетов не наблюдается, но с каждым вызовом меню процесс отжирает памяти в 4кб.
Если старое меню уничтожать системной функцией DestroyMenu, то она возвращает 1-цу, т.е. указывает на якобы успешное завершение. Но память все равное утекает на те же 4кб всякий раз при создании нового меню.
Sheleh (19.03.15 08:51) [8]Зато под wine все прекрасно! Никаких утечек.
QAZ (20.03.15 12:40) [9]епрст я фигею
пункт меню имеет такой же тип PMenu как все меню, то есть он уничтожается также, без всякого фуфломицина с DeleteMenu
+ пересоздать пункты можно только 65535 раз изза внутреннего счетчика
т.е. пересоздать динамическое меню полностью надежней
Sheleh (21.03.15 03:37) [10]Ваше Высокомерие, епрст, я и deletemenu и destroy.. Одно другого надежнее. Все равно результат один. Коректно ли меню, созданное колом, уничтожать с помощью апиай? Может остаются какие то данные от КОЛа?
QAZ (21.03.15 17:01) [11]конечно остаются, этож очевидно, этож при любом раскладе объектная обертка над апи, также как и ВКЛ
Разрешается использование тегов форматирования текста:
версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |