C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Закрытие формы, Access violation at address 401146B3 in
Pan-SQL
Отправлено: 05.02.2007, 13:30


Ученик-кочегар

Группа: Участник
Сообщений: 22



Здравствуйте! На сей раз, я столкнулся с такой проблемой: приложение состоит из двух форм — Form1 и Form2. Форма Form2 перенесена в список доступных форм и вызывается из Form1 так:

f2=new TForm2(Application);
if (!f2) return;
f2->Show();

На форме Form2 имеется кнопка, которая должна закрывать данную форму (не крестик в правом верхнем углу). Если закрывать форму Form2, нажимая на крестик, то все нормально, а при нажатии на кнопку я получаю исключение:

Access violation at address 401146B3 in module vcl60.bpl. Read of address 00C9CDD8. Кто знает, как «заставить» форму Form2 открываться нормально при нажатии кнопки. подскажите. Заранее благодарен

Doga
Отправлено: 05.02.2007, 13:37


Мастер участка

Группа: Участник
Сообщений: 575



А где код? В частности обработчика события нажатия той самой кнопки...
AVC
Отправлено: 05.02.2007, 13:52


Ветеран

Группа: Модератор
Сообщений: 1583



Подозреваю, что у вас в обработчике нажатия кнопки для закрытия написано что то типа Form2->Close(). Если так — замените на просто Close();
Pan-SQL
Отправлено: 05.02.2007, 13:57


Ученик-кочегар

Группа: Участник
Сообщений: 22



Переменная f2 объявлена в разделе public класса TForm1. Закрывавает форму Form2 функция, которая есть в cpp-файле формы Form1. Вот ее код:

void __fastcall TForm1::Form2Close()
{
delete f2;
}
Doga
Отправлено: 05.02.2007, 14:41


Мастер участка

Группа: Участник
Сообщений: 575



Так нельзя. Сначала закройте форму штатными средствами, и только потом удаляйте.
Pan-SQL
Отправлено: 05.02.2007, 14:53


Ученик-кочегар

Группа: Участник
Сообщений: 22



Я так понял, сначала вызвать метод Close(), а потом функцию?
AVC
Отправлено: 05.02.2007, 15:07


Ветеран

Группа: Модератор
Сообщений: 1583



Лучше сначала close потом delete, хотя при "сразу delete" то же криминала нет, но это зависит от конкретной формы.
Приведенный кусок не должен порождать ошибок, причена в чем то другом. Без полного кода, вызывающего ошибку, ни чего сказать нельзя.
Pan-SQL
Отправлено: 05.02.2007, 15:13


Ученик-кочегар

Группа: Участник
Сообщений: 22



При закрытии формы обычным способом (крестиком) проблем не возникает. Проблема возникает при закрытии формы кнопкой
AVC
Отправлено: 05.02.2007, 15:22


Ветеран

Группа: Модератор
Сообщений: 1583



Возможно это тот случай когда "сразу delete" делать нельзя. Но учтите, что при закрытии крестиком ( smile.gif ) вы не освобождаете память если у вас не стоит caFree и, возможно, не очищаете указатель f2.

Нужно либо видеть минимальный код, порождающий ошибку, либо пройдитесь отладчиком и посмотрите почему ошибка возникает.
nawok78
Отправлено: 05.02.2007, 15:59


Станционный диспетчер

Группа: Участник
Сообщений: 115



все просто...
в начале ты проверяешь не создана ли форма, создаешь если нет и показываешь ее

CODE

if (Form2)
{
Form2=new TForm2(Form1);
}
Form2.Show;


вызывая delete Form2; ты освобождаешь память, НО
delete НЕ присваивает NULL переменной

а при закрытии формы не забудь!:
CODE

void __fastcall TForm2::OnDestroy(TObject *Sender)
{
Form2=NULL;
// а попробуй еще вот так :
// this=NULL;
// помоему это более правильно.... или нет?
}


да не забудь:
CODE

void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
}


Отредактировано nawok78 — 05.02.2007, 16:03
nawok78
Отправлено: 05.02.2007, 16:10


Станционный диспетчер

Группа: Участник
Сообщений: 115



QUOTE

Переменная f2 объявлена в разделе public класса TForm1. Закрывавает форму Form2 функция, которая есть в cpp-файле формы Form1. Вот ее код:

определись ск-ко экземпляров TForm2 у тебя будет.
если 1 —  — НЕ СОРИ!
ПЕРЕМЕННАЯ f2 — ЛИШНЯЯ!!!
в модуле Unit2.h (там где класс TForm2 объявлен) объявлена переменная Form2 — используй ее. а в Unit1.cpp вставь

#include "Unit2.h"
а призакрытии Form1 все прочие формы приложения (если не ошибаюсь) закрываются сами....
все прочее я написал выше....


Вернуться в Вопросы программирования в C++Builder