Как я могу получить базовое необработанное значение 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, а также получить прямой доступ к ним.

(Эта система кажется мне несколько хитрым проектом: она не выглядит очень безопасной для типов реализацией... см. Мой комментарий выше. Я думаю, что дизайн, основанный на фактических типах ожидаемых значений, может быть более безопасным. Но это позволит вам достичь своей цели.)

Другие вопросы по тегам