Как я могу получить базовое необработанное значение Variant индексированного свойства Delphi 6, которое обращается к этому варианту?
У меня есть объект класса Delphi 6, который содержит массив из 30 вариантов, каждый из которых предоставляется через свое индексируемое свойство. Например:
property responseCode: integer
Index 7 read getIndexedProperty_integer write setIndexedProperty_integer;
Я сделал это, чтобы упростить использование массива вариантов (помогает автозаполнению среды IDE) и обеспечить безопасность типов. Это работает нормально, но теперь у меня есть морщины. Массив Variants инициализируется значением NULL, когда создается класс, который его оборачивает, поэтому я могу сказать, был ли конкретный вариант когда-либо создан со значением. Следствием этого является то, что если создаются только некоторые из вариантов (с заданными допустимыми значениями), любая попытка получить доступ к свойству, которое в настоящее время представляет вариант NULL, приведет к ошибке преобразования варианта, когда Delphi попытается преобразовать вариант в тип, объявленный объектом. индексированное свойство.
Я бы предпочел не объявлять свойство isValid для каждого индексированного свойства. Мне было интересно, есть ли способ использовать библиотеку TypeInfo для получения необработанного значения базового варианта без необходимости прямого доступа к индексируемому свойству и, таким образом, запускает исключение преобразования. Тогда я мог бы написать такой код (используя свойство примера выше):
isValidProperty(responseCode);
и эта функция будет возвращать TRUE, если Variant, лежащий в основе свойства responseCode, не равен NULL и FALSE, если это так.
Я знаю, что могу просмотреть список свойств PPropList для класса и получить доступ к свойствам по имени, но тогда мне придется использовать код, подобный следующему:
isValidProperty('responseCode');
и передайте имя свойства в строковой форме вместо того, чтобы передавать свойство напрямую, как первый isValidProperty() выше. Есть ли способ сделать это?
1 ответ
Таким образом, вы хотите "получить необработанное значение базового варианта без необходимости прямого доступа к индексированному свойству и, таким образом, запускает исключение преобразования". Пока вы можете получить доступ к самому базовому варианту, да, вы можете. Вам, скорее всего, придется изменить сам класс контейнера.
Со страницы справки Delphi XE2 о типах вариантов:
Стандартная функция
VarType
возвращает код типа варианта.varTypeMask
константа - битовая маска, используемая для извлечения кода изVarType
возвращаемое значение, так что, например,
VarType(V) and varTypeMask = varDouble
возвращается
True
еслиV
содержитDouble
илиarray of Double
, (Маска просто скрывает первый бит, который указывает, содержит ли вариант массив.)TVarData
тип записи, определенный вSystem
Устройство может использоваться для опечатывания вариантов и получения доступа к их внутреннему представлению.
Вы должны быть в состоянии использовать комбинацию методов и записей, упомянутых здесь, чтобы узнать все, что вы хотите о внутренних данных внутри варианта, в том числе, если это вариант NULL, а также получить прямой доступ к ним.
(Эта система кажется мне несколько хитрым проектом: она не выглядит очень безопасной для типов реализацией... см. Мой комментарий выше. Я думаю, что дизайн, основанный на фактических типах ожидаемых значений, может быть более безопасным. Но это позволит вам достичь своей цели.)