Конференция "KOL" » Разыскивается код... [Delphi, Windows]
 
  • MTsv DN (02.12.09 16:08) [0]
    Всем привет... Не знаю, будет ли продолжение данной темы, однако...
  • MTsv DN (02.12.09 16:11) [1]
    Может есть у кого наработки по поводу сортировки элементов меню? Т.е. есть меню, глубина произвольная, число элементов произвольное. Надо отсортировать все меню в этом меню по алфавиту...
  • Dy1 (03.12.09 07:42) [2]
    иногда пригодилось бы. Наработок нет, я вижу StrListEx-ы и создание нового меню (кстати, рабочая модификация меню в рантайме мне так и не удалась)
  • MTsv DN (03.12.09 12:03) [3]
    > Наработок нет, я вижу StrListEx-ы и создание нового меню
    Ничего против не имею, т.к. иногда главное - результат, но это способ через "одно место". Думаю оффтопа достаточно?..

    Т.е. никто углубленно не работал с динамическими меню?
  • MTsv DN (04.12.09 17:33) [4]
    Всем привет...

    Нужна помощь. Глаз замылился, мозг кипит... Нужно новое видение темы.

    http://ifolder.ru/15309146
    Это проект рекурсивной сортировки меню. Затык в том, что функция InsertSubMenu, как-то так хитро добавляет SubMenu, что потом его не удалить. Если после запуска на форме кликнуть правой кнопкой, то выпадает исходное меню, затем один раз можно корректно отсортировать (т.е. сам механизм рекурсии работает верно), но вот потом, ни повторную сортировку, ни сброс к исходному меню сделать нельзя...

    Хелпми, помогите кто чем может...
  • robt (04.12.09 18:42) [5]
    у меня даже генерация твоя не пашет :)
    забей на кол (он зло), обратись к первоисточнику
    LoadMenuIndirect+ MENUITEMTEMPLATEHEADER+массив MENUITEMTEMPLATE как вариант
    уничтожай меню полностью и создавай заново отсортированое
  • MTsv DN (04.12.09 18:49) [6]
    В каком месте генерация не пашет?
  • robt (04.12.09 18:53) [7]
    f-11 и фсе :)

    кста есть такая функция ModifyMenu мошт и сгодица
  • MTsv DN (04.12.09 19:00) [8]
    Как я только не пытался SubMenu двигать и ModifyMenu, и InsertMenu, и InsertMenuItem, и SetMenuItemInfo...не пашет...

    А про LoadMenuIndirect я вообще не понял...он же вроде как из списка MenuItemTemplate создает меню. Или нет?
  • robt (04.12.09 19:00) [9]
    SetMenuItemInfo точней
  • MTsv DN (04.12.09 19:01) [10]
    > f-11 и фсе :)
    Весьма странно. ЕХЕшник в архиве работает, я ж его не с куста взял.
  • Дмитрий К © (04.12.09 19:04) [11]
    Пункт "по умолчанию", в меню может быть только один, поэтому moDefault там лишние и генерация не пашет, по крайней мере, в Win7. А сортировке проблема, если в подменю первый пункт тоже подменю.
  • robt (04.12.09 19:08) [12]
    LoadMenu грузит из ресурсов а LoadMenuIndirect создает из MenuTemplate который програмно создаеш

    если не получается через api поменять итем например SetMenuItemInfo значит чето не так делаеш, тогда проще пересоздать полностью меню видимо
  • robt (04.12.09 19:10) [13]

    >  по крайней мере, в Win7

    тажа фигня
  • MTsv DN (04.12.09 19:13) [14]
    moDefault
    Пардон, перестарался...
  • MTsv DN (04.12.09 19:27) [15]
    > если не получается через api поменять итем например SetMenuItemInfo значит чето не так делаеш
    Я в курсе. Если делал так не было б проблемы. Вот код с SetMenuItemInfo:
    for i := 0 to Length(Rec) - 1 do
     begin
      if not Rec[i].IsSM then
       begin
        Form1.pm.Items[MenuID].Parent.InsertItem(-1,
                                                 PWideChar(Rec[i].Name),
                                                 nil,
                                                 []);
        Form1.pm.RemoveSubMenu(Rec[i].Id);
       end
        else
         begin
          ZeroMemory(@MII, SizeOf(MII));
          MII.cbSize := MenuStructSize;
          MII.fMask := MIIM_ID;
          MII.wID := Form1.pm.Items[Form1.pm.Count - 1].MenuId + 1;
          SetMenuItemInfoW( Form1.pm.Items[MenuID].Parent.Handle,
                            i,
                            TRUE,
                            MII );
    //       Form1.pm.Items[MenuID].Parent.InsertSubMenu(Form1.pm.Items[Rec[i].ID], -1);
    //       RemoveMenu(Form1.pm.Items[MenuID].Parent.Handle, i, MF_BYPOSITION);
         end;

  • MTsv DN (04.12.09 19:30) [16]
    Если я правильно понимаю, то:
    1. Изменяться будет родитель Form1.pm.Items[MenuID].Parent.Handle
    2. Третий параметр = true, значит второй - это позиция
    3. wID поменял, максимальный+1.
    4. Вызов SetMenuItemInfoW результат Успешно. Элемент не двигался
  • robt (04.12.09 19:47) [17]
    SetMenuItemInfo ничего не двигает :)
    она изменяет информацию о пункте меню,надпись,чеканутость и тд
    и зачем по позиции,делай по идентификатору(false)
  • MTsv DN (04.12.09 19:50) [18]
    > SetMenuItemInfo ничего не двигает :)
    Тада на кой она мне? Или я совсем уже запутался?.. Вы задачу поняли?
  • robt (04.12.09 20:08) [19]
    ну смотри ты сортируеш меню,пральна
    делаеш это удалением\вставкой,пральна
    при этом чета там не работает
    тогда замени удаление\вставку обменом данными самих итемов
    нафига их удалять и создавать новые когда можно обменяться инфой (swap)
 
Конференция "KOL" » Разыскивается код... [Delphi, Windows]
Есть новые Нет новых   [134431   +12][b:0][p:0.001]