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

Вниз

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

 
Kolan ©   (2007-07-06 12:13) [0]

Здравствуйте,
 Задача — создать динамически пункт меню.

Надеюсь с самим созданием я справлюсь. :) Как поступить с реакцией — вот вопрос.

Для создания пункта меню будет в наличии примерно какие данные:
Имя — То что напишу в Caption нового пункта.
Класс типа TClass — при нажатии на пункт меню нужно будет создать экземпляр данного класса.

Как я придумал:
Мне дают Имя и Класс. Я сохраняю Класс в TClassList, а номер сохраненного в листе класса кладу в Tag созданного МенюАйтим. Для всех создаваемых пунктов меню назначаю один и тот же обработчик.

При клике я по свойству Tag нахожу в TClassList нужный Класс и создаю его.

Плох ли мой вариант? (Мне не нравится сохранение в Tag)
Есть ли еще какие-нибудь?


 
Думкин ©   (2007-07-06 12:17) [1]

> Kolan ©   (06.07.07 12:13)  

Ну не хочешь в Tag - сделай наследника пункта меню, с нужным свойством и храни что нужно там.


 
Сергей М. ©   (2007-07-06 12:18) [2]


> номер сохраненного в листе класса кладу в Tag


Почему бы в Tag не сохранять непосредственно Класс ?
В этом случае нет никакой надобности в TObjectList.

В обработчике клика:

TClass(TMenuItem(Sender).Tag).Create(..);


 
Kolan ©   (2007-07-06 12:21) [3]

> Ну не хочешь в Tag — сделай наследника пункта меню, с нужным
> свойством и храни что нужно там.

Да думал об этом. Но не хочу привязываться к левым(в данном случаи своим) компонентам.


> TClass(TMenuItem(Sender).Tag).Create(&#133);

Во, а вот это то что надо. Создан ессно будет экземпляр нужного класса, так?
А сохранять как?

Какпканы есть тут?


 
Думкин ©   (2007-07-06 12:24) [4]

> Kolan ©   (06.07.07 12:21) [3]

На нет и суда нет, но чего тут левого - хоть убей не вижу.


 
Kolan ©   (2007-07-06 12:26) [5]

хоть убей не вижу.
Ок. Решение принято — благодарю ответивших.

ЗЫ
 Какпканы
 Млин, надо таки, найти время и сделать проверку орфографии в клиенте :(


 
Сергей М. ©   (2007-07-06 12:30) [6]


> Какпканы есть тут?


Никаких капканов)

SizeOf(TClass) = SizeOf(Pointer) = SizeOf(Integer) = SizeOf(Tag) = 4

Это "чудесное" равенство позволит привести тип хоть к черту лысому)


 
Kolan ©   (2007-07-06 12:35) [7]

> SizeOf(Integer)

А если Integer вырастет :) Нет, я так и сделаю, и программу пишу не на 300 лет вперёд, просто интересно стало&#133


 
Сергей М. ©   (2007-07-06 12:51) [8]


> А если Integer вырастет


А куда от него денется Pointer ? Туда же и вырастет).. И вместе с ним вырастут его "ипостаси", в т.ч. TClass)


 
Kolan ©   (2007-07-06 12:56) [9]

> А куда от него денется Pointer ?

А ну да, все благодарю за разъяснения.


 
Kolan ©   (2007-07-06 16:12) [10]

Спрошу тут же объявил такой конструктор:

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

Сттанно&#133 Почему?


 
Kolan ©   (2007-07-06 16:20) [11]

> TCustomCommandClass

Тьфу — ошибся — извеняюсь.


 
Kolan ©   (2007-07-06 16:27) [12]

Круто, всё работает. Причем команды на добавление меню полсылает 1 из коллег:
http://delphimaster.net/view/1-1183471965/
А другой соотв добавляет пункты в меню формы.

Благодарю всех принявших участие.


 
Игорь Шевченко ©   (2007-07-06 16:54) [13]

Я бы объявлял классы для команд наследниками TComponent.
Тому есть две причины -
1. у TComponent виртуальный конструктор
2. Удаление таких классов будет происходить автоматически.

Автору не советую при каждом клике на меню создавать экземпляр класса, если только он принудительно не уничтожается.


 
Kolan ©   (2007-07-06 17:13) [14]

> если только он принудительно не уничтожается

Ессно уничтожается. Причем автоматически, если не указано обратное.

TComponent.
Многовато всего тащить с TComponent. Часто(из опыта) комманды отличаются только именем класса. Ни полей ни свойств им не надо.

Хотя, благодарю за совет&#133


 
Kolan ©   (2007-07-06 18:41) [15]

> Я бы объявлял классы для команд наследниками TComponent.

Кстати, а кто будет Owner?



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

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

Наверх




Память: 0.5 MB
Время: 0.028 c
2-1183383487
Sventitskiy
2007-07-02 17:38
2007.07.29
Проблемы с памятью


2-1182568707
Dyakon_Frost
2007-06-23 07:18
2007.07.29
Поиск дубликатов файлов


15-1183321948
KilkennyCat
2007-07-02 00:32
2007.07.29
Смешное из форумов.


15-1183130798
linzaolog
2007-06-29 19:26
2007.07.29
аналог ListBox


15-1182988618
@dim
2007-06-28 03:56
2007.07.29
Курсоры в SQL Server 2000