Код является худшим видом ошибки, потому что он не обнаруживает себя в 99,99% случаев.
Вы освобождаете объект (управление кнопкой), пока VCL предполагает, что объект существует. На самом деле происходит то, что память объекта освобождается, но еще не используется, поэтому приведенный выше код будет работать нормально, как если бы объект еще не был освобожден, но все же это ошибка.
Следующая простая ошибка иллюстрирует ситуацию:
type
PData = ^TData;
TData = record
Value: Integer;
end;
procedure NastyBug;
var
P: PData;
begin
New(P);
P^.Value:= 2;
Dispose(P);
// nasty buggy code
ShowMessage(IntToStr(P^.Value));
P^.Value:= 22;
ShowMessage(IntToStr(P^.Value));
end;
Вы можете протестировать приведенный выше код, и он должен работать, как и ожидалось, поскольку выделенная память для P
еще не используется повторно, но код является явной ошибкой.