скалогрыз писал(а):Мне кажется ты тестировал на тестах, которые ты подогнал под ответ, вместо тех тестов, которые мы тебе рекомендуем.
У тебя сильно секретный/сложный скрипт, может ты тестовый скрипт (именно скрипт, а не паскаль код) выложишь?
Просто я понимаю как это работает и знаю, что это будет работать на тестах, которые я провёл отдельно...
Я вообще спал всё это время и ничего, кроме тестов, ещё не делал со времени заданного вопроса.
Но специально для тебя, я набросал сырой тест, в котором ты можешь убедиться, что оно работает.
А так же ты можешь провести другие тесты, чтобы выявить ситуации при которых данный способ не будет работать. И конечно, проверять класс на nil - это ерунда, нужно реализовать более конкретный способ, с конкретными классами, но этож тест...
- Код: Выделить всё
function CmpCreate: PtrInt;
begin
Result := PtrInt(TForm.Create(Application));
end;
procedure CmpDelete(cmp: PtrInt);
var
vcmp: PVmt;
begin
vcmp := nil;
vcmp := PVmt(cmp);
if vcmp^.vClassName <> nil then
begin
TForm(cmp).Free;
ShowMessageFmt('Объект %d успешно удален.', [cmp]);
end
else
ShowMessageFmt('Объект %d уже был удалён!', [cmp]);
end;
procedure TForm1.FormClick(Sender: TObject);
var
cmp: PtrInt;
begin
cmp := CmpCreate;
CmpDelete(cmp);
CmpDelete(cmp);
end;
Добавлено спустя 1 минуту 38 секунд:
Ну и кстати, результат:
- Код: Выделить всё
cmp := CmpCreate;
CmpDelete(cmp); { Объект %s успешно удален. }
CmpDelete(cmp); { Объект %s уже был удалён! }
А так же можно подумать над способом удаления, я не говори что конкретно .Free будет использоваться. Всё это будет тестироваться и т.д., выявляться более стабильный способ.