![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание пунктов меню, как реализовать событие…
Kolan © (2007-07-06 12:13:00)Здравствуйте,
Задача создать динамически пункт меню.
Надеюсь с самим созданием я справлюсь. :) Как поступить с реакцией вот вопрос.
Для создания пункта меню будет в наличии примерно какие данные:
Имя То что напишу вCaptionнового пункта.
КласстипаTClass при нажатии на пункт меню нужно будет создать экземпляр данного класса.
Как я придумал:
Мне даютИмя иКласс. Я сохраняюКлассвTClassList, а номер сохраненного в листе класса кладу вTagсозданногоМенюАйтим. Для всех создаваемых пунктов меню назначаю один и тот же обработчик.
При клике я по свойствуTagнахожу вTClassListнужныйКласси создаю его.
Плох ли мой вариант? (Мне не нравится сохранение в Tag)
Есть ли еще какие-нибудь?
Kolan (2007-07-06 18:41:00) [1]> Я бы объявлял классы для команд наследниками TComponent.
Кстати, а кто будет Owner?
Kolan (2007-07-06 17:13:00) [2]> если только он принудительно не уничтожается
Ессно уничтожается. Причем автоматически, если не указано обратное.
TComponent.
Многовато всего тащить с TComponent. Часто(из опыта) комманды отличаются только именем класса. Ни полей ни свойств им не надо.
Хотя, благодарю за совет
Игорь Шевченко (2007-07-06 16:54:00) [3]Я бы объявлял классы для команд наследниками TComponent.
Тому есть две причины -
1. у TComponent виртуальный конструктор
2. Удаление таких классов будет происходить автоматически.
Автору не советую при каждом клике на меню создавать экземпляр класса, если только он принудительно не уничтожается.
Kolan (2007-07-06 16:27:00) [4]Круто, всё работает. Причем команды на добавление меню полсылает 1 из коллег:
http://www.delphimaster.ru/cgi-bin/forum.pl?n=0&id=1183471965
А другой соотв добавляет пункты в меню формы.
Благодарю всех принявших участие.
Kolan (2007-07-06 16:20:00) [5]> TCustomCommandClass
Тьфу ошибся извеняюсь.
Kolan (2007-07-06 16:12:00) [6]Спрошу тут же объявил такой конструктор:
constructor Create(Section: string; Caption: string;
CommandClass: TCustomCommandClass);
TCustomCommandClass = class of TCustomCommand;
На:
TempMenu := TMenuItemData.Create('Файл', 'Открыть', TCustomCommandClass);
Ругается:
[Pascal Error] KTestColleagueSenderForm.pas(32): E2029 '(' expected but ')' found
Сттанно Почему?
Kolan (2007-07-06 12:56:00) [7]> А куда от него денется Pointer ?
А ну да, все благодарю за разъяснения.
Сергей М. (2007-07-06 12:51:00) [8]
> А если Integer вырастет
А куда от него денется Pointer ? Туда же и вырастет).. И вместе с ним вырастут его "ипостаси", в т.ч. TClass)
Kolan (2007-07-06 12:35:00) [9]> SizeOf(Integer)
А если Integer вырастет :) Нет, я так и сделаю, и программу пишу не на 300 лет вперёд, просто интересно стало
Сергей М. (2007-07-06 12:30:00) [10]
> Какпканы есть тут?
Никаких капканов)
SizeOf(TClass) = SizeOf(Pointer) = SizeOf(Integer) = SizeOf(Tag) = 4
Это "чудесное" равенство позволит привести тип хоть к черту лысому)
Kolan (2007-07-06 12:26:00) [11]хоть убей не вижу.
Ок. Решение принято благодарю ответивших.
ЗЫ
Какпканы
Млин, надо таки, найти время и сделать проверку орфографии в клиенте :(
Думкин (2007-07-06 12:24:00) [12]> Kolan © (06.07.07 12:21) [3]
На нет и суда нет, но чего тут левого - хоть убей не вижу.
Kolan (2007-07-06 12:21:00) [13]> Ну не хочешь в Tag сделай наследника пункта меню, с нужным
> свойством и храни что нужно там.
Да думал об этом. Но не хочу привязываться к левым(в данном случаи своим) компонентам.
> TClass(TMenuItem(Sender).Tag).Create( );
Во, а вот это то что надо. Создан ессно будет экземпляр нужного класса, так?
А сохранять как?
Какпканы есть тут?
Сергей М. (2007-07-06 12:18:00) [14]
> номер сохраненного в листе класса кладу в Tag
Почему бы в Tag не сохранять непосредственно Класс ?
В этом случае нет никакой надобности в TObjectList.
В обработчике клика:
TClass(TMenuItem(Sender).Tag).Create(..);
Думкин (2007-07-06 12:17:00) [15]> Kolan © (06.07.07 12:13)
Ну не хочешь в Tag - сделай наследника пункта меню, с нужным свойством и храни что нужно там.