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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> доступ к свойству???? 
:(
    Опции темы
diadiavova
Дата 9.7.2009, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Form1 f = new Form1();
//здесь код доступа к свойству, полю и тд
// MessageBox.Show(f.textBox1.Text); //это пример
Application.Run(f);

либо так
Код

Application.Run(new Form1());
Form1 f = Application.OpenForms[0];
//код писать здесь
//MessageBox.Show(f.textBox1.Text); //это пример

Только зачем всё это  smile 


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


Шустрый
*


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

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



Цитата(Экскалупатор @ 9.7.2009,  00:33)
Stratus, попробуйте просто в дизайнере открыть вкладку свойства тектстбокса и там поставить паблик.

мне вот интересно а как вы его вызываете в маине, если у вас нету экземпляра класса Form1? или все таки есть? покажите код пожалуйста.

Вы же меня упрекали по поводу создания второго экземпляра класса...... 
Код

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());//я так полагаю вот эта вот строка как раз и есть экземпляр класса и визуализация формы
            
        }
        public static void func()
        {
            //Form1 fr = new Form1();
            Console.WriteLine(obj.textbx);
        }
    }
}

поставил паблик в дизайнере но серавно не видит

Это сообщение отредактировал(а) Stratus - 9.7.2009, 07:06
PM MAIL   Вверх
Stratus
Дата 9.7.2009, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(diadiavova @ 9.7.2009,  02:09)
Только зачем всё это  smile

ну думаю затем что бы в классе вызвать экземпляр другого класса(формы1) не создавая новый и там работать с его объектами....

или есть более короткий путь???
PM MAIL   Вверх
diadiavova
Дата 9.7.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Класс Programm существует для запуска приложения. И хотя в принципе можно и в него всякого понатыкать, но лучше в нём выполнить код инициализации и забыть про него. Другой вопрос, что код инициализации может ссылаться и на главную форму, тогда конечно, доступ к ней нужен. В моём примере должно вроде всё работать.
Возьмём например случай, когда наше приложение может открывать текстовые файлы и если такой файл открывается с его помощью, то он отобразится в текстбоксе (как в блокноте). В этом случае метод Main может выглядеть так
Код

        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 frm = new Form1();
            if(args.Length > 1) 
            {
                 frm.textBox1.Text = System.IO.File.ReadAllText(args[1]); 
             }
            Application.Run(frm);
        }

Надеюсь ничего не напутал smile 
Теперь, если контекстном меню текстового файла выбрать "Открыть с помощью" и найти нашу программу, то содержимое файла отобразится в textBox1. 
А делать что-то другое в этом классе как-то не очень принято. smile 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



Цитата

Вы же меня упрекали по поводу создания второго экземпляра класса...... 

да я упрекал и сам себе не перечу.
Код

 Application.Run(new Form1());//я так полагаю вот эта вот строка как раз и есть экземпляр класса и визуализация формы

эта строка не возвращает вам ссылку на форму которую вы запустили,
т.е. это НЕ экземпляр класса, экземпляр класса это form в моем примере:
Код

Form1 form = new Form1();


по этому вы и не можете обратиться обратиться в вашему запущенному классу, нужно запустить форму либо "руками", либо как писал diadiavova:
 
Цитата

Form1 f = new Form1();
//здесь код доступа к свойству, полю и тд
// MessageBox.Show(f.textBox1.Text); //это пример
Application.Run(f);

либо так
    
Application.Run(new Form1());
Form1 f = Application.OpenForms[0];
//код писать здесь
//MessageBox.Show(f.textBox1.Text); //это пример


и в первом и во втором случае у вас остается f(в моем случае form), которая является экземпляром класса и с которой в последствии можно работать, но по сути это тот же запуск "руками", который я вам советовал сразу. 

вот вам пример почему у вас не работает: 
Представте себе метателя молота. он бросает молот(это наш метод Application.Run(new Form1());), но после этого он хочет им управлять. вопрос как ему это сделать? правильно, нужно до броска привязать к молоту "веревочку"и потом за нее дергать во время полета. роль этой веревочки и выполняет ээкзеспляр класса(в нашем случае "f"). а без него ничего не получиться и молот будет благополучно лететь пока не упадет...

но действительно, для чего это делать? обычно в Main ничего такого не пишут, да и смысла особого нету. если вы работаете с winForm тогда у вас все завязывается на обработчики событий, вот и обрабатывайте их, пишите классы обработчики, и "забудьте" про Main, будет меньше путаницы(ИМХО).

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


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


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

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



Кстати, ещё информация к размышлению. В бейсике вообще никакой процедуры Main нет и класса в котором она определена - тоже. При желании всё это можно создать, но обычно это делает компилятор и неплохо с этим справляется. К чему я это... там должен быть просто стандартный код, по крайней мере в большинстве случаев. Пример с чтением аргументов командной строки - это случай когда можно что-то добавить, но даже без этого можно обойтись.


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


Новичок



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

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



Код

static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Form1 newform = new Form1();
            newform.Show();
            MessageBox.Show(newform.textBox1.Text);

        }
    }

 вот все чудесно вытаскивает smile не понемаю в чем у вас проблема 
PM MAIL WWW ICQ   Вверх
Экскалупатор
Дата 10.7.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



