Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое создание PopupMenu [Delphi, Windows]


Demt ©   (2007-08-28 19:10:00) 

Есть popup menu с submenu. Во время исполнения динамически в submenu добавляются элементы (количество не фиксированное). Как к этим элементам добавить своё submenu? (То есть получится три вложения).
Строка вида:
PopupMenu1.Items[PopupMenu1.Items[SubItms].ItemSubmenu[0]].InsertSubMenu(P opupMenu2,0);
не работает. До этого создается гарантированно 2 элемента во вложении.

Что не понятно -  спросите, писал второпях, без телепатора всё объясню :)


Vladimir Kladov   (2007-09-05 11:44:00) [1]

fParentMenu == property Parent, я же сказал.


Demt   (2007-09-04 20:19:00) [2]

Так,а это возможно для динамического создаваемого меню и как реализовать доступ к меню из его суб-меню?


Vladimir Kladov   (2007-09-04 19:02:00) [3]

Что-то не дойду: ParentMenu ведь есть, до какого угодно родителя можно добраться, и получить все, что у него есть (Tag хотя бы).


Demt   (2007-09-04 18:52:00) [4]

Дополнительный вопрос.
Как узнать, какое cубменю выделено при нажатии пункта в SubMenu?

Приблизительная схема:
MainMenu ----> Sub1 ---> Sub1Menu
                        |
                     Sub2 ---> Sub2Menu
                       ...
                     SubN ---> SubNMenu

При нажатии пункта в SubNMenu нужно, чтобы он возвращал номер SubN (номер пункта).
Что-то никак не пойму как это сделать, и какие обработчики обрабатывать.


Demt   (2007-09-01 19:01:00) [5]

Ужас. Не думал, что всё так банально.
SubMenu.Free
в событии OnCloseформы.
И откуда только ноги не растут...

Проблема решена.
Владимир, большое спасибо за подсказки.


Vladimir Kladov   (2007-08-30 17:04:00) [6]

Вы же можете назначить OnDestroy проблемному субменю, и посмотреть, где деструктор вызывается первый и где - второй раз? Можно еще USE_NAMES, присвоить имя ему, поставить брейк на деструктор TMenu, и ждать прихода сначала имени, а потом еще раз - такого же адреса. Просто посмотреть, откуда ноги растут.


Demt   (2007-08-29 16:11:00) [7]

Тот же код добавлял в события на родительское меню, и субменю. Те же ошибки после завершения.


Demt   (2007-08-29 16:06:00) [8]

Так же, выпадает ошибка. Runtime Error 216.

for i:=0 to List.Count-1 do
begin
 PopupMenu.Items[Sub1].RemoveSubMenu(i);
end;

Прописывал и в KOLFormDestroy и в KOLFormClose - безрезультатно.


Vladimir Kladov   (2007-08-29 15:32:00) [9]

Скорее всего, перед завершением надо так же и отсоединить, как присоединили. Иначе поп-меню пытается удалиться дважды - как дочернее по отношению к форме и как дочернее к тому меню, к которому оно присоединено. Потому и AV выскаивает на выходе.


Demt   (2007-08-29 14:49:00) [10]

Да, тип PMenuAccess:

type
PMenuAccess = ^TMenuAccess;
 TMenuAccess = object(TMenu)


Demt   (2007-08-29 13:22:00) [11]

Разобрался сам как, но после завершения программы - Runtime-error, если создавать в цикле c загрузкой заголовка из списка.

for i:= 0 to List.Count-1 do
  begin
     PMenuAccess(SubMenu).FCaption := List.Items[i];
     PopupMenu1.Items[Sub1].InsertSubMenu(SubMenu,-1);
 end;

"Одиночное" создание (без присваивания) работает без ошибок:

   PMenuAccess(SubMenu).FCaption :='Заголовок';
   PopupMenu1.Items[Sub1].InsertSubMenu(SubMenu,-1);

Почему так?


Наверх

Титульная страница Поиск, карта сайта Написать письмо