![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поведение 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');