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

Вниз

Поведение VarType   Найти похожие ветки 

 
Ega23 ©   (2007-03-01 12:47) [0]

есть код:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

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

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
i : byte = 6;
begin
DoSmthng(i);
end;

procedure TForm1.DoSmthng(x: variant): Boolean;
begin
 if VarType(x)=varInteger  then ShowMessage("Yes") else ShowMessage("No");
end;

end.


Очень хочется в DoSmthng(x: variant) получать выполнение условия для любых целочисленных типов до Integer включительно.
Т.е. и для byte, и для word и для Integer.


 
Сергей М. ©   (2007-03-01 12:52) [1]

case VarType(x) of
 varInteger, varByte, varWord, varLongword, varInt64: ....;
end;


 
Elen ©   (2007-03-01 12:52) [2]


> Ega23 ©   (01.03.07 12:47)

А так :
if VarIsNumeric(x)and not (VarIsFloat(x))  then ShowMessage("Yes") else ShowMessage("No");


 
Ega23 ©   (2007-03-01 12:59) [3]


> Сергей М. ©   (01.03.07 12:52) [1]
>
> case VarType(x) of
>  varInteger, varByte, varWord, varLongword, varInt64: ..
> ..;
> end;


блин... а по-другому никак нельзя?
У  меня складывается впечатление, что под delphi 7 работа с вариантами как-то хитрее реализована, чем в пятом. Подозрение на выравнивание типов.

Дело вот в чём:
Был большой проект под D5. 2 недели назад был переведён на D7. Вчера обнаружился глюк - не ведётся протоколирование событий. После долгих телодвижений дошёл до следующего кода:

 // Check event code type. Must be integer;
 if (varType(event.code) <> varInteger) then
 begin
   Result := false;
   exit;
 end;  


диапазон значений event.code от 1 до много (8000 вроде значение есть). Фактически - это значение ключевого поля в БД. Из набора данных берётся через DataSet.FieldByName(...).Value;

Так вот, большинство значений всё-таки в диапазоне от 1 до 200.
И тут я с удивлением обнаруживаю, что для event.code=6 данное условие выполняется.
Блин, но под пятёркой-то всё работало????


 
ЮЮ ©   (2007-03-01 13:02) [4]

Elen ©   (01.03.07 12:52) [2]

VarIsNumeric(x)and not (VarIsFloat(x)) = VarIsOrdinal, а это несколько больше, чем требуется:

function VarTypeIsOrdinal(const AVarType: TVarType): Boolean;
begin
 Result := AVarType in [varSmallInt, varInteger, varBoolean, varShortInt,
                        varByte, varWord, varLongWord, varInt64];
end;

Религия не позволяеят написать подобную  VarTypeIsOrdinal - VarIsOrdinal и пр. пару функций, где и перечислить нужные типы?


 
Ega23 ©   (2007-03-01 13:03) [5]

Я вот думаю, может директиву какую надо включить? Или что-то в опциях проекта указать? Чтобы выравнивание до Integer шло.
Просто для приведённого кода
procedure TForm1.DoSmthng(x: variant): Boolean;
begin
if VarType(x)=varInteger  then ShowMessage("Yes") else ShowMessage("No");
end;

вызов DoSmthng(6) выбросит сообщение "No".


 
Ega23 ©   (2007-03-01 13:05) [6]


> Религия не позволяеят написать подобную  VarTypeIsOrdinal
> - VarIsOrdinal и пр. пару функций, где и перечислить нужные
> типы?


Религия-то позволяет, да вот проблема в том, что это не в одном месте. А проект, повторюсь - достаточно большой.
Кроме этого просто хотелось бы понять, в чём тут дело. Под пятёркой всё прекрасно работало....


 
ЮЮ ©   (2007-03-01 13:11) [7]

вызов DoSmthng(6) выбросит сообщение "No".

Естественно. Думашь компилятор для таоей 6 Integer выделит?

вызов DoSmthng(Integer(6)) выбросит сообщение "Yes".

DataSet.FieldByName(...).Value;
Это тоже может оказаться не TIntegerField (хотя их там все-же поменьше, чем целых варантов)


 
Elen ©   (2007-03-01 13:15) [8]


> ЮЮ ©   (01.03.07 13:02) [4]

Тогда [1].


 
Ega23 ©   (2007-03-01 13:16) [9]


> Это тоже может оказаться не TIntegerField (хотя их там все-
> же поменьше, чем целых варантов)


В таблице явно тип int.


 
ЮЮ ©   (2007-03-01 13:23) [10]

У разного сервера int тоже может разный оказаться :)
Если для него создается TIntegerField, то это правильный int.

P.S. Парадоксовский "I  Long Integer" на деле (или на Delphi) оказывается не таким уж Long, как ему казалось :)


 
Ega23 ©   (2007-03-01 13:35) [11]

Кажется дело в директиве {$A+}
Сейчас проверю...


 
Ega23 ©   (2007-03-01 14:55) [12]

мда...
Ну в общем, сделал как в [1].
Всем рекомендую "иметь ввиду".

З.Ы. Ох прав был папа Вирт, когда говорил, что Variant - суть Лжа Антихристова



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

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

Наверх




Память: 0.49 MB
Время: 0.029 c
2-1172749479
Kolan
2007-03-01 14:44
2007.03.25
Поле компонента становится nil само по себе в run time.


9-1145986128
guitarist
2006-04-25 21:28
2007.03.25
Оформление шахмат


2-1172743088
марина
2007-03-01 12:58
2007.03.25
вывод файла


15-1172872547
Владмир
2007-03-03 00:55
2007.03.25
лицензирование Delphi 6


15-1172496149
Двоишник
2007-02-26 16:22
2007.03.25
Лицензия