Мне потребовалось хранить ссылку на объект в вариантной переменной. Это можно легко сделать, если привести указатель на объект к типу 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 темнит...



