Необоснованная ошибка при двойном щелчке объекта во время разработки в Delphi

Хорошо, вот проблема: недавно я столкнулся с проблемой, из-за которой я не мог использовать клавиши быстрого доступа (также известные как HotKeys ) на кнопках внутри GroupBox. Буквально минуту назад я понял, почему, но теперь только проблема в том, что эта причина вызывает у меня еще большее недоумение, чем раньше, а именно то, что такая кнопка с ускорителем не может быть найдена на форме. Эффект заключается в том, что когда я дважды щелкаю затронутые кнопки двойным щелчком во время разработки, я получаю сообщение об ошибке «Свойство и метод несовместимы».

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

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

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

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

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


person HX_unbanned    schedule 09.11.2010    source источник
comment
Итак, все это время не было того, чтобы клавиши быстрого доступа не работали. На самом деле у вас никогда не было никакого обработчика OnClick, назначенного кнопке, поэтому у вас не было возможности определить, работает ли ускоритель. (Вы проверяли, сработало ли нажатие кнопки во время выполнения?)   -  person Rob Kennedy    schedule 09.11.2010
comment
Да, нажатие работает, но не через событие OnClick. Это OnMouseDown -> OnMouseUp (проверка клика) -> функция VKPInputBtnClick();. Да, мне не был назначен фактический обработчик событий OnClick, поэтому я использовал Forms OnKeyPress для обработки этих исключительных функций клавиши ускорения, поэтому я был уверен, что OnKeyPress не срабатывает... Похоже, мне придется проконсультироваться с дизайнером, поскольку этот подход довольно неуклюж. ...   -  person HX_unbanned    schedule 09.11.2010
comment
Если вы используете события мыши для обнаружения кликов, вы делаете это неправильно. Используйте Онклик.   -  person Rob Kennedy    schedule 09.11.2010
comment
нет, я использую события мыши для разделения функциональности (с различными тестами перед выполнением), обеспечения модульности последовательности, надежности для внешних коммуникационных приложений на основе Delphi и т. д. ... но мне не нравится ситуация с работой с клавиатурой. После внедрения хуков это может стоить немалых рерайтов... ;)   -  person HX_unbanned    schedule 09.11.2010


Ответы (6)


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

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

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

  • Переименуйте VKPInputBtnClick, чтобы он не выглядел как обработчик событий OnClick для элемента управления VKPInputBtn.
  • Сделайте VKPInputBtnClick методом класса формы.
  • Вручную объявите новый метод VKPInputBtnClick в классе формы, и, возможно, IDE выберет его вместо отдельной функции.
  • Введите другое имя в свойство OnClick в Инспекторе объектов и затем дважды щелкните его (или нажмите Enter). IDE создаст метод с таким именем.
person Rob Kennedy    schedule 09.11.2010
comment
Хм, спасибо, но мои текущие спецификации не позволяют использовать метод как структуру кода. Единственный вариант - это функция, потому что мне нужно возвращаемое значение (я). Я попробую переименовать как самую последнюю модификацию кода для возможного решения. - person HX_unbanned; 09.11.2010
comment
Вам не разрешено использовать методы? Это глупое требование. Обработчики событий должны быть методами. Если вы имели в виду только то, что подпрограмма с именем VKPInputBtnClick не может быть методом, то это нормально; это ограничение только устраняет мое второе предложение. Остальные по-прежнему будут работать. - person Rob Kennedy; 09.11.2010
comment
Да, этот и два других элемента управления не могут быть методами :( Это довольно неудобно, но важно не загружать слишком много в стек, потому что приложение содержит несколько очень тяжелых строковых процедур и блоков обработки, поэтому мне нужно как можно скорее освободить данные. Если бы я придется использовать методы (процедуры), мне придется инициализировать несколько переменных, которые могут стать чрезвычайно голодными по памяти ... и Delphi 2 ГБ будет съеден без соли ... - person HX_unbanned; 09.11.2010
comment
Методы обработки событий ничего не добавляют в стек. И даже если бы они это сделали, если дополнительное пространство, которое они занимали, действительно повлияло на вашу программу, то у вас были бы гораздо более серьезные проблемы. Вы никогда не должны даже попадать в ситуацию, когда вы так близки к исчерпанию своего стека. Ваш стек составляет 1 МБ. На самом деле это не влияет на ограничение адресного пространства в 2 ГБ, поскольку вы все равно не можете уменьшить свой стек. У вас есть целый мегабайт. Не стесняйтесь использовать его, чтобы облегчить себе жизнь, например, применяя методы там, где это необходимо. - person Rob Kennedy; 09.11.2010
comment
Но переменные и другие общие элементы хранения значений/данных добавляют... :) - person HX_unbanned; 09.11.2010
comment
Любая переменная, которая вам нужна в методе, является переменной, которая вам понадобится и в отдельной процедуре. Вы не тратите ничего дополнительно на использование методов. Но ваши обработчики событий должны быть методами, поэтому, используя автономные процедуры, вы на самом деле сложнее достигаете своей цели. - person Rob Kennedy; 09.11.2010

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

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

person Toby Allen    schedule 09.11.2010
comment
Нет, не работал. Сейчас переустанавливаю IDE. Если не повезло, делаю QC@EDN... - person HX_unbanned; 09.11.2010

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

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

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

person Toon Krijthe    schedule 09.11.2010
comment
Нет, я имею в виду, что у меня уже есть функция, которая делает все, что мне нужно. Проблема здесь в том, что когда я дважды щелкаю компонент (кнопку) в формах во время разработки, IDE должна автоматически создавать метод OnCLick (например, процедура Button1CLick(Sender: TObject); . Вместо создания такого метода он показывает эту ошибку сообщение. Итак, теперь я не знаю, что делать и где может быть проблема. Мое первое предположение состоит в том, что IDE находит мою функцию Button1Click (Sender: TObject); и пытается связать с ней, но, очевидно, терпит неудачу... - person HX_unbanned; 09.11.2010
comment
Итак, если я предполагаю, что моя догадка верна, эта проблема является причиной того, что клавиша ускорения не работает на этой кнопке 1 ... - person HX_unbanned; 09.11.2010

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

person Gregor Brandt    schedule 09.11.2010

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

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

Как давным-давно сказал Тоби (но вы явно не слушали):

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

person gabr    schedule 11.11.2010

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