![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание фреймов. Acces Violation;
_RusLAN © (2006-05-25 11:06:00)периодически выскакивает ошибка AV. Дебагером причину найти не могу - появляется после финального end
Думаю что я неправильно создаю/разрушаю фреймы.
Создаю так
procedure TfrmMain.ShowManualFrame(Number: integer);
var FrameExists: boolean;
begin
FrameExists:= Assigned(CurrentFrame);
if FrameExists then
FrameExists := CurrentFrame is TframeManual;
if not FrameExists then
begin
DestroyCurrentFrame();
CurrentFrame := TframeManual.Create(nil);
CurrentFrame.Parent := Self;
CurrentFrame.Align := alClient;
end;
TframeManual(CurrentFrame).LoadHTMLManual(Number);
end;
Аналогичный фрейм
procedure TfrmMain.ShowEditTestFrame;
var FrameExists: boolean;
begin
FrameExists:= Assigned(CurrentFrame);
if FrameExists then
FrameExists := CurrentFrame is TframeEditTest;
if not FrameExists then
begin
DestroyCurrentFrame();
CurrentFrame := TframeEditTest.Create(nil);
CurrentFrame.Parent := Self;
CurrentFrame.Align := alClient;
end;
end;
procedure TfrmMain.DestroyCurrentFrame;
begin
if Assigned(CurrentFrame) then
CurrentFrame.Free;
end;
_RusLAN (2006-05-25 17:11:00) [1]Ega23 © (25.05.06 12:01) [6]
Спасибо. Так делать больше не буду. Убрал кнопку Закрить.
Правда здесь ошибка не всегда выскакивает, в большинстве случаев фрейм разрушается нормально.
И иногда когда закрываю приложение то бывае AV.
Скачал MemProof то он мне показал такую строку
if not FrameExists then
begin
DestroyCurrentFrame();
CurrentFrame := TframeEditTest.Create(nil);
CurrentFrame.Parent := Self;
CurrentFrame.Align := alClient;
end;
пока разбираюсь как им пользоваться
Ega23 (2006-05-25 12:01:00) [2]ХА!
Батенька, да ты из обработчика метода фрейма пытаешься вызвать его деструктор. А такого не бывает.
_RusLAN (2006-05-25 11:53:00) [3]Ega23 © (25.05.06 11:34) [3]
TLabel, TButton, TStaticText и динамически создается TStrings.
constructor TframeTesting.Create(AOwner: TComponent);
begin
inherited;
TestStrings := TStringList.Create();
LoadTestToMemory('CommonTest.tst');
CurrentQuestion := 0;
ShowQuestion(CurrentQuestion);
end;
destructor TframeTesting.Destroy;
begin
TestStrings.Free();
inherited;
end;
Ошибка возникает когда нажать кнопку "Закрыть"
procedure TframeTesting.btnCloseClick(Sender: TObject);
begin
frmMain.DestroyCurrentFrame();
end;
procedure TfrmMain.DestroyCurrentFrame;
begin
if Assigned(CurrentFrame) then
CurrentFrame.Free;
end;
Ошибка
---------------------------
Debugger Exception Notification
---------------------------
Project DelphiTest.exe raised exception class EAccessViolation with message 'Access violation at address 004034F0 in module 'DelphiTest.exe'. Read of address BAADF00D'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Kolan (2006-05-25 11:47:00) [4]Проверь с помощью
MemProof.
Ega23 (2006-05-25 11:34:00) [5]На фрейме что лежит?
_RusLAN (2006-05-25 11:24:00) [6]Stakan © (25.05.06 11:11) [1]
Написал. Не помогло.
Stakan (2006-05-25 11:11:00) [7]Попробуй в TfrmMain.DestroyCurrentFrame написать такой код
FreeAndNil(CurrentFrame);