| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Доступ к переменным внутри проекта |
| Автор: crang 2.6.2005, 16:36 | ||||||
Есть проект из двух форм, в первой определяются переменные для использования во второй . Пробовал объявить в первой форме, после объявления класса формы
и без "public" и с инициализацией и без:
и вот из другой формы никак не могу найти эти someVar'ы пытался обратиться напрямую по имени - говорит нет такого объекта в данном нэймспейсе, пробовал как к объекту главной формы - и там нету такого объекта
подскажите плз - как должно быть? |
| Автор: redrick 2.6.2005, 16:49 |
| какие ошибки валятся ? сам объект создается ? |
| Автор: crang 2.6.2005, 17:10 | ||||
Если в первой форме написать
а во второй
то пишет : The name 'klbhost' does not exist in the class or namespace 'clbftp_daemon.Tunes' |
| Автор: simanyay 2.6.2005, 17:21 |
| Ну дык ты же переменные класса создаешь в классе MainForm, а в методе button1_Click(...) класса Tunes ты пытаешься вызвать их, как если бы они были объявлены внутри класса Tunes. Это всё относилось ко второму примеру, поскольку первый я не очень понял |
| Автор: crang 2.6.2005, 17:27 |
| simanyay так об этом я и спрашиваю - а где их тогда объявлять чтоб было видно отовсюду? |
| Автор: simanyay 2.6.2005, 17:30 | ||||
А вообще лучше тебе создать свойства для public переменных. ИМХО, все переменные должны быть закрыты, а доступ к ним должен быть только из методов или свойств.
А вот глобальных переменных в C#, насколько я знаю, нет. Что и правильно. Ещё почитай вот это: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrftypesaccessmodifiers.asp |
| Автор: Kurt 2.6.2005, 18:24 | ||||||||||
Думаю, это не будет работать. Этим кодом ты во второй форме создаешь ДРУГОЙ объект класса MainForm, к-й будет иметь СВОИ значения соотв. полей. Как я понимаю, задача сводится к следующему: есть две формы. Form1 вызывает Form2. Причем в Form2 нужно получить значение некоторого поля из Form1. Я бы решил эту задачу так. 1) объявил бы private-переменную в классе Form1:
2) написал бы Property для доступа у этому полю:
3) В классе Form2 создал бы конструктор, к-й бы в качестве входного параметра принимал ссылку на Form1:
4) Все. Теперь я могу обращаться к полям первой формы:
З.Ы. Кстати, в Java то же самое. |
| Автор: Tomcat 2.6.2005, 18:25 | ||||
Свои пять копеек... Для этих целей в ООП обычно используют открытые статические переменные. Вот хорошая конструкция Singleton-класса (класса, для которого может существовать только один экземпляр объекта). Грубо говоря, глобальная переменная строго определенного типа.
|
| Автор: simanyay 2.6.2005, 18:31 | ||
Я по другому понял задачу. Я понял, что необходимо просто использовать внешние переменные другого класса. |
| Автор: crang 3.6.2005, 10:09 |
| Ух уж это ООП.. Kurt Спасибо за разъяснение, технологию я понял. Простите за невнятное описание проблемы - учусь ведь вот |
| Автор: Дрон 3.6.2005, 12:38 | ||
Вообще, то что ты делаешь это очень плохо. Дочерняя форма не должна зависеть от родительской... Но это уже детали |
| Автор: crang 3.6.2005, 15:11 |
| Дрон я это уже понял - использую tabControl |
| Автор: Zdvig 4.9.2005, 14:30 |
| Как к textBox первой формы присвоить значение textBox воторой формы. У первого текстового поля видимость выставлена public. Ни одн из вышеперечисленных способов не помогает... То же отностится и к текстовым переменным. Во всех случаях они возвращают пустоту, вместо строки... |
| Автор: Kurt 4.9.2005, 14:37 | ||
А ну, покажи как ты это делаешь. Есессно, убрав не относящиеся к делу строчки. |
| Автор: Zdvig 4.9.2005, 15:13 | ||||||
Использую компонент GmailNotifierControl с CodeProject.com, но не как отдельную dll, а интегрированный в мой проект. Из ннего: Делаю экземпляр класса Form1.
Далее в программе:
|
| Автор: mr.DUDA 4.9.2005, 15:28 | ||||
Вот это интересно. Какой тут может быть "design time" ? В дизайнере добавил на свой GmailNotifierControl форму, что ли ? Если да, посмотри InitializeComponent, может там экземпляр формы уже создаётся автоматически, и код:
просто создаёт ещё одну форму, не относящуюся к делу. |
| Автор: Kurt 4.9.2005, 15:42 |
| Zdvig Постарайся все-таки сделать так, как я http://forum.vingrad.ru/index.php?showtopic=54207&view=findpost&p=430124. То есть передавай ссылку на форму через конструктор, а не создавай еще одну форму. |
| Автор: Zdvig 4.9.2005, 15:59 |
| Я так пробовал, уже просто незнаю что делать.... Конструкции типа private Form1 frm1 и дальнейшее обращение к frm1 вообще не работают. Пишет не найден Form1 в неймспейсе. Выкладываю всю программу, может посмотрите что так как. Я просто бессилен тут.... |
| Автор: mr.DUDA 4.9.2005, 17:38 |
| Держи, вот твоя программа с исправлениями: |
| Автор: Zdvig 4.9.2005, 18:26 | ||
Значит все беда была из за
Меня щас расплющит от моего ламерства mr.DUDA Спасибо тебе огромное!! |
| Автор: mr.DUDA 4.9.2005, 20:45 | ||||||
Да нет, просто ты форму создавал по новой, хотя форма уже была. Контрол твой "NotifierInfo" нужно было создавать конструктором, принимающим параметр типа "форма" со значением, указывающим родительскую форму:
соответственно:
и далее, обработчик события "клик по label1 внутри балуна NotifierInfo" должен не создавать новый объект "форма", а использовать реально существующий, т.е. тот который был передан в параметре конструктора NotifierInfo:
|
| Автор: Zdvig 4.9.2005, 20:56 | ||
Этого я даже предположить не мог PS: сложно как-то в C# обстоят дела с доступом к переменным. |
| Автор: mr.DUDA 4.9.2005, 23:14 |
| Да всё логично. В конструктор подчинённого объекта передаётся ссылка на вышестоящий объект. Далее подчинённый объект (NotifierInfo) общается с вышестоящим (Form1) только через эту ссылку. Почему ? Ну представь себе, к примеру, такой случай. Есть дерево, состоящее из узлов. Узлами в дереве являются объекты. Друг о друге они почти ничего не знают, и не должны, т.к. в дереве порядок следования объектов - совершенно произвольный. Теперь попробуй сделать так, чтобы объекты могли взаимодействовать между собой. Как организовать связи между вышестоящими и подчинёнными объектами ? Естественным решением является наличие в объекте таких полей как Parent и Children. В твоём примере тоже как бы дерево, но состоящее всего из двух узлов - Form1 и NotifierInfo. Ну а теперь самое главное: откуда узел "NotifierInfo" узнаёт об узле "Form1", который для него как-бы Parent ? Другими словами, как получить информацию для сохранения в поле Parent (у тебя это NotifierInfo.frm1) ? Открыть свойство Parent на запись всему миру ? Это абсолютно неприемлемо с точки зрения объектно-ориентированного программирования, потому что такое свойство инкапсулировано в объекте и внешнему миру должно быть открыто только для чтения ! Вот поэтому и приходим к такой парадигме: если у объекта есть данные, которые инициализируются один раз при создании объекта, эти данные должны быть проинициализированы в конструкторе (явно либо неявно). Отсюда и вытекает код, принимающий в конструкторе NotifierInfo ссылку на форму и сохраняющий эту ссылку в поле frm1. P.S. надеюсь, понятно объяснил |
| Автор: Zdvig 5.9.2005, 15:28 |
| mr.DUDA Ага, пример удачный |
| Автор: xsb3 2.12.2006, 03:16 |
| Народ вот ссылка на мой проект. http://xsb3.ifolder.ru/544137 в нем необходимо из формы 1 вызвать форму 2 в форме 2 есть поля textBox. находящийся текст в которых должен после нажатия кнопки ОК записаться в listView формы 1. Если кто сможет исправить выложите потом ссылку на фаилы наверно всем пример будет интересен. |