Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

Динамическое создание 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 вся ветка

Форум: "KOL";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.05 c
2-1208631399
Rasputin
2008-04-19 22:56
2008.05.18
поиск окна и родительских окон


2-1208504519
lewka-serdceed
2008-04-18 11:41
2008.05.18
список в ячейке


15-1207627627
TUser
2008-04-08 08:07
2008.05.18
Настоящий дистрибутив ХР влезает на дискету :)


2-1208434018
slashka
2008-04-17 16:06
2008.05.18
Многострочный TListView


2-1208423516
Зоо
2008-04-17 13:11
2008.05.18
Выделить строку в DBGRIDEX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский