-
Дмитрий С (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 }