Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Доступ к элементу формы извне

27K
12 июня 2007 года
Shens
14 / / 12.06.2007
Мне неоьходима win forma только как окошко с label в котором будет писаться лог, как можно обращаться к label за пределами класса в form.h ? Пробовал написать функцию в классе, но если делать её static то нельзя обратиться из неё к labely. Как сделать это грамотно ?
5.1K
12 июня 2007 года
freestyler
102 / / 23.02.2007
А зачем тебе статический метод, возьми обычный, тебе же экземпляр класса всё-равно создавать, а иначе зачем эта форма.И будет что-то вроде такого:
Код:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public TextBox GetTextBox()
        {
            return textBox1;
        }
}
5.1K
12 июня 2007 года
freestyler
102 / / 23.02.2007
Предполагается, что ты создал контрол типа textBox1.
5.1K
12 июня 2007 года
freestyler
102 / / 23.02.2007
Или можно так. Пусть где-то у тебя уже создана форма с твоим Label, т.е.
 
Код:
Form1 f1 = new Form1();
. Тогда, ты можешь написать так(на примере textBox):
 
Код:
TextBox textBox2=new TextBox();
            Control [] c = f1.Controls.Find("textBox1", true);
            if (c.Length != 0)
            {
                textBox2.Dispose();
                textBox2 = (TextBox)c[0];
            }

где textBox2-промежуточная переменная, а твой "label" называется "textBox1", т.е ты ищешь его по имени среди всех контролов данной формы.
27K
12 июня 2007 года
Shens
14 / / 12.06.2007
Спасибо. А просто публичным я не могу его сделать? Чтобы затем писать form1->label1.... ?
5.1K
12 июня 2007 года
freestyler
102 / / 23.02.2007
Можешь. Но тем самым ты нарушишь главный принцим ООП. Оно тебе надо? Хотя приложение твоё, ты в нём бог и творец, но другие могут не понять. Не просто так эти принципы придуманы.
5.1K
12 июня 2007 года
freestyler
102 / / 23.02.2007
Ты на чём пишешь? По твоим сообщениям видно, что точно не на C#.
Код приведён для C#!
27K
13 июня 2007 года
Shens
14 / / 12.06.2007
Да я понял что C#, я на C++.
Спасибо, понятно про ООП. А где бы вообще этой всей мудрости почитать и поучиться ? А то много время трачу на msdn и не хватает порой всё же, а точнее слишком много информации, трудно разобрать порой..
713
13 июня 2007 года
Ap0k
360 / / 13.03.2006
Почитай С++ для чайников.
Зачем понадобилось получать доступ к форме из вне? /могу ошибаться, но в 90% случаев, доступ из вне получать не нужно/
5.1K
13 июня 2007 года
freestyler
102 / / 23.02.2007
Да эта мудрость не только книжки. Это опыт. Я уж по себе знаю. Пока сам не сделаешь,сам не ошибёшся, сам не помучаешься не поймёшь.
27K
13 июня 2007 года
Shens
14 / / 12.06.2007
Ну а как мне например как я в начале писал вести лог? Ну я пытался реализовать функцию вида AddLog(String^ aaa); в форме, тоже не удалось её сделать внешней или же она не имела доступа к labely... Много времени потратил, всё незнакомо)
713
13 июня 2007 года
Ap0k
360 / / 13.03.2006
[Offtop]
Эх, напоминает ситуацию вокруг дельфи.. года так три-четыре назад, когда удобная IDE првлекла много разработчиков уровня hello world, без базовых знаний :-(
Настала участь C#.
По теме ничего сказать не могу, довольно трудно понять что именно надо. Наверно нужно почитать про классы для начала..
5.1K
13 июня 2007 года
freestyler
102 / / 23.02.2007
Ap0k Я с тобой согласен. А по поводу лога. Вообще-то плохо понятно, чт оты хочешь. Но логи ведуться так:
1) Пишутся сообщения лога в файл
2) Читаются из файла куда надо и как надо

Или наоборот. Я плохо понимаю, как использовать label для отображения лога. ListBox ещё куда не шло.А вообще есть класс Log(MSDN forever) для вудения лога, есть класс FileStream или StreamReader для чтения из файла. И вообще я тебе советую задуматься, а может есть лучшая реализация задумки, чем отображение лога в label.
27K
13 июня 2007 года
Shens
14 / / 12.06.2007
Ну listbox, не суть) просто было интересно как обращаться к функциям извне.
27K
14 июня 2007 года
Shens
14 / / 12.06.2007
Проблема пошла от того, что
при добавление ну хотя бы так:

