Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поведение VarType [D7]


Ega23 ©   (2007-03-01 12:47:00) 

есть код:
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.


Ega23   (2007-03-01 14:55:00) [1]

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

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


Ega23   (2007-03-01 13:35:00) [2]

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


ЮЮ   (2007-03-01 13:23:00) [3]

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

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


Ega23   (2007-03-01 13:16:00) [4]


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


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


Elen   (2007-03-01 13:15:00) [5]


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

Тогда [1].


ЮЮ   (2007-03-01 13:11:00) [6]

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

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

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

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


Ega23   (2007-03-01 13:05:00) [7]


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


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


Ega23   (2007-03-01 13:03:00) [8]

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

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


ЮЮ   (2007-03-01 13:02:00) [9]

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 12:59:00) [10]


> Сергей М. ©   (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 12:52:00) [11]

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


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


> Ega23 ©   (01.03.07 12:47)

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо