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

Ваш аккаунт

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

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

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

помогите с формами

11K
31 октября 2006 года
elsuk
31 / / 23.10.2006
есть 2 формы. при запуске программы запускается 1, далее например я нажимаю на одну из кнопокна в 1 форме то открывается 2.
открываю форму так
Form2 = new TForm2(this);
Form2->ShowModal();
Form2->Free();
далее выпонил действия со 2 формой, затем необходимо ее закрыть
закрываю так
delete Form2;
в результате форма 2 закрывается а 1 форма становится не активной. и вообще закрыть прогу можно только через диспечер задач.
Что не правильно, как правильно переходить с одной формы на другую?
и как можно сделать чтобы при переходе на 2 форму 1 закрывалась.
зарание спосибо.
92
31 октября 2006 года
Тень Пса
2.2K / / 19.10.2006
IMHO... можно так

 
Код:
Form2 = new TForm2(this);
Form2->ShowModal();
Form1->Visible = false;

//bla bla bla

Form1->Visible = true;
Form2->Close();
delete Form2;
11K
31 октября 2006 года
elsuk
31 / / 23.10.2006
большое спасибо за совет.
только строчки надо некоторые поменять и а некторые убрать
Form1->Visible = false;
Form2 = new TForm2(this);
Form2->ShowModal();

//bla bla bla

Form1->Visible = true;
//Form2->Close(); если оставить эту то вылетает с ошибкой.
delete Form2;

и еще вопрос значит сделал так перешол с 1 формы на 2, далее с 2 на 1, потом опять с 1 на 2, далее пытаюсь перейти с 2 на 1 выдает ошибку:
Project Project raised exception class EAbstractError with message 'AbstractError'. Process stoped/ use Stop or Run to continue.
что это за ошибка ?
309
31 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Код:
void TForm1::Button1Click ()
{
// В качестве владельца формы пользуем объект "Приложение"
if (Form2 == NULL)
     Form2 = new TForm2 (Application);
// Открываем форму2 в модальном режиме - чтение результата при надобности
TModalResult Res = Form2->ShowModal();
// Удаляем Form2, обнуляем указатель.
delete Form2; Form2 = NULL;
// Следующий код не обязателен - по желанию, но через this, а не Form1
this->Show ();
this->SetFocus ();
}
11K
31 октября 2006 года
elsuk
31 / / 23.10.2006
to el scorpio
сделал теперь через приложение. теперь вылетает с тоже ошибкой но у же на 1 круге.
если делать не через приложение
и создавать проверку if (Form2 == NULL) при открытии, и писать Form2 = NULL при закрытии на 1 круге вылетает с той же ошибкой.
309
01 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
Где именно? Хотя догадываюсь: значение указателя Form2 не определённое, и равным NULL никогда не бывает - объект не создаётся, отсюда и Access Violation :(. Исправляется строкой "TForm2 Form2 = NULL;" в файле "Unit2.cpp".

А вообще, какая нужда создавать форму вручную?
Проще указать для неё автоматическое создание, и просто вызывать через ShowModal - расходы памяти на хранение формы будут несравненно меньше, чем создание/удаление по десять раз на дню :D
11K
01 ноября 2006 года
elsuk
31 / / 23.10.2006
[QUOTE=el scorpio] Исправляется строкой "TForm2 Form2 = NULL;" в файле "Unit2.cpp".[/QUOTE]
теперь вот
[C++ Ошибка] Unit2.cpp(50): E2459 VCL style classes must be constructed using operator new
[QUOTE=el scorpio]Проще указать для неё автоматическое создание, и просто вызывать через ShowModal [/QUOTE]
можно поподробнее, и если можно пример. Что значит автоматичесое создание? я до этого тоже ведь через ShowModal() делал
92
01 ноября 2006 года
Тень Пса
2.2K / / 19.10.2006
[QUOTE=elsuk]Project Project raised exception class EAbstractError with message 'AbstractError'. Process stoped/ use Stop or Run to continue.
что это за ошибка ?[/QUOTE]

[quote=Где-то глубоко в инете =)]
Описание

Исключение класса EAbstractError генерируется во время выполнения при попытке вызвать абстрактный метод. В процессе проектирования это исключение генерируется при размещении на форме компонента с абстрактным методом.

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

Все свойства и методы исключения EAbstractError наследуются от базового класса Exception.
[/quote]

посмотри сам что там является абстрактным методом... :)
309
02 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=elsuk]теперь вот
[C++ Ошибка] Unit2.cpp(50): E2459 VCL style classes must be constructed using operator new

можно поподробнее, и если можно пример. Что значит автоматичесое создание? я до этого тоже ведь через ShowModal() делал[/QUOTE]
1. Прошу прощения за опечатку, Form2 должно быть указателем
"TForm2 *Form2 = NULL;" - достаточно просто изменить уже существующую строку в начале файла Unit2.cpp

2. В параметрах проекта ("Project\Options") есть вкладка "Формы" с двумя списками: "Создаваемые формы" и "Доступные формы".

Первый список - это формы, которые создание которых производится в файле "Имя_Проекта.cpp" - данный год генерируется автоматичеки
Если форма находится в этом списке, то она будет создана методом CreateForm объекта "Приложение". Удаление формы также будет выполнено при завершении приложения.
Код:
WinMain (Параметры_Запуска_Приложения)
{[INDENT]try
{[INDENT]Application->Initialise();
Application->CreateForm (TForm1, &Form1);
Application->Run();
[/INDENT]}
catch (Exception &Error)
{
// Выдача сообщения об ошибке запуска программы
}
return 0; [/INDENT]}


Формы, перечисленные во втором списке, приходится создавать и удалять вручную, через new/delete.

Посему проще сделать автоматическое создание формы, и не заморачиваться, а открывать уже созданное окно при необходимости.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог