Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Windows forms, VS2008 C++ где взять ссылку на объект класса главной формы?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Goofy
Переписываю интерфейс к внешнему устройству (КОМ порт) на Visual Studio, работаю через windows forms.
Обработка пакетов и входящих сообщений происходит вне класса главной формы.
При прохождении сообщений необходимо помещать пришедшие данные скажем в richtextbox, находящийся в главной форме. Раньше работал на билдере и сейчас не могу понять, как мне обратиться к уже сконструированному элементу формы.

Application::Run(gcnew MainForm() );

тут создаётся форма, но беда (для моего восприятия) в том, что не вижу явного объявления объекта главной формы, соответственно как обратиться к ней из вне?

Компилятор запрещает глобальное объявление типа MainForm...
А локальное тупо создаст копию главной формы...
vik0
Цитата(Goofy @ Sep 23 2008, 08:09) *
тут создаётся форма, но беда (для моего восприятия) в том, что не вижу явного объявления объекта главной формы, соответственно как обратиться к ней из вне?

Можно через System::Windows::Forms::Application::OpenForms
Но лучше так:
Код
ref class MainForm
{
private:
  static MainForm^ instance;
  .....
public:
  MainForm()
  {
    instance = this;
  }

  static property MainForm^ Instance { get { return instance; }; };
  .....
};

void Foo()
{
  MainForm::Instance->bla_bla_bla();
}

PS. Не знаю как в VS2008, но в 2005 работа с WinForms в C++/CLI была сущим адом. Подумайте хорошо, оно вам надо?
Goofy
Расписанный подход сработал!
Но как теперь отгородиться от сообщения о том, что запрещена смена элементов формы не из родного потока?

Тут конечно гугл в помощь...
И правда можно задуматься о целесообразности.
Хотя быть может тот случай когда "лучше деть потерять, но за 5 минут долететь"

А что могли бы посоветовать для этой задачи?
Как понимаете под виндовс практически не программирую... Максимум билдеровские нажал на кнопку, получил результат.

Кроме обработки сообщений требуется визуализация графики, растров.
vik0
Цитата(Goofy @ Sep 23 2008, 10:57) *
Но как теперь отгородиться от сообщения о том, что запрещена смена элементов формы не из родного потока?

Не менять (напрямую) элементы формы не из родного потока. Серьезно.
Для межпотокового взаимодействия с формами предназначена Form::Invoke и семейство (BeginInvoke/EndInvoke).
PS. В некоторых(простых) случаях можно попытаться использовать компонент BackgroundWorker.

Цитата(Goofy @ Sep 23 2008, 10:57) *
Хотя быть может тот случай когда "лучше деть потерять, но за 5 минут долететь"
Боюсь что тут одним днем не обойдется. .Net очень мощная платформа, но и далеко не самая простая.
Цитата
Максимум билдеровские нажал на кнопку, получил результат.
А чем собсвенно Вас билдер не устраивает?
SysRq
MSDN: How to: Make Thread-Safe Calls to Windows Forms Controls

--

Цитата(vik0 @ Sep 23 2008, 13:20) *
А чем собсвенно Вас билдер не устраивает?

Денег хочет...
vik0
Цитата(SysRq @ Sep 23 2008, 17:47) *
+1.
Цитата
Денег хочет...
Ну да. А студия резко бесплатной стала? smile.gif
SysRq
Цитата(vik0 @ Sep 23 2008, 22:54) *
Ну да. А студия резко бесплатной стала? smile.gif

Для софта WindowsForms хватает версий Express. А они, насколько я понял, бесплатные, плюс лицензия разрешает продавать написанный софт...
vik0
Цитата(SysRq @ Sep 23 2008, 22:51) *
...хватает версий Express...
Игрушка, IMHO.
Да и у "экс-борланда" есть бесплатный вариант: http://cc.codegear.com/Free.aspx?id=24724
Огурцов
Цитата(Goofy @ Sep 23 2008, 06:09) *
беда (для моего восприятия) в том, что не вижу явного объявления объекта главной формы


Как-то так:
Код
MainForm mainForm = gcnew MainForm();
Application::Run(mainForm);


Цитата(Goofy @ Sep 23 2008, 06:09) *
как обратиться к ней из вне?

Переменные должны объявляться внутри класса. Создайте, например, статический класс для глобальных переменных.
Goofy
Цитата(vik0 @ Sep 24 2008, 04:18) *
Игрушка, IMHO.
Да и у "экс-борланда" есть бесплатный вариант: http://cc.codegear.com/Free.aspx?id=24724



Для моей задачи хватит за глаза, у меня именно экспресс
Глянул Турбо С++. Всем хорош, но нельзя подключать сторонние компоненты. А какого либо родного решения по последовательному порту там нет. sad.gif дописывать самому не охота.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.