Нарушение прав доступа при освобождении переменной TBitmap - битовая переменная все еще назначается после освобождения?

У меня есть этот код в приложении VCL Forms:

implementation

{$R *.dfm}

var
  MyBitmap: TBitmap;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  MyBitmap := TBitmap.Create;
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
  if Assigned(MyBitmap) then
    MyBitmap.Free;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  if Assigned(MyBitmap) then
    MyBitmap.Free;
end;

Когда я нажимаю кнопку во второй раз, я получаю нарушение прав доступа в MyBitmap.Free; в обработчике нажатия кнопки. Но MyBitmap больше не должен назначаться после первого нажатия кнопки. Так почему условие if Assigned(MyBitmap) then не работает при втором нажатии кнопки, когда он, очевидно, работал при первом нажатии кнопки?

Delphi 10.1 Berlin Обновление 2

1 ответ

Решение

Assigned функция проверяет только указатель Nil, Он не выполняет проверку, указывает ли он на существующий объект или нет. Вам нужно установить его Nil после освобождения, чтобы получить Assigned Функция работы, как вы ожидаете. FreeAndNil выполняет обе инструкции.

Другие вопросы по тегам