Код:
public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }
        bool Blabla()
               {
            return true;
               }


и затем в maine

 
Код:
Form1::Blabla();


получаем:


.\WinFormPractice.cpp(18) : error C2352: 'WinFormPractice::Form1::Blabla' : illegal call of non-static member function
5.1K
14 июня 2007 года
freestyler
102 / / 23.02.2007
Проблемы тут нет. Просто если ты не указываешь модификатор доступа, то по умолчанию он private. А если ты напишешь
 
Код:
public bool Blabla()
то всё будет нормально.
27K
14 июня 2007 года
Shens
14 / / 12.06.2007
 
Код:
public: bool Blabla()
        {
            return true;
        }


Увы но аналогичная ошибка.
5.1K
15 июня 2007 года
freestyler
102 / / 23.02.2007
Цитата: Shens
 
Код:
public: bool Blabla()
        {
            return true;
        }


Увы но аналогичная ошибка.


:mad: :mad: :mad: Что это за двоеточие после public???
Копируй в копьё(2 формы Form1 и Form2)

Код:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Form2 f2 = new Form2();
            f2.Blabla();
            f2.Show();
        }
       
    }
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
           
        }
        public void Blabla()
        {
            this.Text = "TESTER";
        }
    }

У меня ВСЁ работает. Тут нечему не работать.
27K
15 июня 2007 года
Shens
14 / / 12.06.2007
Я извиняюсь если неявно сказал( я писал мб просто не заметили ) я пишу на С++. Там нужно двоеточкие и это действительно не работает.

А зачем 2 формы? Так ещё не пробовал, утром посмотрю.
5.1K
15 июня 2007 года
freestyler
102 / / 23.02.2007
2 формы просто для демонстрации, что всё работает.
713
15 июня 2007 года
Ap0k
360 / / 13.03.2006
freestyler, не сбивай человека с пути истинного. (лучше попробуй объяснить :-))
Для обращения к экземпляру окна (или любого другого класса) нужно писать не имя класса, а имя переменной, хранящей ссылку на экземпляр класса, при этом, разумеется должны быть установлены соответствующие модификаторы доступа ([COLOR=blue]public[/COLOR]).
Т.е. в данном случае нужно писать что-то вроде:
[COLOR=teal]Form1[/COLOR] frmLog = [COLOR=blue]gcnew[/COLOR] Form1();
frmLog->Append([COLOR=darkred]"Hello world"[/COLOR]); [COLOR=green]//Заметь не Form1::Append[/COLOR]
Чтобы обращаться к методу не имея экземпляра нужно пометить его как [COLOR=blue]static[/COLOR][COLOR=black], но тогда этот метод не сможет получить доступ к нестатическим переменным класса, к тому же [COLOR=teal]ListBox[/COLOR] например. [/COLOR]
[COLOR=black]Когда станет понятным всё это можно будет подумать и о реализации этого в статическом варианте, хотя.. это и не востребовано скорее всего, да и к тому же реализация будет полу-кривая.[/COLOR]
PS: в принципе все это хорошо в книгах описано.
27K
15 июня 2007 года
Shens
14 / / 12.06.2007
Спасибо большое за объяснение, у меня подобная мысль давно вертелась, но вот проблемка....
 
Код:
Form1 frmLog = gcnew Form1();
    Application::Run(frmLog);


На такое, на первую строчку, выдастся вот что:
.\WinFormPractice.cpp(16) : error C3673: 'System::Windows::Forms::Form' : class does not have a copy-constructor

На второй тоже ошибка(
713
15 июня 2007 года
Ap0k
360 / / 13.03.2006
Так:
[COLOR=teal]Form1[/COLOR]^ frmLog = [COLOR=blue]gcnew[/COLOR] Form1(); [COLOR=green]//указатель
[/COLOR] [COLOR=teal]Application[/COLOR]::Run(frmLog);
27K
15 июня 2007 года
Shens
14 / / 12.06.2007
Ура! Спасибо. Как я не подумал....
Теперь всё стало яснее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог