Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.30;
Скачать: CL | DM;

Вниз

Молчаливый OleVariant   Найти похожие ветки 

 
Дмитрий С   (2008-09-28 15:53) [0]

Можно ли как нибудь сделать OleVariant более молчаливым:
т.е. при typeCast-е между типами null, строка и число не возникало исключений, а значение варианта принималось "поумолчанию" в случае, если тайпкаст невозможен.
Например:
null --в строку--> ""
null --в число--> 0
"АБВ" --в число--> 0
"3G" --в число--> 3
и т. п.


 
Cobalt   (2008-09-28 16:07) [1]

пиши свою функцию, которая и будет это делать "тихо"


 
int64   (2008-09-28 17:56) [2]

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


 
Дмитрий С   (2008-09-28 18:22) [3]


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

Дело в том, что у меня OleVariant-ы используются уже повсеместно, причем передаются в качестве параметров сторонним модулям.


 
Eraser ©   (2008-09-28 18:51) [4]

см. NullStrictConvert


 
Медвежонок Пятачок ©   (2008-09-28 19:21) [5]

vartostr


 
Дмитрий С   (2008-09-28 19:24) [6]


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

Спасибо, кажеться то что нужно.
А как быть с конвертированием строки в число?
"АБВ" --в число--> 0
"3G" --в число--> 3


 
Дмитрий С   (2008-09-28 19:25) [7]


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

Нужно чтобы изменения были прозрачны для всего остального кода.


 
int64   (2008-09-28 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;


 
Дмитрий С   (2008-09-28 19:31) [9]


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

Не подходит. OleVariant на MyVariant в коде менять нельзя.


 
int64   (2008-09-28 19:49) [10]

Два варианта: либо свой OleVariant писать, либо генокод править для отдельно взятого проекта.


 
Дмитрий С   (2008-09-28 19:52) [11]


> генокод

там специально для таких как я написано
{ Variant math and conversion support }
{ DO NOT MODIFY -  Required by compiler codegen - DO NOT MODIFY }


 
Eraser ©   (2008-09-28 19:57) [12]

> "АБВ" --в число--> 0
> "3G" --в число--> 3

никак, вручную проверять и править. могут помочь регулярные выражения, хотя возможно усложнять не стоит.


 
kaif ©   (2008-09-28 21:02) [13]

Я только что создал копию модуля Variants в директории своего проекта Project1, главной форме которого обработчик кнопки Button1 выглядит так:

procedure TForm1.Button1Click(Sender: TObject);
var
 v: variant;
begin
 v := NULL;
ShowMessage(IntToStr(v));
end;


Разумеется, это дает ошибку EVariantTypeCastError.

Теперь я закомментировал вот это место в модуле Variants и сделал rebuild проекта:

procedure VarCastError(const ASourceType, ADestType: TVarType);
begin
//  raise EVariantTypeCastError.CreateFmt(SVarTypeCouldNotConvert, !!!!!
//    [VarTypeAsText(ASourceType), VarTypeAsText(ADestType)]);
end;

В результате ругань исчезла.
ShowMessage вывел число 1243048.
Я думаю, что можно так изменить модуль Variants, что он обеспечит нужное поведение.

Если бы я решал подобную задачу, то я бы как раз и пошел путем правки копии модуля Variants, которую бы просто поместил в директорию своего проекта. Иногда я так борюсь с некоторыми ошибками в исходном коде VCL.


 
Дмитрий С   (2008-09-28 21:07) [14]


> kaif ©   (28.09.08 21:02) [13]

Спасибо! Похоже это то что нужно!


 
kaif   (2008-09-29 01:12) [15]

2 Дмитрий С   (28.09.08 21:07) [14]

Кстати, ты можешь создать свой модуь Variants или любой иной, и указать путь к папке, к оторой он находится, в Project|Project Manager закладка "Search Path" Delphi.

Я так "русифицирую" Delphi.

Я указываю путь к *const.pas в своих проектах, а там лежат русифицированные cosnt и resoursestring объявлениия.

В результате, например, мой MessageDlg выводит кнопки с русскими "Да", "Нет" вместо "Yes", "No" (что иногда немаловажно :).

Разработали киевляне, сделав некий RusConsts каталог,в котором есть русифицированные ресурсы Delphi для подобных случаев (сообщения об ошибках, заголовки кнопок и т.п.).

Delphi при компиляции ищет мдули следующим способом:
1. Ищет одноименный модуль в родной директории проекта
2. Ищет модуль в директориях, указанных с Search Path окна Project Manager.
3. Ищет одноименный модуль в VCL Delphi.



Страницы: 1 вся ветка

Текущий архив: 2008.11.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1224507050
Игорь
2008-10-20 16:50
2008.11.30
Как определить заглавная буква или нет


15-1222602793
Дмитрий С
2008-09-28 15:53
2008.11.30
Молчаливый OleVariant


3-1210606073
Вася
2008-05-12 19:27
2008.11.30
Firebird и список БД


2-1224767006
Lamer6666
2008-10-23 17:03
2008.11.30
Kak obratit sa k elementu formi po ego imeni?


3-1210573854
kadr
2008-05-12 10:30
2008.11.30
Оптимизация запроса