public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public TextBox GetTextBox()
{
return textBox1;
}
}
Доступ к элементу формы извне
Мне неоьходима win forma только как окошко с label в котором будет писаться лог, как можно обращаться к label за пределами класса в form.h ? Пробовал написать функцию в классе, но если делать её static то нельзя обратиться из неё к labely. Как сделать это грамотно ?
А зачем тебе статический метод, возьми обычный, тебе же экземпляр класса всё-равно создавать, а иначе зачем эта форма.И будет что-то вроде такого:
Предполагается, что ты создал контрол типа textBox1.
Код:
Form1 f1 = new Form1();
Код:
TextBox textBox2=new TextBox();
Control [] c = f1.Controls.Find("textBox1", true);
if (c.Length != 0)
{
textBox2.Dispose();
textBox2 = (TextBox)c[0];
}
Control [] c = f1.Controls.Find("textBox1", true);
if (c.Length != 0)
{
textBox2.Dispose();
textBox2 = (TextBox)c[0];
}
где textBox2-промежуточная переменная, а твой "label" называется "textBox1", т.е ты ищешь его по имени среди всех контролов данной формы.
Спасибо. А просто публичным я не могу его сделать? Чтобы затем писать form1->label1.... ?
Можешь. Но тем самым ты нарушишь главный принцим ООП. Оно тебе надо? Хотя приложение твоё, ты в нём бог и творец, но другие могут не понять. Не просто так эти принципы придуманы.
Код приведён для C#!
Спасибо, понятно про ООП. А где бы вообще этой всей мудрости почитать и поучиться ? А то много время трачу на msdn и не хватает порой всё же, а точнее слишком много информации, трудно разобрать порой..
Зачем понадобилось получать доступ к форме из вне? /могу ошибаться, но в 90% случаев, доступ из вне получать не нужно/
Да эта мудрость не только книжки. Это опыт. Я уж по себе знаю. Пока сам не сделаешь,сам не ошибёшся, сам не помучаешься не поймёшь.
Ну а как мне например как я в начале писал вести лог? Ну я пытался реализовать функцию вида AddLog(String^ aaa); в форме, тоже не удалось её сделать внешней или же она не имела доступа к labely... Много времени потратил, всё незнакомо)
Эх, напоминает ситуацию вокруг дельфи.. года так три-четыре назад, когда удобная IDE првлекла много разработчиков уровня hello world, без базовых знаний :-(
Настала участь C#.
По теме ничего сказать не могу, довольно трудно понять что именно надо. Наверно нужно почитать про классы для начала..
1) Пишутся сообщения лога в файл
2) Читаются из файла куда надо и как надо
Или наоборот. Я плохо понимаю, как использовать label для отображения лога. ListBox ещё куда не шло.А вообще есть класс Log(MSDN forever) для вудения лога, есть класс FileStream или StreamReader для чтения из файла. И вообще я тебе советую задуматься, а может есть лучшая реализация задумки, чем отображение лога в label.
Ну listbox, не суть) просто было интересно как обращаться к функциям извне.
при добавление ну хотя бы так:
Код:
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
bool Blabla()
{
return true;
}
{
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
Код:
public bool Blabla()
Код:
public: bool Blabla()
{
return true;
}
{
return true;
}
Увы но аналогичная ошибка.
Цитата: Shens
Код:
public: bool Blabla()
{
return true;
}
{
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";
}
}
{
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";
}
}
У меня ВСЁ работает. Тут нечему не работать.
А зачем 2 формы? Так ещё не пробовал, утром посмотрю.
2 формы просто для демонстрации, что всё работает.
Для обращения к экземпляру окна (или любого другого класса) нужно писать не имя класса, а имя переменной, хранящей ссылку на экземпляр класса, при этом, разумеется должны быть установлены соответствующие модификаторы доступа ([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: в принципе все это хорошо в книгах описано.
Код:
Form1 frmLog = gcnew Form1();
Application::Run(frmLog);
Application::Run(frmLog);
На такое, на первую строчку, выдастся вот что:
.\WinFormPractice.cpp(16) : error C3673: 'System::Windows::Forms::Form' : class does not have a copy-constructor
На второй тоже ошибка(
[COLOR=teal]Form1[/COLOR]^ frmLog = [COLOR=blue]gcnew[/COLOR] Form1(); [COLOR=green]//указатель
[/COLOR] [COLOR=teal]Application[/COLOR]::Run(frmLog);
Теперь всё стало яснее.