Текущий архив: 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.48 MB
Время: 0.006 c