| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Как вызвать класс в классе формы |
| Автор: styu 28.1.2010, 23:03 | ||||||
Есть класс для перехвата нажатия кнопки Del с клавиатуры
Вызываю этот класс в классе формы
Отладчик выдает ошибку "No overload for method 'MyMessageFilter' takes '0' arguments" в строке
Как можно решить эту проблему, подскажите, пожалуйста |
| Автор: Sfate 29.1.2010, 02:10 | ||
|
| Автор: KelTron 29.1.2010, 10:30 | ||
А скобки кто добавлять будет?)
|
| Автор: styu 29.1.2010, 13:36 |
| Sfate, Спасибо, попробую .. Добавлено через 50 секунд KelTron, В проекте есть, на сайте у меня очепатка получилась :( |
| Автор: KelTron 29.1.2010, 14:59 |
| А, ну это потому что у тебя нет конструктора по умолчанию в классе MyMessageFilter. |
| Автор: styu 29.1.2010, 22:33 | ||||
KelTron,
Я не сразу поняла, у меня есть конструктор класса
|
| Автор: Sfate 29.1.2010, 22:52 | ||
небходимо передавать в функцию какие то значения, или все время будет ошибка о ненулелевых аргументах функции... т.е.
где SomeKindOfForm будет присваиваться как значение f ... естественно вместо SomeKindOfForm пишем свое необходимое значение;) |
| Автор: styu 30.1.2010, 00:28 | ||||
| Sfate, Передо мной стояла задача: Есть база, которую отображает DataGrid, мне надо, чтобы при нажатии на клавишу Del клавиатуры, появлялось окошко с вопросом, хочу ли я действительно удалить запись - это все я реализовала в классе
теперь я не знаю, как из класса формы вызвать класс MyMessageFilter
Для меня это сложно, я не понимаю, что надо передавать в эту функцию? |
| Автор: Sfate 30.1.2010, 03:01 |
| styu, Вы, переделываете чужую программую? или... Вы не можете разобрать, что сами написали? |
| Автор: PaZ1T1V 30.1.2010, 07:08 | ||||||
| а зачем мудрить? зачем создавать свой класс ? не легче ли воспользоваться стандартным MessageBox if (MessageBox.Show([наш вопрос в кавычках], [заголовок окна тоже в кавычках], MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { удалить то что надо } все это делается в обработчике нажатия клавиш и при условии если e.KeyCode == Keys.Del помоему так, писал по памяти... или я не правильно понял? а если уж до зарезу нужно обрабатывать с помощью своего класса, то делаем так PS код класса и формы в студию.... телепатов нету ;) не так.... Делаем класс, в вашем случае MyMessageFilter: IMessageFilter делаем конструктор но не по умолчанию
переопределяем метод PreFilterMessage
далее открываем Program.cs
вуаля! работает! |
| Автор: styu 1.2.2010, 00:30 | ||||
PaZ1T1V, Спасибо, ошибка больше не вылетает. Но при нажатии клавиши del запись не удаляется, но и не появляется окошка с запросом. Выкладываю код класса:
Далее
|
| Автор: KelTron 1.2.2010, 08:49 | ||
| Да тут класс совсем не нужен, только сильно усложняет всё. Лучше сделать как PaZ1T1V предлагал через обычный обработчик:
|
| Автор: PaZ1T1V 1.2.2010, 20:14 |
| поставте return true, я ж писал, что return false для того, чтобы игнорировать обработку сообщения PS должно все заработать |
| Автор: styu 1.2.2010, 22:42 |
| PaZ1T1V, установила return true, ничего не изменилось |
| Автор: Ceiceron 1.2.2010, 22:50 | ||
разве не здесь затесалась ошибка? если мы создали экземпляр ксласса Form1 form, проинициализировали им фильтр сообщений, то не его ли надо передавать на запуск приложения? т.е. вместо Application.Run(new Form1()); надо написать Application.Run(form); |
| Автор: styu 1.2.2010, 22:55 |
| Ceiceron, К сожалению, это тоже не помогло |
| Автор: Ceiceron 1.2.2010, 23:20 | ||||
| Естественно, потому что надо внимательно читать, что пишут другие. у вас в коде есть строчка:
Вы не добавив свой фильтр, его удаляете, как думаете будет у системы какая либо реакция? замените эту строку на
Все должно заработать, хотя я думаю лучше при удалении строки подобные проверки проводить в соотвествующих обработчиках DataGrid. |
| Автор: styu 1.2.2010, 23:56 | ||||
| Ceiceron, Вы правы, переписала
на
все заработало, но с формой творится что -то страшное, она грузится минут 5, потом замирает и с ней уже ничего сделать нельзя, кроме как нажать кнопку del, на нее единственную она только и реагирует |
| Автор: Ceiceron 2.2.2010, 00:18 |
| styu, зря вы взялись делать перехват событий на уровне сообщений окна. http://forum.vingrad.ru/index.php?showtopic=289448&view=findpost&p=2085940 KelTron это будет работать эффективнее и вам более понятно. |
| Автор: PaZ1T1V 2.2.2010, 06:31 |
| Да, забыл сказать, а точнее и не думал даже о том, что остальная обработка сообщений будет игнорирована, тут выхода два: или делать через обработчик нужного контрола, как предлагал сначала я а потом KelTron или обрабатывать все в классе вплоть до последней буковки и нажатия мыши, причем нажатие должно обрабатываться по разному на каждом контроле....как это сделать я не знаю... |
| Автор: styu 2.2.2010, 23:21 |
| Пока боюсь всех обнадеживать, но на работе форма грузится нормально, достаточно шустро, дома она здорово зависала. Не знаю связано ли это как -то с тем, что у меня на работе стоит VS2003, а дома VS2005. И на работе форма ведет себя адекватно и даже при нажатии на клавишу Del, появляется окошко с вопросом, но как-то не стабильно работает, как мне кажется, реакция на разрешение на удаление и отказ от него, завтра еще буду тестировать |