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

Для перечислимых типов, за исключением Boolean значение передается в виде символьной строки, Boolean, как и раньше обрабатываем отдельно

Code:

   tkEnumeration:

     begin

       // Проверяем на тип Boolean - для него в VBScript есть

       // отдельный тип данных

       if CompareText(PropInfo^.PropType^.Name, 'BOOLEAN') = 0 then

       begin

         // Проверяем тип данных аргумента

         ValidType(Argument, VT_BOOL, TRUE);

         // Это свойство Boolean - получаем значение и значение

         SetOrdProp(FOwner, PropInfo, Integer(Argument.vBool));

       end else begin

         // Перечислимый тип передается в виде символьной строки

         // Проверяем тип данных аргумента

         ValidType(Argument, VT_BSTR, TRUE);

         // Получаем значение

         S := Trim(Argument.bstrVal);

         // Переводим в Integer

         I := GetEnumValue(PropInfo^.PropType^, S);

         // Если успешно - устанавливаем свойство

         if I >= 0 then

           SetOrdProp(FOwner, PropInfo, I)

         else

           raise EInvalidParamType.Create('');

       end;

     end;

 

При установке объектного свойства необходимо получить ссылку на класс Delphi, представителем которого является переданный интерфейс IDispatch. Для этого служит ранее определенный нами интерфейс IQueryPersistent. Запросив его у объекта-представителя, мы можем получить ссылку на объект VCL и корректно установить свойство.

 

Code:

   tkClass:

     begin

       // Проверяем тип данных - должен быть интерфейс IDispatch

       ValidType(Argument, VT_DISPATCH, TRUE);

       if Assigned(Argument.dispVal) then begin

         // Передано непустое значение

         // Получаем интерфейс IQueryPersistent

         IP := IDispatch(Argument.dispVal) as IQueryPersistent;

         // Получаем ссылку на класс, представителем которого

         // является интерфейс

         I := Integer(IP.GetPersistent);

       end else

         // Иначе - очищаем свойство

         I := 0;

       // Устанавливаем значение

       SetOrdProp(FOwner, PropInfo, I);

     end;

 

 

 

Для чисел с плавающей точкой основной проблемой является отработка свойства типа TDateTime. Дополнительно обеспечим возможность установить это свойство в виде символьной строки. При установке свойства типа TDateTime необходимо обеспечить трансляцию его из формата TOleDate в TDateTime

 

Code:

  tkFloat:

     begin

       if (PropInfo^.PropType^ = System.TypeInfo(TDateTime)) or

          (PropInfo^.PropType^ = System.TypeInfo(TDate)) then

       begin

         // Проверяем тип данных аргумента

         if Argument.vt = VT_BSTR then begin

           DT := StrToDate(Argument.bstrVal);

         end else begin

           ValidType(Argument, VT_DATE, TRUE);

           if VariantTimeToSystemTime(Argument.date, ST) <> 0 then

             DT := SystemTimeToDateTime(ST)

           else begin

             Result := DISP_E_BADVARTYPE;

             Exit;

           end;

         end;

         SetFloatProp(FOwner, PropInfo, DT);

       end else begin

         // Проверяем тип данных аргумента

         ValidType(Argument, VT_R8, TRUE);

         // Устанавливаем значение

         SetFloatProp(FOwner, PropInfo, Argument.dblVal);

       end;

     end;

 

 

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

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

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

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


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