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

Ваш аккаунт

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

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

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

Помогите и я отстану!

16K
14 апреля 2006 года
H5N1
9 / / 14.04.2006
Новичок. Совсем-совсем. Осваиваю С++ и одновременно Visual C++ 2005 Exp. Edition.
Книжек нет нифига нет.
Вопрос такой.
Как отобразить форму (модально или немодально)
из другой формы, допустим при нажатии на кнопку.
Делаю так.
Создаю две формы Form1, Form2
На Form1 рисую кнопку. В обработчике события OnClick пишу:
Form * Form2 = new Form();
Form2->ShowDialog(this);
Выдает сообщение об ошибке:
error C3699: '*' : cannot use this indirection on type 'System::Windows::Forms::Form'
error C2750: 'System::Windows::Forms::Form' : cannot use 'new' on the reference type; use 'gcnew' instead
error C2440: 'initializing' : cannot convert from 'System::Windows::Forms::Form *' to 'System::Windows::Forms::Form ^'
Что делать-то!!!?
9.5K
15 апреля 2006 года
Damarus
101 / / 08.04.2006
Цитата:
Originally posted by H5N1
Новичок. Совсем-совсем. Осваиваю С++ и одновременно Visual C++ 2005 Exp. Edition.
Книжек нет нифига нет.
Вопрос такой.
Как отобразить форму (модально или немодально)
из другой формы, допустим при нажатии на кнопку.
Делаю так.
Создаю две формы Form1, Form2
На Form1 рисую кнопку. В обработчике события OnClick пишу:
Form * Form2 = new Form();
Form2->ShowDialog(this);
Выдает сообщение об ошибке:
error C3699: '*' : cannot use this indirection on type 'System::Windows::Forms::Form'
error C2750: 'System::Windows::Forms::Form' : cannot use 'new' on the reference type; use 'gcnew' instead
error C2440: 'initializing' : cannot convert from 'System::Windows::Forms::Form *' to 'System::Windows::Forms::Form ^'
Что делать-то!!!?



Ты создаёш Managed Code на С++, поэтому замени * на ^ и new на gcnew. Пример:

 
Код:
Form ^Form2 = gcnew Form();
Form2->ShowDialog(this);


Как я понял VS2005 введен новый С++ синтаксис Managed Code, в котором __gc * заменён на ^.
Так же нужно использовать gcnew вместо new.

А вообще (IMHO) писать программы для .NET Framework проще на С#.
16K
15 апреля 2006 года
H5N1
9 / / 14.04.2006
Цитата:
Originally posted by Damarus
Ты создаёш Managed Code на С++, поэтому замени * на ^ и new на gcnew. Пример:
 
Код:
Form ^Form2 = gcnew Form();
Form2->ShowDialog(this);


Как я понял VS2005 введен новый С++ синтаксис Managed Code, в котором __gc * заменён на ^.
Так же нужно использовать gcnew вместо new.

А вообще (IMHO) писать программы для .NET Framework проще на С#.




Написал как ты сказал. Результат-при попытке отобразить форму программа вылетает в Debug.
Запускаю принудительно еще раз-форма показывается но только не та которую я в дизайнере нарисовал, а голая какая-то, левая вабще.
Что это такое то?
А что такое Managed Code? :)
С# не знаю где среду достать. Правынцыя фиг ли.
Книжку видел в нете по С#-2000 руб. :(

9.5K
15 апреля 2006 года
Damarus
101 / / 08.04.2006
Цитата:
Originally posted by H5N1
Написал как ты сказал. Результат-при попытке отобразить форму программа вылетает в Debug.
Запускаю принудительно еще раз-форма показывается но только не та которую я в дизайнере нарисовал, а голая какая-то, левая вабще.
Что это такое то?
А что такое Managed Code? :)
С# не знаю где среду достать. Правынцыя фиг ли.
Книжку видел в нете по С#-2000 руб. :(



Почему программа вылетает я не знаю. Возможно ты что-то не так написал. У меня данный код работает без проблем.

То, что показывается голая форма верно. Ты написал:

Цитата:
 
Код:
Form *Form2 = new Form();


Класс Form() (а точнее System::Windows::Forms::Form()) является базовым для всех форм. Ты создал базовую форму (поэтому и голая). Переименуй свою форму и измени код создания. Пример:

 
Код:
Form ^Form2 = gcnew MyForm();
Form2->ShowDialog(this);

Или так:
 
Код:
MyForm ^Form2 = gcnew MyForm();
Form2->ShowDialog(this);


Managed Code - это код исполняемый в среде .NET Framework. Соответственно без .NET Framework он работать не будет.
Native Code - это обычный код (MFC, ATL и т.д.)

