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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка событий у динамически созданных объектов 
V
    Опции темы
SneG0K
Дата 9.11.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



Допустим есть динамически созданная форма.
Код

Form main = new Form();

Как добавить этой форме обработчик допустим на событие Paint()?
PM WWW Skype   Вверх
diadiavova
Дата 9.11.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Код

Form main = new Form();
main.Paint += main_Paint;
main_Paint - имя обработчика ессно


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
mrbrooks
Дата 9.11.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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




Цитата(SneG0K @  9.11.2009,  15:25 Найти цитируемый пост)
Как добавить этой форме обработчик допустим на событие Paint()? 

Код

public Form()
{
...
this.Paint +=new PaintEventHandler(Form_Paint);
}

public void Form_Paint(object sender, PaintEventArgs e)
{
    MessageBox.Show("ыыы-ыыы-ыыы");
}


Припоздал.

Это сообщение отредактировал(а) mrbrooks - 9.11.2009, 15:33
PM MAIL   Вверх
diadiavova
Дата 9.11.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Хотя более полная форма
Код

            Form main = new Form();
            main.Paint += new PaintEventHandler(main_Paint);
И после того, как введёшь main.Paint += жми табулятор, а если надо вставить обработчик в код, то дважды.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SneG0K
Дата 9.11.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



Код

using System;
using System.Windows;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {
        static GraphicsDevice device = null;

        static void InitDevice(IntPtr handle)
        {
            PresentationParameters presentParams = new PresentationParameters();

            presentParams.IsFullScreen = false;

            presentParams.BackBufferCount = 1;

            presentParams.SwapEffect = SwapEffect.Discard;

            presentParams.BackBufferWidth = 640;
            presentParams.BackBufferHeight = 480;

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, handle, presentParams);
        }

        

        static void Main(string[] args)
        {

            Form main = new Form();
            main.Width = 640;
            main.Height = 480;
            main.FormBorderStyle = FormBorderStyle.FixedDialog;
            main.StartPosition = FormStartPosition.CenterScreen;
            main.MaximizeBox = false;
            main.MinimizeBox = false;
            main.TopMost = true;
            main.Show();

            main.Paint += new PaintEventHandler(main_Paint);



            InitDevice(main.Handle);


            device.Clear(Microsoft.Xna.Framework.Graphics.Color.Black);


            Console.ReadLine();
        }

        public void main_Paint(object sender, PaintEventArgs e)
        {
            MessageBox.Show("ыыы-ыыы-ыыы");
        }
    }
}

An object reference is required for the non-static field, method, or property 'ConsoleApplication1.Program.main_Paint(object, System.Windows.Forms.PaintEventArgs)'   *\Program.cs    47    27    ConsoleApplication1

Вот так вот. Как исправить?


Это сообщение отредактировал(а) SneG0K - 9.11.2009, 15:40
PM WWW Skype   Вверх
diadiavova
Дата 9.11.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(SneG0K @  9.11.2009,  15:34 Найти цитируемый пост)
Вот так вот. Как это исправить?


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

public void main_Paint(object sender, PaintEventArgs e)
{
    //код обработчика
}
Имя метода не принципиально, а вот параметры конкретного типа должны присутствовать


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
mrbrooks
Дата 9.11.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(SneG0K @  9.11.2009,  15:34 Найти цитируемый пост)
Вот так вот. Как это исправить? 

а зачем так делать. и я, и diadiavova показали же как кошерно.
PM MAIL   Вверх
SneG0K
Дата 9.11.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



А, все. Пока разобрался.

Добавлено через 1 минуту и 49 секунд
Цитата(mrbrooks @  9.11.2009,  14:41 Найти цитируемый пост)
а зачем так делать. и я, и diadiavova показали же как кошерно. 

я понял

Добавлено через 10 минут и 45 секунд
А вот еще вопрос. Как сделать так, чтоб события, на которые не повешены обработчики обрабатывались в самой винде? Как когда при создании формы с помощью WinAPI функцией DefWindowProc()
PM WWW Skype   Вверх
SneG0K
Дата 9.11.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



