1st
Сен

Как убрать Access Violation при Destroy компонента?

Posted by bullvinkle under Пост-обзор

artemavd

Код:

var
 i: integer; //создавал "левую" переменную, которая ничего не делает
begin
 try
 ... //тут выполнялся мой код какой-то
 except
 {далее идет обработка ошибки. Помести то что идет после
 except в код туда, что "провоцирует" ошибку}
 on EAccessViolation do
  //блок begin...end в данном случае необязателен. Это у меня просто 
  привычка после do писать его :)
  begin
   i:=1;
  end;
 end;

Тогда в среде разработки появление ошибки будет продолжаться, однако, когда запустишь ехе-шник отдельно, то ошибки не будет. По крайней мере у меня не появляется она больше. Удачи!

Stilet

Я пишу:

Код:

unit Unit1;

interface

uses    ThdTimer,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private t:TThreadedTimer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 t:=TThreadedTimer.Create(self);
 t.Interval:=1000;
 t.OnTimer:=Timer1Timer;
 t.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Caption:=TimeToStr(now);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 t.Enabled:=false;
end;

end.

Запускаю. часики тикают. Я закрываю форму и не вижу никакого AV. (D6)
Так шо все там ок.
На всякий случай подозрение что поправить нужно в деструкторе так:

Код:

    if FOwner<>nil then
     FOwner.FOnTimer := nil; // AV


Тема на форуме.

Похожие статьи