Синтаксис C# очень похож на С++. Подробнее здесь:
.NET и C#
16K
16 апреля 2006 года
H5N1
9 / / 14.04.2006
Хорошо. Вопрос с лету. Как же мне тогда писать Native Code? Допустим мне Framework совсем ни к черту. Ведь по идее я при создании проекта выбрал Windows Forms Application.
16K
16 апреля 2006 года
H5N1
9 / / 14.04.2006
Блин и как форму переименовать я не могу найти. :(
16K
16 апреля 2006 года
H5N1
9 / / 14.04.2006
Прочитал. Вопрос про Windows Forms снимается. Но форму где переименовать так и не нашел. Написал вот так:

Form ^Form2 = gcnew Form2();
Form2->ShowDialog(this);

что, в принципе, одно и тоже.

В результате:

error C2061: syntax error : identifier 'Form2'

Понятно, что пока ничего не понятно.
9.5K
16 апреля 2006 года
Damarus
101 / / 08.04.2006
Чтобы писать Native Code надо выбрать соответствующий тип проекта. У меня Visual Studio 2005 Team Suite имеет такие шаблоны:
Код:
Visual C++
    ATL
      ATL Project
      ATL Server Project
      ATL Server Web Service
    CLR
      ASP.NET Web Service
      CLR Console Application
      SQL Server Project
      Windows Forms Control Library
      Class Library
      CLR Empty Project
      Windows Forms Application
      Windows Service
    General
      Custom Wizard
      Makefile Project
      Empty Project
    MFC
      MFC ActiveX Control
      MFC Dll
      MFC Application
    Smart Device
      Это не важно.
    Test
      Это тоже.
    Win32
      Win32 Console Application
      Win32 Project

Всё, что относится к CLR работает в среде .NET Framework. Чтобы писать обычный код выбираеш:
ATL - используеш Active Template Library;
MFC - используеш Microsoft Foundation Class Library;
Win32 - используеш Win32 API.
Но учти - ни один из этих проектов (ATL, MFC, Win32) не поддерживает визуальное проектирование форм (за исключением визуального проектирования диалоговых окон для ресурсов).

Переименовать форму несложно. В Solution Explorer'е выбирай форму и выше нажимай View Code.
В коде переименовывай класс формы (и соответственно конструктор и деструктор).

В коде ошибка:
 
Код:
Form ^[COLOR=red]Form2[/COLOR] = gcnew [COLOR=red]Form2[/COLOR]();
Form2->ShowDialog(this);

Имена не могут быть одинаковыми.
Также в самом верху кода (где строка #pragma once) добавь #include "Имя твоей формы.h". Пример:
Код:
#pragma once
#include "Form2.h"

.............................

public ref class Form1 : public System::Windows::Forms::Form
{
   ..........................
   private: System::Void button1_Click(System::Оbject^ sender, System::EventArgs^ e)
   {
      Form ^form2 = gcnew Form2();
      form2->ShowDialog(this);
   }
};
16K
16 апреля 2006 года
H5N1
9 / / 14.04.2006
Получилось! :)
даже кажется вник в суть.
Form2-класс
form2-экземпляр класса.
Да?

Но теперь еще одно но. Form2 отображается нормально, но когда я ее закрываю (любым способом, хоть через Alt+F4) программа вылетает в отладку. Может я еще что не доглядел?
9.5K
16 апреля 2006 года
Damarus
101 / / 08.04.2006
Верно, form2 экземпляр класса Form2.

Кроме того когда form2 больше не нужна, освобождай память:
Код:
public ref class Form1 : public System::Windows::Forms::Form
{
   ..........................
   private: System::Void button1_Click(System::Оbject^ sender, System::EventArgs^ e)
   {
      Form ^form2 = gcnew Form2();
      form2->ShowDialog(this);
      ..........................
      delete form2;
   }
};


Почему вылетает я не знаю. Напиши сюда код Form2 или хотя бы сообщение с которым вылетает - посмотрим. Возможно в коде Form2 ты освобождаеш уже освобождённую ранее память.
16K
17 апреля 2006 года
H5N1
9 / / 14.04.2006
Вылетает с сообщением в окне Call Stack:
> MyFirst.exe!MyFirst::Form1::linkLabel2_LinkClicked(System::Object^ sender = 0x0012ed40, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e = 0x0012ed5c) Line 178

Указатель останова показывет на закрывающую скобку
обработчика события:

private: System::Void
linkLabel2_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs)
}
Form ^form2 = gcnew Form2();
form2->ShowDialog(this);
delete form2;
}

В коде класса Form2 память нигде не выделяю не освобождаю. Просто форму в дизайнере разрисовал маленько.
Запускал готовый EXE-шник, работает нормально.
:(
9.5K
17 апреля 2006 года
Damarus
101 / / 08.04.2006
Сообщение в окне Call Stack просто показывает текущую функцию. У тебя Breakpoint'ы нигде не стоят (меню Debug->Windows->Breakpoints)?
16K
17 апреля 2006 года
H5N1
9 / / 14.04.2006
Цитата:
Originally posted by Damarus
Сообщение в окне Call Stack просто показывает текущую функцию. У тебя Breakpoint'ы нигде не стоят (меню Debug->Windows->Breakpoints)?


Я дико извиняюсь канешно. :-) Создал идентичный проект с двумя формами. Все прекрасно работает без косяков. Видимо в том я все-таки сам что-то набодяжил путем несложных манипуляций. :-)
Managed Code - это я так понял "отзвук" легендарных управляемых приложений на основе Framework?

9.5K
18 апреля 2006 года
Damarus
101 / / 08.04.2006
Цитата:
Originally posted by H5N1
Managed Code - это я так понял "отзвук" легендарных управляемых приложений на основе Framework?



Подробнее про .NET Framework и "управляемый код" читай в статье Андрея Колесова Введение в .NET Framework

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог