Помогите и я отстану!
Книжек нет нифига нет.
Вопрос такой.
Как отобразить форму (модально или немодально)
из другой формы, допустим при нажатии на кнопку.
Делаю так.
Создаю две формы 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 ^'
Что делать-то!!!?
Новичок. Совсем-совсем. Осваиваю С++ и одновременно 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. Пример:
Form2->ShowDialog(this);
Как я понял VS2005 введен новый С++ синтаксис Managed Code, в котором __gc * заменён на ^.
Так же нужно использовать gcnew вместо new.
А вообще (IMHO) писать программы для .NET Framework проще на С#.
Ты создаёш Managed Code на С++, поэтому замени * на ^ и new на gcnew. Пример:
Form2->ShowDialog(this);
Как я понял VS2005 введен новый С++ синтаксис Managed Code, в котором __gc * заменён на ^.
Так же нужно использовать gcnew вместо new.
А вообще (IMHO) писать программы для .NET Framework проще на С#.
Написал как ты сказал. Результат-при попытке отобразить форму программа вылетает в Debug.
Запускаю принудительно еще раз-форма показывается но только не та которую я в дизайнере нарисовал, а голая какая-то, левая вабще.
Что это такое то?
А что такое Managed Code? :)
С# не знаю где среду достать. Правынцыя фиг ли.
Книжку видел в нете по С#-2000 руб. :(
Написал как ты сказал. Результат-при попытке отобразить форму программа вылетает в Debug.
Запускаю принудительно еще раз-форма показывается но только не та которую я в дизайнере нарисовал, а голая какая-то, левая вабще.
Что это такое то?
А что такое Managed Code? :)
С# не знаю где среду достать. Правынцыя фиг ли.
Книжку видел в нете по С#-2000 руб. :(
Почему программа вылетает я не знаю. Возможно ты что-то не так написал. У меня данный код работает без проблем.
То, что показывается голая форма верно. Ты написал:
Класс Form() (а точнее System::Windows::Forms::Form()) является базовым для всех форм. Ты создал базовую форму (поэтому и голая). Переименуй свою форму и измени код создания. Пример:
Form2->ShowDialog(this);
Или так:
Form2->ShowDialog(this);
Managed Code - это код исполняемый в среде .NET Framework. Соответственно без .NET Framework он работать не будет.
Native Code - это обычный код (MFC, ATL и т.д.)
Синтаксис C# очень похож на С++. Подробнее здесь:
.NET и C#
Form ^Form2 = gcnew Form2();
Form2->ShowDialog(this);
что, в принципе, одно и тоже.
В результате:
error C2061: syntax error : identifier 'Form2'
Понятно, что пока ничего не понятно.
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.
В коде переименовывай класс формы (и соответственно конструктор и деструктор).
В коде ошибка:
Form2->ShowDialog(this);
Имена не могут быть одинаковыми.
Также в самом верху кода (где строка #pragma once) добавь #include "Имя твоей формы.h". Пример:
#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);
}
};
даже кажется вник в суть.
Form2-класс
form2-экземпляр класса.
Да?
Но теперь еще одно но. Form2 отображается нормально, но когда я ее закрываю (любым способом, хоть через Alt+F4) программа вылетает в отладку. Может я еще что не доглядел?
Кроме того когда form2 больше не нужна, освобождай память:
{
..........................
private: System::Void button1_Click(System::Оbject^ sender, System::EventArgs^ e)
{
Form ^form2 = gcnew Form2();
form2->ShowDialog(this);
..........................
delete form2;
}
};
Почему вылетает я не знаю. Напиши сюда код Form2 или хотя бы сообщение с которым вылетает - посмотрим. Возможно в коде Form2 ты освобождаеш уже освобождённую ранее память.
> 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-шник, работает нормально.
:(
Сообщение в окне Call Stack просто показывает текущую функцию. У тебя Breakpoint'ы нигде не стоят (меню Debug->Windows->Breakpoints)?
Я дико извиняюсь канешно. :-) Создал идентичный проект с двумя формами. Все прекрасно работает без косяков. Видимо в том я все-таки сам что-то набодяжил путем несложных манипуляций. :-)
Managed Code - это я так понял "отзвук" легендарных управляемых приложений на основе Framework?
Managed Code - это я так понял "отзвук" легендарных управляемых приложений на основе Framework?
Подробнее про .NET Framework и "управляемый код" читай в статье Андрея Колесова Введение в .NET Framework