Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
ВнизПоведение 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c