link142 link143 link144 link145 link146 link147 link148 link149 link150 link151 link152 link153 link154 link155 link156 link157 link158 link159 link160 link161 link162 link163 link164 link165 link166 link167 link168 link169 link170 link171 link172 link173 link174 link175 link176 link177 link178 link179 link180 link181 link182 link183 link184 link185 link186 link187 link188 link189 link190 link191 link192 link193 link194 link195 link196 link197 link198 link199 link200 link201 link202 link203 link204 link205 link206 link207 link208 link209 link210 link211 link212 link213 link214 link215 link216 link217 link218 link219 link220 link221 link222 link223 link224 link225 link226 link227 link228 link229 link230 link231 link232 link233 link234 link235 link236 link237 link238 link239 link240 link241 link242 link243 link244 link245 link246 link247 link248 link249 link250 link251 link252 link253 link254 link255 link256 link257 link258 link259 link260 link261 link262 link263 link264 link265 link266 link267 link268 link269 link270 link271 link272 link273 link274 link275 link276 link277 link278 link279 link280 link281 link282 link283
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