Для перечислимых типов, за исключением 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; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!