Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вызвать класс в классе формы 
:(
    Опции темы
styu
Дата 28.1.2010, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Есть класс для перехвата нажатия кнопки Del с клавиатуры
Код

    class MyMessageFilter: IMessageFilter
         {    
               ...
          }



Вызываю этот класс в классе формы
Код


   static void Main() 
         { 
                Application.RemoveMessageFilter( new MyMessageFilter);
               Application.Run(new Form1());
              
          }



Отладчик выдает ошибку "No overload for method 'MyMessageFilter' takes '0' arguments"  в строке
Код

      Application.RemoveMessageFilter( new MyMessageFilter);

           
Как можно решить эту проблему, подскажите, пожалуйста

PM MAIL   Вверх
Sfate
Дата 29.1.2010, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Angry Beaver
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 7.9.2008
Где: mov AL, BL

Репутация: нет
Всего: нет



Код

 Application.RemoveMessageFilter( MyMessageFilter MyMsgFltr = new MyMessageFilter);

--------------------
"Начинающий программист твердо уверен, что в 1 кбайте 1000 байт, а опытный точно знает, что в 1 километре 1024 метра..." © Unknown
PM MAIL WWW ICQ   Вверх
KelTron
Дата 29.1.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



А скобки кто добавлять будет?) 
Код

Application.RemoveMessageFilter( new MyMessageFilter());




--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
styu
Дата 29.1.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Sfate,  Спасибо, попробую ..

Добавлено через 50 секунд
KelTron,  В проекте есть, на сайте у меня очепатка получилась :(
PM MAIL   Вверх
KelTron
Дата 29.1.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



А, ну это потому что у тебя нет конструктора по умолчанию в классе MyMessageFilter.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
styu
Дата 29.1.2010, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



KelTron,  
Цитата(KelTron @  29.1.2010,  14:59 Найти цитируемый пост)
А, ну это потому что у тебя нет конструктора по умолчанию в классе MyMessageFilter.


А что это означает? Что надо сделать?

Добавлено через 4 минуты и 15 секунд
Sfate, 
Цитата(Sfate @  29.1.2010,  02:10 Найти цитируемый пост)
1: Application.RemoveMessageFilter( MyMessageFilter MyMsgFltr = new MyMessageFilter);


Я записала так:
Код

MyMessageFilter MyMsgFltr = new MyMessageFilter();
Application.RemoveMessageFilter(MyMsgFltr);

Но ошибка осталась прежней. 
PM MAIL   Вверх
styu
Дата 29.1.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



KelTron, 

Цитата(KelTron @  29.1.2010,  14:59 Найти цитируемый пост)
А, ну это потому что у тебя нет конструктора по умолчанию в классе MyMessageFilter.

Я не сразу поняла, у меня есть конструктор класса
Код

Form1 formochka;
public MyMessageFilter(Form1 f)
    {    
          formochka = f;
     }


PM MAIL   Вверх
Sfate
Дата 29.1.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Angry Beaver
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 7.9.2008
Где: mov AL, BL

Репутация: нет
Всего: нет



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

Application.RemoveMessageFilter( new MyMessageFilter(SomeKindOfForm));

где SomeKindOfForm будет присваиваться как значение f ... естественно вместо SomeKindOfForm пишем свое необходимое значение;)
--------------------
"Начинающий программист твердо уверен, что в 1 кбайте 1000 байт, а опытный точно знает, что в 1 километре 1024 метра..." © Unknown
PM MAIL WWW ICQ   Вверх
styu
Дата 30.1.2010, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Sfate, 

Передо мной стояла задача: 
Есть база, которую отображает DataGrid, мне надо, чтобы при нажатии на клавишу Del клавиатуры, появлялось окошко с вопросом, хочу ли я действительно удалить запись -  это все я реализовала в классе
Код

public class MyMessageFilter: IMessageFilter
 
теперь я не знаю, как из класса формы вызвать класс MyMessageFilter

Цитата(Sfate @  29.1.2010,  22:52 Найти цитируемый пост)
небходимо передавать в функцию какие то значения, или все время будет ошибка о ненулелевых аргументах функции... т.е.код C#1:Application.RemoveMessageFilter( new MyMessageFilter(SomeKindOfForm));highlightSyntax('csharp_mY3Njd','csharp');где SomeKindOfForm будет присваиваться как значение f ... естественно вместо SomeKindOfForm пишем свое необходимое значение;)

Для меня это сложно, я не понимаю, что надо передавать в эту функцию?
PM MAIL   Вверх
Sfate
Дата 30.1.2010, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Angry Beaver
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 7.9.2008
Где: mov AL, BL

Репутация: нет
Всего: нет



styu, Вы, переделываете чужую программую? или... Вы не можете разобрать, что сами написали?

Это сообщение отредактировал(а) Sfate - 30.1.2010, 03:01
--------------------
"Начинающий программист твердо уверен, что в 1 кбайте 1000 байт, а опытный точно знает, что в 1 километре 1024 метра..." © Unknown
PM MAIL WWW ICQ   Вверх
PaZ1T1V
Дата 30.1.2010, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 26.2.2008
Где: Багдад )

