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" делать нельзя. Но учтите, что при закрытии крестиком ( ) вы не освобождаете память если у вас не стоит 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 все прочие формы приложения (если не ошибаюсь) закрываются сами....
все прочее я написал выше....
|
|