Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2009, 18:16   #1
SpaceIQ
 
Регистрация: 02.07.2009
Сообщений: 7
По умолчанию Определение наличие события

Приветствую!

У меня есть класс для валидации введенных пользователем данных. В один из методов класса происходит передача виджета как TWidgetControl и некоторых параметров, отвечающих за его валидацию.

Я выполняю runtime валидацию, то есть, сразу после окончания ввода происходит валидация данных. Для этого необходимо переопределение события OnChange. Я его переопределяю, но как это делается сейчас, мне не нравится.

Дело в том, что я вначале определяю класс виджета, а потом устанавливаю OnChange, то есть:
Код

PHP код:
if MyWidget is TEdit then
  TEdit
MyWidget ).OnChange := MyChecker

Но есть еще и TComboBox, TListBox и т.д. + мои собственные виджеты. Мне приходиться перечислять их все, а так же ссылать на них в секции Uses.

Вопрос такой: можно ли определить у виджета наличие события без приведения к типу и установить? Ну или как-то сделать, чтобы не приходилось перечислять все виджеты, которые только могут быть?
SpaceIQ вне форума Ответить с цитированием
Старый 02.07.2009, 18:55   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Использовать не конкретные приведенные классы, а общего предка
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 02.07.2009, 19:11   #3
SpaceIQ
 
Регистрация: 02.07.2009
Сообщений: 7
По умолчанию

Это ясно. Но дело в том, что предок у TEdit - TCustomEdit, у TComboBox - TCustomComboBox, TListBox - TCustomListBox. А они уже наследуются от TWidgetControl, у которого нет основных событий, то есть события определяются не у предка (TWidgetControl) а у потомков (TWidgetControl, TComboBox, TCustomListBox).

Все бы ничего, не так много встроенные виджетов, можно было бы всех их легко перечислить, даже вот эти три TCustomEdit, TComboBox, TCustomComboBox - и все различные поля ввода, маски и прочее уже обрабатываются как надо. Но у меня свои виджеты, которые представляют из себя микс, то есть наследуются от TPanel, а на нем уже разные специфические группы. Вот это я не могу так перечислить.
SpaceIQ вне форума Ответить с цитированием
Старый 02.07.2009, 20:46   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Т.е. иерархия ваша собственная ? тогда практичней будет создать интерфейс, в который включить событие и реализовывать этот интерфейс классами, тогда рассматривайте объект не как объект некого класса, а как объект некого интерфейса. Либо же динамично проверять реализует ли объект некий интерфейс.
Ну или использовать RTTI FieldAddress или TypInfo.GetPropInfo
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи

Последний раз редактировалось Квэнди; 02.07.2009 в 20:56.
Квэнди вне форума Ответить с цитированием
Старый 02.07.2009, 21:52   #5
SpaceIQ
 
Регистрация: 02.07.2009
Сообщений: 7
По умолчанию

Да, то что нужно. Так как стандартные виджеты не реализуют подобного интерефейса, а хотелось бы унифицированности, поэтому я воспользовался вторым вариантом.

Не знал что есть такой юнит TypInfo. Спасибо за помощь! Использую теперь его примено вот так:

PHP код:
  NewMethodMethodTMethod;
  ...
  
NewMethod.Code := Self.MethodAddress'MyMethod' );
  
NewMethod.Data := Self;
      
  
Method := GetMethodProp(Widget'OnChange');
  if 
Method.Code <> nil then
    SetMethodProp
(Widget'OnChange'NewMethod); 
SpaceIQ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверит наличие програмы. blackstersl Общие вопросы Delphi 5 24.06.2009 12:16
Наличие указателя в объекте Edit El Fierro Общие вопросы Delphi 14 15.03.2009 13:47
проверяем наличие счета Romuald Microsoft Office Excel 2 14.01.2009 12:44
Проверка на наличие таблицы в БД Ramires БД в Delphi 3 18.12.2008 08:59
Определить наличие коммента softrix Microsoft Office Excel 2 28.04.2008 23:01