Репутация: нет
Всего: нет



а зачем мудрить? зачем создавать свой класс ? не легче ли воспользоваться стандартным MessageBox
if (MessageBox.Show([наш вопрос в кавычках], [заголовок окна тоже в кавычках], MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
            {
                 удалить то что надо
            }
все это делается в обработчике нажатия клавиш и при условии если e.KeyCode == Keys.Del

помоему так, писал по памяти...
или я не правильно понял?

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

PS код класса и формы в студию.... телепатов нету ;)

не так....
Делаем класс, в вашем случае MyMessageFilter: IMessageFilter

делаем конструктор но не по умолчанию
Код


Form form;
private const int WM_KEYDOWN = 0x0100; // нажатие клавиш
private const int WM_MOUSEDOWN = 0x201; // нажатие мышки
private const int WM_CLOSE = 0x10; // закрытие

public MyMessageFilter(Form form)
    {    
          this.form = form;
    }



переопределяем метод PreFilterMessage

Код


 public bool PreFilterMessage(ref Message message)
        {
         
            if (message.Msg == WM_KEYDOWN)
            {
                Keys key = (Keys)(int)m.WParam;
                switch (key)
                {
                   case Keys.Delete:
                        //делаем все что нужно
                        break;
                }
            }
         return false;  
        }

return true; если надо отлавливать это сообщение или false если его надо пропускать



далее открываем Program.cs
Код


  [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();
            MyMessageFilter msgFilter = new MyMessageFilter(form);
            Application.AddMessageFilter(msgFilter);
            Application.Run(form);
        }



вуаля! работает!


Это сообщение отредактировал(а) PaZ1T1V - 31.1.2010, 19:56
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
styu
Дата 1.2.2010, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



PaZ1T1V,  Спасибо, ошибка больше не вылетает. Но при нажатии клавиши del запись не удаляется, но и не появляется окошка с запросом. Выкладываю код класса:
Код


public class MyMessageFilter: IMessageFilter
        {   
            Form1 form;
            private const int WM_KEYDOWN = 0x0100; // нажатие клавиш
            private const int WM_MOUSEDOWN = 0x201; // нажатие мышки
            private const int WM_CLOSE = 0x10; // закрытие    
            
            
            public MyMessageFilter(Form1 form)
            {    
                this.form = form;
            }

            public class WinManager
                {
                    [DllImport("user32.dll")]
                    public static extern IntPtr FindWindow(string className,string windowName);
                    [DllImport("user32.dll")]
                    public static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); 
                }

            public class WindowKiller
            {
                private const uint WM_CLOSE = 0x0010;
                public static void CloseWindow(string className,string windowName)
                {
                    IntPtr hWnd = WinManager.FindWindow(className,windowName);
                    WinManager.SendMessage(hWnd,WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                }
            }

            private void CloseMessageBox()
            {
                WindowKiller.CloseWindow("#32770",null);
            }
                
            public bool PreFilterMessage(ref Message m)
            {    
                if(m.Msg == WM_KEYDOWN)
                {
                    Keys key = (Keys)(int)m.WParam;
                    switch(key)
                    {
                        case Keys.Delete:
                        {
                            string message = "Эта запись будет удалена. Вы хотите удалить запись?";
                            string caption = "Question";
                            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
                            DialogResult result;
                            result = MessageBox.Show(message, caption, buttons,
                                MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, 
                                MessageBoxOptions.DefaultDesktopOnly);
                            
                            if(result == DialogResult.Yes)
                            { 
                                MessageBox.Show("Запись удалена!");
                            }
                            if(result == DialogResult.No)
                            {                                
                                CloseMessageBox();
                                form.oleDbDataAdapter1.Fill(form.dataSet1.Tables["Klapan"]); 
                            }
                            break;
                        }
                    }
                }
            return false;   
            }
                
        }



Далее 
Код


[STAThread]
        static void Main()
        {
            Form1 form = new Form1();
            MyMessageFilter myMessageFilter = new MyMessageFilter(form);
            Application.RemoveMessageFilter(myMessageFilter);
            Application.Run(new Form1());
         }



PM MAIL   Вверх
KelTron
Дата 1.2.2010, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Да тут класс совсем не нужен, только сильно усложняет всё. 
Лучше сделать как PaZ1T1V предлагал через обычный обработчик:
Код

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete)
    {
        var res = MessageBox.Show("Удалить?", "Подтверждение", MessageBoxButtons.YesNo,
            MessageBoxIcon.Question);
        if (res != DialogResult.Yes)
        {
            e.Handled = true;
        }
    }
}




--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
PaZ1T1V
Дата 1.2.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 26.2.2008
Где: Багдад )

Репутация: нет
Всего: нет



поставте return true, я ж писал, что return false для того, чтобы игнорировать обработку сообщения
PS должно все заработать smile
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
styu
Дата 1.2.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



PaZ1T1V,  установила return true, ничего не изменилось
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1351 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.