Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Разработка Windows Forms > Как обратиться из класса к форме? |
Автор: Валерия 19.12.2007, 23:25 | ||||
Просьба не говорить что вопрос повторялся. Есть класс, есть форма. В одном из методов класса есть обращение к объекту формы. Но:
Код:
|
Автор: VisualProgrammerNET 19.12.2007, 23:35 |
Самое важное, что в первую очередь нужно понять при изучении C# - то, что всё является объектами. Давай представим твой код с точки зрения автомобилестроения. Ты создаёшь класс (а на обыденном языке это будет означать - чертёж, шаблон, схема, как угодно) Автомобиль. В этом чертеже ты прорисовываешь все детали, все контуры, даже все возможные действия автомобиля (например, "открыть дверь"). Но что будет, когда ты попытаешься в своей программе изобразить следующее: Автомобиль.ОткрытьДверь(). Стоп... Ведь Автомобиль - это всего лишь чертёж. Просто штрихи карандаша на листке бумаги. Как можно сказать листку бумаги с нарисованным автомобилем, чтобы тот открыл дверь? Это, по понятной причине, невозможно. Чтобы претворить задумку в жизнь, нужно сперва по чертежу создать автомобиль. Т.е. написать что-то вроде "Автомобиль МойАвто = new Автомобиль(). Отлично! Теперь МойАвто не является чертежом, а именно самой машиной, созданной по этому чертежу. И вот теперь мы можем легко и спокойно приказать МоемуАвто открыть дверь (МойАвто.ОткрытьДверь() ). Думайте сами, решайте сами ![]() |
Автор: Валерия 19.12.2007, 23:37 |
Но ведь textbox1 это не "чертеж" а уже созданный "автомобиль", но к нему не получается из "далека" обращаться ![]() |
Автор: VisualProgrammerNET 19.12.2007, 23:52 | ||||||||
Текстбокс - нет. Но как мы к нему приходим? WindowsApplication14.Form1.textBox1.Text Эта Form1 и есть как раз только чертёж формы, но не сама форма! В этом-то и загвоздка ![]() Добавлю конкретно по данному примеру: An object reference is required for the nonstatic field, method, or property 'WindowsApplication14.Form1.textBox1' = Требуется ссылка на объект для не статического поля, метода или свойства. Чтобы можно было что-то изменять в классе А из класса Б нужно предоставить сначала классу Б чертёж, по которому он будет знать, что и как работает в классе А. Чтобы работало всё, как положено, следует внести изменения: 1. В классе Form1 создать метод для изменения текста в текстбоксе. Это - инкапсуляция. По умолчанию все контролы создаются с модификатором private, что не позволит менять их из каких-либо других классов. Для изменения мы и создадим данный метод
2. В классе test создать внутреннюю переменную типа Form1 и параметризованный конструктор, чтобы класс test знал, с чем имеет дело.
3. Метод go класса test теперь будет иметь вид
4. Ну и соответственно создаваться класс test из класса Form1 будет строчкой
Вуаля ![]() ЗЫ. Я конечно щас немного в подпитии... но даже простая проверка в Visual Studio: система IntelliSense (автодополнение) не даст написать такой код... (WindowsApplication14.Form1.textBox1.Text) =) |
Автор: Валерия 19.12.2007, 23:59 |
Большое спасибо! |
Автор: informatik 20.12.2007, 00:07 | ||
Ну очень странная, и на мой взгляд абсолютно неправильная конструкция конструкция... ![]() An object reference is required for the nonstatic field, method, or property 'WindowsApplication14.Form1.textBox1' Это означает что ты обращаешься к классу как к таковому, а в программе работа осуществляется с объектами класса, которые создаются после запуска программы. VS ругается что ты пытаешься вызвать статичекий метод, свойство и т.д. которого не существует, и тем более к статическим методам могут обращаться только методы класса. Вообщето все должно быть ну хотябы так:
Или класс test должен быть тоже формой... Добавлено через 1 минуту и 48 секунд Блин пока писал, уже ответили........ нечего было по телефону разговаривать........... ![]() |
Автор: D_F_V 20.12.2007, 10:49 | ||||
В классе можно не указывать начальное значение переменных... ну и this тоже не обязателен... можно написать так...
|
Автор: it_medved 20.12.2007, 10:56 | ||
А можно передать this по ссылке и обращатся к нему:
Только textBox1 необходимо сделать public |
Автор: mr.DUDA 20.12.2007, 12:51 |
Тему закрыл как http://forum.vingrad.ru/index.php?show_type=forum&show_topics_from_subforums=&showtopic=52713&view=all. |