2010-11-09 2 views
0

Итак, вот в чем проблема: Недавно я столкнулся с проблемой, что я не смог использовать клавиши ускорителя (a.k.a HotKey s) на кнопках внутри GroupBox. Всего минуту назад я узнал, почему, но теперь только проблема в том, что эта причина еще больше озадачивает меня, чем раньше, а именно, что такую ​​кнопку с ускорителем нельзя найти на Форме. Эффект заключается в том, что когда я дважды нажимаю на затронутые кнопки с двойным щелчком, находясь во время разработки, я получаю сообщение об ошибке «Свойство и метод несовместимы».Необоснованная ошибка при двойном щелчке по объекту во время разработки в Delphi

MethodName is VKPInputBtnClick, что фактически объявлено как функция, а не как метод в блоке.

Что меня озадачивает, так это то, что я не назначил OnClick обработчик событий для VKPInputBtn любому методу вообще!

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

Любое решение? Переустановка IDE?

Любая помощь очень ценится ...

+0

Итак, все это время, это не так, что клавиши ускорителя не работали. Фактически, у вас никогда не было обработчика OnClick, назначенного кнопке, поэтому вы не могли сказать, работал ли ускоритель в первую очередь. (Вы проверяли, нажата ли кнопка *, нажата ли кнопка во время выполнения?) –

+0

Да, нажатие работает, но не через событие OnClick.Это OnMouseDown -> OnMouseUp (проверка кликов) -> функция VKPInputBtnClick() ;. Да, у меня не было назначенного обработчика событий OnClick, поэтому я использовал Forms OnKeyPress для обработки этих исключительных функциональных возможностей Accelerator Key, поэтому я менялся, что OnKeyPress не срабатывал ... Похоже, мне придется проконсультироваться с Designing, поскольку этот подход довольно неуклюж. ... –

+0

Если вы используете события мыши для обнаружения кликов, вы делаете это неправильно. Используйте OnClick. –

ответ

4

Двойной щелчок элемента управления, который не имеет установленного по умолчанию объекта события, заставляет IDE назначать это свойство. (Это не просто ярлык для перехода к редактору кода, это F12.) IDE ищет исходный код для функции с нужным именем. Если он не находит его, он создает метод в содержащей форме и присваивает ему свойство события компонента. Но если он делает найти что-то с правильным именем, он пытается назначить его, не создавая ничего нового.

Проблема, по-видимому, в том, что то, что IDE находит в вашем случае, несовместимо с событием, с которым оно, похоже, работает. Вероятно, ошибка - он не должен выбирать не-методы, но редко встречается, учитывая низкую частоту, с которой люди выбирают одно и то же имя для автономных функций, которые IDE выбирает для обработчиков событий.

У вас есть несколько вариантов:

  • Rename VKPInputBtnClick так это не выглядит, как будто это обработчик OnClick события для управления VKPInputBtn.
  • Марка VKPInputBtnClick быть методом класса формы.
  • Вручную объявить метод VKPInputBtnClick в классе формы, и, возможно, IDE выберет его вместо автономной функции.
  • Тип некоторое другое имя в OnClick свойства в инспекторе объектов, а затем двойным щелчком мыши (или нажмите Enter ). IDE создаст метод с этим именем.
+0

Хм, спасибо, но мои текущие спецификации не позволяют использовать метод в качестве структуры кода. Только опция - это функция, потому что мне нужны возвращаемые значения. Я попробую переименовать, хотя и как последнюю модификацию кода для возможного решения. –

+0

Вы не разрешено использовать m ethods? Это глупое требование. Обработчики событий * должны * быть методами. Если вы только имели в виду, что подпрограмма, которая в настоящее время называется 'VKPInputBtnClick', не может быть методом, то это нормально; это ограничение устраняет только мое второе предложение. Остальные будут работать. –

+0

Да, это и два других элемента управления не могут быть методами :(Это довольно сложно, но важно не загружать слишком много в стеке, потому что приложение содержит несколько очень тяжелых строковых подпрограмм и блоков обработки, поэтому мне нужно освобождать данные как можно скорее. должен был бы использовать методы (процедуры), мне пришлось бы инициализировать несколько переменных, которые могут стать экстремально голодными ... и Delphi 2GB будет употребляться без соли ... –

0

компоненты работают по-разному в конструкции и во время выполнения. Двойной щелчок на кнопке в desgintime создает и добавляет обработчик OnClick. Это объясняет, почему поведение отличается.

Надеюсь, я правильно понимаю ваш вопрос. У вас есть компонент в вашей форме, и вы не можете назначить правильный обработчик событий, потому что автоматически созданный обработчик событий отличается от ожидаемого обработчика событий?

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

+0

Нет, я имею в виду, что у меня уже есть функция, которая делает все, что мне нужно. Проблема заключается в том, что при двойном щелчке по компоненту (кнопке) в Forms во время разработки среда IDE должна автоматически создавать OnCLick-метод (например, процедура Button1CLick (Sender: TObject)). Вместо того, чтобы создавать такой метод, она показывает эту ошибку Итак, теперь я не знаю, что делать или где может быть проблема. Сначала я предполагаю, что IDE находит мою функцию Button1Click (Sender: TObject) и пытается связать ее, но явно не удается ... –

+0

Итак, если Я предполагаю, что моя догадка правильная, эти проблемы являются причиной того, почему Accelerator Key не работает на этой Button1 ... –

1

Попробуйте удалить обработчик из файла .pas из раздела декларации и реализации (или скопируйте где-нибудь, если они содержат код). Затем попробуйте воссоздать обработчик для кнопки. Иногда IDE может выйти из синхронизации, и все, что можно сделать, - это вернуться к известному состоянию.

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

+0

Нет, не работает. Теперь я переустанавливаю IDE. Если не повезло, я делаю QC @ EDN ... –

0

Если это окажется настоящей ошибкой, не забудьте записать ее с помощью Embarcadero. Вы можете получить доступ к приложению QA через меню инструментов в среде IDE или перейти на веб-сайт.

0

В любом случае, на вопрос ответили, и это ясно, что это сообщение об ошибке должно быть ошибкой RAD Studio XE, поскольку IDE в неверном порядке сравнивает фактические и необходимые свойства объекта.

Благодарим вас за вход.

Case EDN QC: # 89543


Примечания:

Это подход я использую, чтобы использовать функциональные возможности Accelerator для функции VKPInputBtnCLick.
- Использование сообщения формируют этот код Snipp: Alt key handling algorithm
- Изменение VK_TAB в VK_LMENU (левый ALT)
- После того, как ALT сообщение захватывается, установить глобальное уникальное значение переменной
- В обработчик событий FormKeyPress, проверьте уникальные глобальные переменные значение соответствует тому, которое я установил до - Выполнить функцию.

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

Не задан Вопрос в ответе еще.

+0

умные бои! –

+0

Что до сих пор не получили ответы? Что еще вы ожидаете от ответа? Вы спросили, как дать IDE присвоить значение обработчику событий. Я дал вам четыре пути. Обратите внимание, что ваш вопрос не имеет абсолютно никакого отношения к тому, как заставить клавиши ускорителя работать во время выполнения. Это отдельная проблема. –

0

фактически объявлен как функция, а не как метод в блоке.

Обработчики методов должны быть процедурами, а не функциями. Следовательно, это не сработает.

Как сказал Тоби очень давно (но, очевидно, не слушал):

Попробуйте удалить обработчик из файла .pas ... Затем попробуйте воссоздать обработчик для кнопки.