Как я могу получить исходное значение исходного варианта индексированного свойства Delphi 6, которое обращается к этому варианту? - PullRequest
3 голосов
/ 27 января 2012

У меня есть объект класса 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 Ответ

1 голос
/ 30 января 2012

Таким образом, вы хотите «получить необработанное значение базового варианта без необходимости прямого доступа к индексированному свойству и, следовательно, запускает исключение преобразования». Пока вы можете получить доступ к самому базовому варианту, да, вы можете. Скорее всего, вам потребуется изменить сам класс контейнера.

С страница справки Delphi XE2 по типам вариантов :

Стандартная функция VarType возвращает код типа варианта. varTypeMask константа - битовая маска, используемая для извлечения кода из VarType возвращаемое значение, так что, например,

VarType(V) and varTypeMask = varDouble

возвращает True, если V содержит Double или array of Double. (Маска просто скрывает первый бит, который указывает содержит ли вариант массив.) Определен тип записи TVarData в блоке System можно использовать для настройки типов и получения доступа к их внутреннее представление.

Вы должны быть в состоянии использовать комбинацию методов и записей, упомянутых здесь, чтобы узнать все, что вы хотите о внутренних данных внутри варианта, в том числе, если это вариант NULL, а также получить прямой доступ к нему.

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

...