Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1161174024
BiN
2006-10-18 16:20
2007.03.25
Перечисление системных объектных типов


2-1172936846
LigthStone
2007-03-03 18:47
2007.03.25
Unicode


15-1172581034
Rare
2007-02-27 15:57
2007.03.25
Что такое поиск в ширину в фазовом пространстве?


15-1172674025
Магедон
2007-02-28 17:47
2007.03.25
Вопрос о Skype


15-1172645449
roottim
2007-02-28 09:50
2007.03.25
Borland выпускает Delphi для PHP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский