![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание 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);
Почему так?