Мне потребовалось хранить ссылку на объект в вариантной переменной. Это можно легко сделать, если привести указатель на объект к типу integer и присвоить это значение варианту. Однако встала задача удалять объект хранящийся в варианте. И тут уже проблемы, так как невозможно определить, действительно ли вариант хранит указатель, или это посто число. Выход был найден в ручной правке типа варианта. Собственно код:
- Код: Выделить всё
program class_variant;
{$APPTYPE CONSOLE}
uses
Variants;
var
varTmp: Variant;
objTmp: TObject;
begin
// создаем
objTmp:=TObject.Create;
TVarData(varTmp).VType:=vtClass;
TVarData(varTmp).VPointer:=objTmp;
// получаем
writeln(TObject(TVarData(varTmp).VPointer).ClassName);
// удаляем
TObject(TVarData(varTmp).VPointer).Free;
// объект по прежнему существует ?
writeln(objTmp.ClassName); // да!
writeln(TObject(TVarData(varTmp).VPointer).ClassName); // да?!! ...
readln;
end.
Объект хранится, к его полям и методам есть доступ, но вызов метода Free не работает. Почему? Я не могу это объяснить.
Кстати, в справке по Delphi черным по белому написано, что тип Variant не предназначен для хранения классов и указателей, но зачем тогда vtPointer, vtObject и vtClass? что то ту Borland темнит...