Конференция "Прочее" » Молчаливый OleVariant
 
  • Дмитрий С (28.09.08 15:53) [0]
    Можно ли как нибудь сделать OleVariant более молчаливым:
    т.е. при typeCast-е между типами null, строка и число не возникало исключений, а значение варианта принималось "поумолчанию" в случае, если тайпкаст невозможен.
    Например:
    null --в строку--> ''
    null --в число--> 0
    'АБВ' --в число--> 0
    '3G' --в число--> 3
    и т. п.
  • Cobalt (28.09.08 16:07) [1]
    пиши свою функцию, которая и будет это делать "тихо"
  • int64 (28.09.08 17:56) [2]
    Создать свою структуру.
    Перегружаемые операторы в Д появились.
  • Дмитрий С (28.09.08 18:22) [3]

    > Создать свою структуру.
    > Перегружаемые операторы в Д появились.

    Дело в том, что у меня OleVariant-ы используются уже повсеместно, причем передаются в качестве параметров сторонним модулям.
  • Eraser © (28.09.08 18:51) [4]
    см. NullStrictConvert
  • Медвежонок Пятачок © (28.09.08 19:21) [5]
    vartostr
  • Дмитрий С (28.09.08 19:24) [6]

    > Eraser ©   (28.09.08 18:51) [4]

    Спасибо, кажеться то что нужно.
    А как быть с конвертированием строки в число?
    'АБВ' --в число--> 0
    '3G' --в число--> 3
  • Дмитрий С (28.09.08 19:25) [7]

    > Медвежонок Пятачок ©   (28.09.08 19:21) [5]
    >
    > vartostr

    Нужно чтобы изменения были прозрачны для всего остального кода.
  • int64 (28.09.08 19:28) [8]

    > Дело в том, что у меня OleVariant-ы используются уже повсеместно

    Так бы и писал: "Решить проблему, не меняя ни строчки кода"

    > причем передаются в качестве параметров сторонним модулям

    И что?
    Если только проблемы на приводимость c null, дергай NullStrictConvert
    Если же хочется, чтобы '3G' --в число--> 3:

    type
     TForm1 = class(TForm)
       Button1: TButton;
       procedure Button1Click(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

     MyVariant = record
     private
       Data: Variant;
     public
       class operator Implicit(Value: MyVariant): Variant;
       class operator Implicit(Value: Variant): MyVariant;
       class operator Implicit(Value: MyVariant): Integer;
       class operator Implicit(Value: MyVariant): string;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    class operator MyVariant.Implicit(Value: MyVariant): Variant;
    begin
     Result := Value.Data;
    end;

    class operator MyVariant.Implicit(Value: Variant): MyVariant;
    begin
     Result.Data := Value
    end;

    class operator MyVariant.Implicit(Value: MyVariant): Integer;
    begin
     if VarToStr(Value.Data) = '3G' then
       Result := 300
     else
     if VarToStr(Value.Data) = 'АБВ' then
       Result := 0
     else
       Result := StrToIntDef(VarToStrDef(Value.Data, '0'), 0);
    end;

    class operator MyVariant.Implicit(Value: MyVariant): string;
    begin
     Result := VarToStr(Value.Data);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
     MV: MyVariant;
    begin
     MV := '3G';
     ShowMessage(MV);
     Self.Left := MV;
    end;

  • Дмитрий С (28.09.08 19:31) [9]

    > var
    >  MV: MyVariant;
    > begin
    >  MV := '3G';
    >  ShowMessage(MV);
    >  Self.Left := MV;
    > end;

    Не подходит. OleVariant на MyVariant в коде менять нельзя.
  • int64 (28.09.08 19:49) [10]
    Два варианта: либо свой OleVariant писать, либо генокод править для отдельно взятого проекта.
  • Дмитрий С (28.09.08 19:52) [11]

    > генокод

    там специально для таких как я написано
    { Variant math and conversion support }
    { DO NOT MODIFY -  Required by compiler codegen - DO NOT MODIFY }
 
Конференция "Прочее" » Молчаливый OleVariant
Есть новые Нет новых   [134442   +15][b:0][p:0.001]