Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.11.30;
Скачать: [xml.tar.bz2];

Вниз

Молчаливый 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
2-1224101559
deras
2008-10-16 00:12
2008.11.30
Как вложить в тело письма html код?


4-1201263223
BBCHa
2008-01-25 15:13
2008.11.30
Com-порт и CLX


2-1224231868
NieL
2008-10-17 12:24
2008.11.30
COM и 1С


2-1224600668
romychk
2008-10-21 18:51
2008.11.30
dat файлы


11-1196072469
vampir_infernal
2007-11-26 13:21
2008.11.30
Меню формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский