Как правильно установить опубликованное свойство Variant

Я пишу компонент, который публикует свойство Variant с именем «Value». В окне инспектора объектов я вижу свойство и его Тип.

введите описание изображения здесь

Иногда, после выбора типа «String» из выпадающего списка, он становится «неизвестным».

введите описание изображения здесь

Вот код метода сеттера:

procedure TMyComponent.FSetValue(const AValue : Variant);
begin
  if(FValue <> AValue) OR (TVarData(FValue).VType <> TVarData(AValue).VType) then
  begin
    FValue := AValue;
    if(@FOnChanged <> nil)
    then FOnChanged(Self);
  end;
end;

Есть ли что-то, что нужно изменить?

Дополнительная информация:

Когда появляется «неизвестный» тип, тип параметра AValue устанавливается равным 256.

В System.pas я нашел следующее:

varString = $ 0100; {Строка Pascal 256} {не совместима с OLE}

.. но я до сих пор не могу понять, почему показано «неизвестное».

delphi,types,properties,set,variant,

1

Ответов: 2


2

Проблема заключается в том, что функция TVariantTypeProperty.GetValue в DesignEditors читает тип из значения Variant, а затем пытается найти его в ограниченном списке, который, по-видимому, охватывает только совместимые с OLE варианты плюс конкретное исключение для строки UniCode. Код для TVariantTypeProperty.SetValue переводит «string» для ввода varString, который, как представляется, является прокси для старого стиля AnsiString, а не современной строки UniCode. GetValue переводит тип varUString для отображения типа как строки и оставляет varString как «неизвестный». Это похоже на ошибку в интерфейсе проектирования Delphi, поскольку на самом деле не должно быть никакого различия между методами GetValue и SetValue.

Я проверил это только на XE2, поэтому не знаю, какие другие версии могут / не могут быть затронуты, хотя вы можете разумно толковать, что по крайней мере все предыдущие версии, так как это повлияло на преобразование Unicode.


0

У меня такая же проблема. Единственная работа, которую я мог найти, - это присвоить строковое значение Value. Как это.

procedure TMyComponent.FSetValue(const AValue : Variant);
  begin
    if(FValue <> AValue) OR (TVarData(FValue).VType <> TVarData(AValue).VType) then
      begin
        FValue := AValue;

          case TVarData(FValue).VType of
            varString : FValue := VarToStr( AValue ); //converts FValue to a string
          end;

         if(@FOnChanged <> nil) then 
           FOnChanged(Self);
      end;
  end;
Дельфи, типы, свойства, установить, вариант,
Похожие вопросы