Содержание материала

Наиболее сложным случаем является установка данных типа «набор» (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;

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить