Перейти к содержанию
Fire Monkey от А до Я
  • 0

Проверка свойств-методов объектов


notricky

Вопрос

Собственно вот такая строчка:

  if TCustomPopupForm(self.PopupForm).OnKeyDown <> KeyDown  then

вызывает ошибку при компиляции Not enough actual parameters

Собственно как получить подобное условие?
И интересен будет комментарий к этому - почему такая ошибка.

Изменено пользователем notricky
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы
2 часа назад, notricky сказал:

Собственно вот такая строчка:


  if TCustomPopupForm(self.PopupForm).OnKeyDown <> KeyDown  then

вызывает ошибку при компиляции Not enough actual parameters

Собственно как получить подобное условие?
И интересен будет комментарий к этому - почему такая ошибка.

эм, что вы хотите сделать?

если проверить обработчик привязанный к событию, то через Assigned

если хотите проверить параметр который возвращается в теле события, то нужно написать обработчик и присвоить его

TCustomPopupForm(self.PopupForm).OnKeyDown := MyEventKeyDown;

и уже в теле MyEventKeyDown проверять параметр

Ссылка на комментарий
  • 0

KeyDown в моем примере - это обработчик.

Задача была проверить какой обработчик в OnKeyDown. Чтобы не присваивать каждый раз обработчик, если он тот же на входе.

Ссылка на комментарий
  • 0
  • Модераторы
4 часа назад, notricky сказал:

KeyDown в моем примере - это обработчик.

Задача была проверить какой обработчик в OnKeyDown. Чтобы не присваивать каждый раз обработчик, если он тот же на входе.

это не лучшее решение, используйте к примеру Tag формы, каждый обработчик имеет свой номер.

так проще будет ориентироваться и выполнять сравнения

Ссылка на комментарий
  • 0

Не претендую на самое лаконичное решение, но проверку можно организовать так:

var
  tmp: TNotifyEvent; // понятно, что тут должен быть нужный тип события, лень смотреть, что там с OnKeyDown
begin
  tmp:=myProc;
  if (TMethod(OnActivate).Code = TMethod(tmp).Code) and (TMethod(OnActivate).Data = TMethod(tmp).Data) then
    ;// именно myProc - обработчик события OnActivate

 

Ссылка на комментарий
  • 0
В 08.10.2016 в 04:24, notricky сказал:

И интересен будет комментарий к этому - почему такая ошибка.

Потому что компилятор хочет сравнить результат работы метода со второй сравниваемой переменной. И он видит, что метод имеет параметры, но они не передаются. Правда, если подставить к примеру что-нибудь фейковое, то компилятор начнет ругаться, что метод не возвращает значения, т.к. он объявлен как procedure of object :)

Изменено пользователем kami
Ссылка на комментарий
  • 0
21 час назад, notricky сказал:

Тогда уж @ вначале TCustomPopupForm тоже

Не уверен, но может быть так, что сравнение указателей (если это "проглотит" компилятор) будет сравнивать только адреса методов в VMT. А нужно сравнивать адресацию метода и объект, к которому этот метод относится (например - если создано две формы одного класса и обработчик назначен на одну из них). Вероятно, @ при сравнении myKeyDown = Form2.OnKeyDown будет давать ложно-положительные срабатывания, если в реальности myKeyDown = Form1.OnKeyDown.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...