Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

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]

конечно остаются, этож очевидно, этож при любом раскладе объектная обертка над апи, также как и ВКЛ


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо