Наиболее сложным случаем является установка данных типа «набор» (Set). Необходимо выделить из переданной символьной строки разделенные запятыми элементы, для каждого из них – проверить, является ли он допустимым для устанавливаемого свойства, и установить соответствующий бит в числе, которое будет установлено в качестве свойства.
Code: |
tkSet: begin // Проверяем тип данных, должна быть символьная строка ValidType(Argument, VT_BSTR, TRUE); // Получаем данные S := Trim(Argument.bstrVal); // Получаем информацию RTTI Data := GetTypeData(PropInfo^.PropType^); TypeInfo := Data^.CompType^; TypeData := GetTypeData(TypeInfo); I := 0; while Length(S) > 0 do begin // Проходим по строке, выбирая разделенные запятыми // значения идентификаторов CommaPos := Pos(',', S); if CommaPos = 0 then CommaPos := Length(S) + 1; S1 := Trim(System.Copy(S, 1, CommaPos - 1)); System.Delete(S, 1, CommaPos); if Length(S1) > 0 then begin // Поверяем, какому из допустимых значений соответствует // полученный идентификатор K := 1; GoodToken := FALSE; for J := TypeData^.MinValue to TypeData^.MaxValue do begin if CompareText(S1, GetEnumName(TypeInfo , J)) = 0 then begin // Идентификатор найден, добавляем его в маску I := I or K; GoodToken := TRUE; end; K := K shl 1; end; if not GoodToken then begin // Идентификатор не найдет Result := DISP_E_BADVARTYPE; Exit; end; end; end; // Устанавливаем значение свойства SetOrdProp(FOwner, PropInfo, I); end; |
Свойство типа Variant устанавливается несложно:
Code: |
tkVariant: begin // Проверяем тип данных аргумента ValidType(Argument, VT_VARIANT, TRUE); // Устанавливаем значение SetVariantProp(FOwner, PropInfo, Argument.pvarVal^); end; else // Остальные типы данных OLE не поддерживаются Result := DISP_E_MEMBERNOTFOUND; end; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!