Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое создание фреймов. 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);


Наверх

Титульная страница Поиск, карта сайта Написать письмо