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

 
 
> Windows forms, VS2008 C++ где взять ссылку на объект класса главной формы?
Goofy
сообщение Sep 23 2008, 06:09
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Переписываю интерфейс к внешнему устройству (КОМ порт) на Visual Studio, работаю через windows forms.
Обработка пакетов и входящих сообщений происходит вне класса главной формы.
При прохождении сообщений необходимо помещать пришедшие данные скажем в richtextbox, находящийся в главной форме. Раньше работал на билдере и сейчас не могу понять, как мне обратиться к уже сконструированному элементу формы.

Application::Run(gcnew MainForm() );

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

Компилятор запрещает глобальное объявление типа MainForm...
А локальное тупо создаст копию главной формы...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vik0
сообщение Sep 23 2008, 08:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата(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 была сущим адом. Подумайте хорошо, оно вам надо?

Сообщение отредактировал vik0 - Sep 23 2008, 08:05
Go to the top of the page
 
+Quote Post
Goofy
сообщение Sep 23 2008, 08:57
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Расписанный подход сработал!
Но как теперь отгородиться от сообщения о том, что запрещена смена элементов формы не из родного потока?

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

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

Кроме обработки сообщений требуется визуализация графики, растров.
Go to the top of the page
 
+Quote Post
vik0
сообщение Sep 23 2008, 09:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



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

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

Цитата(Goofy @ Sep 23 2008, 10:57) *
Хотя быть может тот случай когда "лучше деть потерять, но за 5 минут долететь"
Боюсь что тут одним днем не обойдется. .Net очень мощная платформа, но и далеко не самая простая.
Цитата
Максимум билдеровские нажал на кнопку, получил результат.
А чем собсвенно Вас билдер не устраивает?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016