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

 
 
 
Reply to this topicStart new topic
> 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
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
SysRq
сообщение Sep 23 2008, 14:47
Сообщение #5


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



MSDN: How to: Make Thread-Safe Calls to Windows Forms Controls

--

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

Денег хочет...

Сообщение отредактировал SysRq - Sep 23 2008, 14:49
Go to the top of the page
 
+Quote Post
vik0
сообщение Sep 23 2008, 18:54
Сообщение #6


Местный
***

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



Цитата(SysRq @ Sep 23 2008, 17:47) *
+1.
Цитата
Денег хочет...
Ну да. А студия резко бесплатной стала? smile.gif
Go to the top of the page
 
+Quote Post
SysRq
сообщение Sep 23 2008, 19:51
Сообщение #7


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



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

Для софта WindowsForms хватает версий Express. А они, насколько я понял, бесплатные, плюс лицензия разрешает продавать написанный софт...
Go to the top of the page
 
+Quote Post
vik0
сообщение Sep 23 2008, 20:18
Сообщение #8


Местный
***

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



Цитата(SysRq @ Sep 23 2008, 22:51) *
...хватает версий Express...
Игрушка, IMHO.
Да и у "экс-борланда" есть бесплатный вариант: http://cc.codegear.com/Free.aspx?id=24724
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Sep 23 2008, 23:06
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(Goofy @ Sep 23 2008, 06:09) *
беда (для моего восприятия) в том, что не вижу явного объявления объекта главной формы


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


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

Переменные должны объявляться внутри класса. Создайте, например, статический класс для глобальных переменных.
Go to the top of the page
 
+Quote Post
Goofy
сообщение Sep 24 2008, 14:12
Сообщение #10


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

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



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



Для моей задачи хватит за глаза, у меня именно экспресс
Глянул Турбо С++. Всем хорош, но нельзя подключать сторонние компоненты. А какого либо родного решения по последовательному порту там нет. sad.gif дописывать самому не охота.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 06:13
Рейтинг@Mail.ru


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