в том что у него нету вот этой строчки:
Form1 newform = new Form1();
PM MAIL ICQ   Вверх
Stratus
Дата 18.7.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

    static class Program
    {
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        public static void func()
        {
            /* Вот тут я не хочу создавать второй экземпляр формы  
             * мне нужно увидеть первый экземпляр. Если я его создаю
             * в методе Main и запускаю его Run то здесь его невидно всеравно.
             * вы же все говорите что ненадо создавать второй экзмепляр.
             * Мне нужно здесь обратьтся к полю обьекта формы Form1.
             * Как мне здесь увидеть Form1.textbx.text ?????? и ничего больше....
        }
    }


это другой класс
Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string textbx
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Program.func();
            
        }
    }



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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



найди десять отличий.
вариант № 1(не рабочий):
Код

 static class Program
    {
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        public static void func()
        {
            /* Вот тут я не хочу создавать второй экземпляр формы  
             * мне нужно увидеть первый экземпляр. Если я его создаю
             * в методе Main и запускаю его Run то здесь его невидно всеравно.
             * вы же все говорите что ненадо создавать второй экзмепляр.
             * Мне нужно здесь обратьтся к полю обьекта формы Form1.
             * Как мне здесь увидеть Form1.textbx.text ?????? и ничего больше....
        }
    }

вариант №2(рабочий):
Код

static void Main()
        {
            Form1 form1 = new Form1();
            Application.Run(form1);
        }
        public static void func()
        {
            MessageBox.Show(form1.textbx.Text);
        }


мне кажется, что вы немного путаете: Form1 - это ваш класс(не экземпляр класса, а сам КЛАСС) и вы с ним ничего из Main не сделаете, а form1 - это как раз таки ЭКЗЕМПЛЯР КЛАССА Form1, а вот с ним уже можно работать.(разница в одной букве всего Form1 | form1) я думаю это вас и путает.

Это сообщение отредактировал(а) Экскалупатор - 19.7.2009, 18:20
PM MAIL ICQ   Вверх
diadiavova
Дата 19.7.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Экскалупатор @  19.7.2009,  19:10 Найти цитируемый пост)
вариант №2(рабочий):

В таком виде второй вариант - тоже нерабочий. Переменная form1 объявлена внутри метода и из другого её увидеть нельзя.
Stratus, а чем не подошёл вариант с передачей ссылки на форму через параметр функции?

Если надо фому найти внутри функции, то это можно сделать при помощи класса Application
У него есть статическое свойство OpenForms, которое возвратит коллекцию всех открытых форм приложения. Так же можно воспользоваться статическим методом ActiveForm класса Form. Он возвратит активную в данный момент форму.


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


Шустрый
*


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

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



Привет!
Извините конечно, что так врываюсь, не прочитав всех постов(лень-матушка:%). НО, насколько я понял, то нужно из метода Main изменить(достучаться) текст какого-то текстбокса, что расположен на форме. Так вот, надо делать вот так:
 
Код


// метод main
    [STAThread]
        ptivate static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
           myForm frm = new myForm1();
frm.TextBoxText = "hello!";
            Application.Run(frm);        

}
 // главная форма
private class myForm : Form
{
// ахтунг: на форме должен быть текстбокс с именем textBox1(если в дизайнере бросить контрол TextBox, то такое имя будет задано по умолчанию)
public string TextBoxText
{
get{return textBox1.Text;}
set{textBox1.Text = value;}
}

// важная фишка: желательно, чтоб у даного текстбокса был модификатор доступа private или protected. Почему? читайте про Инкапсуляцию.
}


Ну вотъ. Извините, если что не так понял. На форум захожу редко, поэтому если есть вопросы или возражения, то стучите или в аську 487653031, или в скайп aleksey.aka.lexx, или спамте мыло [email protected] 
Спасибо за внимание smile 


Это сообщение отредактировал(а) lam0x7C4 - 19.7.2009, 20:15
PM MAIL ICQ   Вверх
Экскалупатор
Дата 19.7.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



diadiavova, да, точно, просто три дн выходных( smile  smile ) дают о себе знать. каюсь и буду внимательнее. 
объявить Form1 на весь класс Program и тогда будет работать. да и вообще я думаю, что автор просто не видит разницы, и по этому помочь ему сложно(имхо).

Но вариант с передачей ссылки мне нравиться больше.

Это сообщение отредактировал(а) Экскалупатор - 19.7.2009, 20:21
PM MAIL ICQ   Вверх
Stratus
Дата 23.7.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(diadiavova @ 19.7.2009,  18:57)
Цитата(Экскалупатор @  19.7.2009,  19:10 Найти цитируемый пост)
вариант №2(рабочий):

В таком виде второй вариант - тоже нерабочий. Переменная form1 объявлена внутри метода и из другого её увидеть нельзя.
Stratus, а чем не подошёл вариант с передачей ссылки на форму через параметр функции?

Если надо фому найти внутри функции, то это можно сделать при помощи класса Application
У него есть статическое свойство OpenForms, которое возвратит коллекцию всех открытых форм приложения. Так же можно воспользоваться статическим методом ActiveForm класса Form. Он возвратит активную в данный момент форму.

Вариант с передачей ссылки подошел - просто хочется в лоб сделать smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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