Просто проблема в том, что как только форма отображается, она сразу зависает. Т.е. крестик не действует, перетащить нельзя. Только когда в консоли нажму энтер, то тогда приложение закрывается и все.
PM WWW Skype   Вверх
math64
Дата 9.11.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



В main_Paint(object sender, PaintEventArgs e) не стоит вызывать MessageBox.Show, а делать только отрисовку. Если нужно вывести нукую-нубудь отладочную информацию, её можно вывести в файл или найти на форме место, куда её вывести.
PM   Вверх
diadiavova
Дата 9.11.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



А у меня другой вопрос: а зачем нужно запускать форму из консольного приложения?
Цитата(SneG0K @  9.11.2009,  15:43 Найти цитируемый пост)
Как сделать так, чтоб события, на которые не повешены обработчики обрабатывались в самой винде?

То есть? Опиши ситуацию и что должно происходить.
Цитата(SneG0K @  9.11.2009,  16:16 Найти цитируемый пост)
Просто проблема в том, что как только форма отображается, она сразу зависает.

Это уже от самой формы зависит. Надо смотреть, что там в коде прописано. Возможно где-то код закливается. Например если в обработчике Paint'а вызвать метод Invalidate, то он будет снова инициировать это событие и вызывать обработчик. То есть получится неявный рекурсивный вызов. Это просто пример.

Добавлено через 1 минуту и 20 секунд
Цитата(math64 @  9.11.2009,  16:26 Найти цитируемый пост)
Если нужно вывести нукую-нубудь отладочную информацию, её можно вывести в файл или найти на форме место, куда её вывести. 

Для вывода отладочной информации существует Debug.WriteLine


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SneG0K
Дата 9.11.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



Цитата(diadiavova @  9.11.2009,  15:27 Найти цитируемый пост)
а зачем нужно запускать форму из консольного приложения?

Такие у меня тараканы. Мне нужно чтоб открывалось консольное окно, туда будут вводится некоторые команды, а результат будет выводится в появившемся окне.

Добавлено через 3 минуты и 28 секунд
Цитата(diadiavova @  9.11.2009,  15:27 Найти цитируемый пост)
Это уже от самой формы зависит.

Код

static void Main(string[] args)
        {

            Form main = new Form();
            main.Width = 640;
            main.Height = 480;
            main.FormBorderStyle = FormBorderStyle.FixedDialog;
            main.StartPosition = FormStartPosition.CenterScreen;
            main.Visible = true;
            main.Activate();


            InitDevice(main.Handle);


            device.Clear(Microsoft.Xna.Framework.Graphics.Color.Black);
            

            Console.ReadLine();
        }


Вот например так. Форма просто создается и отображается. Зацикливаний нигде нет. Даже неявных. Обработки событий нет. Но форма виснет. Мож я ее создаю не правильно?
PM WWW Skype   Вверх
math64
Дата 9.11.2009, 16:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



В консольном приложении можно использовать формы -  можно делять вывод в консоль, но нельзя делать Console.ReadLine() пока форма не закроется. После зоздания формы нужно вызвать Application.Run(main); чтобы форма могла реагировать на нажатие кнопок.
PM   Вверх
diadiavova
Дата 9.11.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(SneG0K @  9.11.2009,  16:32 Найти цитируемый пост)
Мне нужно чтоб открывалось консольное окно, туда будут вводится некоторые команды, а результат будет выводится в появившемся окне.
А почему для ввода команд не создать диалог с удобным интерфейсом типа списка команд и всё такое?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SneG0K
Дата 9.11.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

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



Цитата(diadiavova @  9.11.2009,  15:36 Найти цитируемый пост)
А почему для ввода команд не создать диалог с удобным интерфейсом типа списка команд и всё такое? 

Ну, было решение использовать в качестве такого диалога консоль

Добавлено через 45 секунд
diadiavova, наверное буду переделывать
PM WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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