Конференция "KOL" » TMenu уничтожать или переделывать? [Delphi]
 
  • Sheleh (17.03.15 05:56) [0]
    Возникла проблема с 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]
    конечно остаются, этож очевидно, этож при любом раскладе объектная обертка над апи, также как и ВКЛ
 
Конференция "KOL" » TMenu уничтожать или переделывать? [Delphi]
Есть новые Нет новых   [118578   +21][b:0][p:0.001]