Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.18;
Скачать: CL | DM;

Вниз

Динамическое создание PopupMenu   Найти похожие ветки 

 
Demt   (2007-08-28 19:10) [0]

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

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


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

Разобрался сам как, но после завершения программы - 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);

Почему так?


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

Да, тип PMenuAccess:

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


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

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


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

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

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

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


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

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


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

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


 
Demt   (2007-09-01 19:01) [7]

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

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


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

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

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

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


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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.05.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
2-1208344255
lewka-serdceed
2008-04-16 15:10
2008.05.18
Ошибка "Invalid variant operation"


2-1208322491
Mishenka
2008-04-16 09:08
2008.05.18
Как переписать статический метод?


2-1208365866
Dmitry
2008-04-16 21:11
2008.05.18
Ошибка при присваивании значения переменной класса


9-1170231355
akaValerius
2007-01-31 11:15
2008.05.18
Указатель на часть массива


2-1208284170
smartleds
2008-04-15 22:29
2008.05.18
Подскажите как удалить массив TrackBar-ов