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

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

Динамическое создание пунктов меню, как реализовать событие&#133


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 - сделай наследника пункта меню, с нужным свойством и храни что нужно там.


Наверх

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