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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Читаю Петцольда, возникают вопросы... 
:(
    Опции темы
elvad
Дата 21.4.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! Учусь по Петцольду - Программирование для Microsoft Windows на С#. Знаком только с основами Си. Дошёл до Главы2. "Обработка события Paint". Появились непонятные моменты. (Я в код добавил свои комментарии. И проект создавал пустой). Вот программа из книги:
Код

using System;
using System.Windows.Forms;
using System.Drawing;

class Simple
{
    public static void Main()
    {
        Form form1 = new Form();
        form1.Paint += new PaintEventHandler(form1_Paint);
        Application.Run(form1);
    }
    
    static void form1_Paint(object sender, PaintEventArgs pea)
    {
        Graphics g = pea.Graphics;
        g.Clear(Color.Chocolate);
        Console.WriteLine("Paint event");//не запускается, срабатывает только MessageBox.Show()
    }
 }


По этому коду такие вопросы:
1) Правильно ли я  понимаю, что при создании обработчика события form1_Paint в параметрах указано, что создаются объект sender из класса object и объект pea из класса  PaintEventArgs)
2) Можно ли сравнить создание обработчика событий из делегата, с созданием объекта из класса.
3) Я пытаюсь включить в обработчик событий form1_Paint изменение названия Form1:
form1.Text = "New name"; 
но возникает ошибка "name form1 does not exist in current context"
PM MAIL   Вверх
Kefir
Дата 21.4.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



1) не совсем. обработчик события - это обычная функция. object sender, PaintEventArgs pea - это её аргументы. они, конечно, где-то создаются, но не в самом обработчике. проще говоря, где-то в классе формы есть строка this.Paint(this, new PaintEventArgs(...)).
2) очень отдалённо, но можно.
3) значит нет такой переменной. а нет потому, что ты её объявил в методе Main, то есть её звать можно только там. Тут есть два варианта. Первый вариант - это брать форму из аргумента sender (в sender хранится обьект, который вызвал Paint). то есть ты можешь написать
Код

(sender as Form1).Text = "New name";

Или объяви form1 как член класса Simple
Код
using System;
using System.Windows.Forms;
using System.Drawing;
class Simple
{
    Form form1 = new Form();
    public static void Main()
    {
        form1.Paint += new PaintEventHandler(form1_Paint);
        Application.Run(form1);
    }
    
    static void form1_Paint(object sender, PaintEventArgs pea)
    {
        Graphics g = pea.Graphics;
        g.Clear(Color.Chocolate);
        Console.WriteLine("Paint event");// открой консоль в студии - там он тебе это покажет при дебаге
        form1.Text = "New name";
    }
 }

PM MAIL WWW Skype   Вверх
WarHog
Дата 22.4.2008, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(elvad @ 21.4.2008,  15:55)
Код

Console.WriteLine("Paint event");//не запускается, срабатывает только MessageBox.Show()

Не запускается, очевидно, из-за того, что выбран тип приложения Windows, а не Console (опциями компилятора, если компилишь из строки csc или в Project Properties->Application->Output type)
--------------------
PM MAIL   Вверх
Kefir
Дата 22.4.2008, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



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

Добавлено через 1 минуту и 47 секунд
и тип приложения к этому не имеет никакого отношения. просто если вы пишете консольное приложения - вы его запускаете в консоли и видите вывод. а если винформсы, то консоли вы не видите («Ты суслика видишь? — Нет. — И я нет. А он есть!»). вот так.  smile 
PM MAIL WWW Skype   Вверх
thomas
Дата 22.4.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



WarHog
Цитата

 а если винформсы, то консоли вы не видите 

= output
 smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
WarHog
Дата 22.4.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Kefir, это понятно smile
Я и имел в виду, что если выбрать winforms, то консоли не будет видно, просто не так выразился  smile 
--------------------
PM MAIL   Вверх
elvad
Дата 22.4.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Kefir
Спасибо за разъяснение! Я использую Visual C# 2008 Express.
Первый вариант получился, когда я написал (sender as Form).Text = "New name"; 
А вот на второй выдаёт ошибку An object reference is required for the non-static field, method, or property 'Simple.form1'

Ещё внутри функции form1_Paint есть строки:
Graphics g = pea.Graphics;
g.Clear(Color.Chocolate);
Петцольд пишет, что PaintEventArgs содержит свойство Graphics, которое включает в себя экземпляр класса System.Drawing.Graphics (пока не могу понять, как свойство может включать в себя целый объект smile ).
А g это объект типа Graphics. Какой смысл записывать две строки кода и создавать g, когда я написал одну строку 
pea.Graphics.Clear(Color.Chocolate); 
и приложение запустилось с тем же эффектом?

Это сообщение отредактировал(а) elvad - 22.4.2008, 09:32
PM MAIL   Вверх
Kefir
Дата 22.4.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



Цитата(elvad @  22.4.2008,  09:32 Найти цитируемый пост)
А вот на второй выдаёт ошибку An object reference is required for the non-static field, method, or property 'Simple.form1'

покажи что у тебя написано, такое впечатление что ты пытаешься использовать не static мембера как будто это static (например вместо form1.Text = "" написано Form.Text = "").


Цитата(elvad @  22.4.2008,  09:32 Найти цитируемый пост)
А g это объект типа Graphics. Какой смысл записывать две строки кода и создавать g, когда я написал одну строку 
pea.Graphics.Clear(Color.Chocolate); 
и приложение запустилось с тем же эффектом?

ну тут два смысла может быть:
1. показательный (показать какой именно класс у pea.Graphics)
2. часто так делается для удобства, чтобы каждый раз не писать pea.Graphics, а использовать просто g.

Это сообщение отредактировал(а) Kefir - 22.4.2008, 10:40
PM MAIL WWW Skype   Вверх
elvad
Дата 22.4.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да собственно, тот код который ты предложил в самом начале, я вставляю в файл проекта и жму F5. Появляется эта ошибка.
PM MAIL   Вверх
Kefir
Дата 22.4.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



тогда проект запости
PM MAIL WWW Skype   Вверх
source777
Дата 22.4.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



elvad, возьми себе что-нить попроще Петцольда почитать, Шилдта например. А то такое ощущение, что ты не понимаешь то, что читаешь...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
elvad
Дата 23.4.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Kefir
Вот проект http://slil.ru/25720197 

Source777
Может ты и прав, у Петцольда по консоли немного примеров, хотя он в предисловии пишет, что для чтения небходимо знание С. (наверное очень хорошее знание   smile ).
Посмотрю Шилдта...
PM MAIL   Вверх
Kefir
Дата 23.4.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



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

    public static void Main()
    {
        MyMightyApplication mma = new MyMightyApplication();
    }


А вообще по хорошему надо делать главную форму, в которой делать все дела. То есть примерно так:
Код

    public class MyMainForm : Form
    {
        // здесь вся твоя логика и тому подобное
    }
    public static void Main()
    {
        MyMainForm mmf = new MyMainForm ();
        Application.Run(mmf);
    }

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

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


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

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


 




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


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

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