Форум: "Начинающим";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание пунктов меню, как реализовать событие&#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(…);
Во, а вот это то что надо. Создан ессно будет экземпляр нужного класса, так?
А сохранять как?
Какпканы есть тут?
← →
Думкин © (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 лет вперёд, просто интересно стало…
← →
Сергей М. © (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
Сттанно… Почему?
← →
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. Часто(из опыта) комманды отличаются только именем класса. Ни полей ни свойств им не надо.
Хотя, благодарю за совет…
← →
Kolan © (2007-07-06 18:41) [15]> Я бы объявлял классы для команд наследниками TComponent.
Кстати, а кто будет Owner?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c