Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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(&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.045 c
15-1182988618
@dim
2007-06-28 03:56
2007.07.29
Курсоры в SQL Server 2000


15-1183226565
IPE
2007-06-30 22:02
2007.07.29
ColdFusion & Dreamweaver


5-1157690903
DimaBr
2006-09-08 08:48
2007.07.29
добавление модулей


6-1166812433
Sanek_sd
2006-12-22 21:33
2007.07.29
Помогите советом как отправить ListBox1.Items


1-1179816164
leonidus
2007-05-22 10:42
2007.07.29
Как переконвертировать Color в Hex ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский