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

Вниз

Проверка значения строки:   Найти похожие ветки 

 
Separator ©   (2002-11-11 07:51) [0]

Мне нужно проверичть, что записано в строке: дата, число или текст. Я делаю так:

type
TTypeStr = (tsString, tsDate, tsNumber);

function TypeStr(St: string): TTypeStr;
var
WNumber: real;
WDate: TDateTime;
begin
Result:= tsNumber;
try
WNumber:= StrToFloat(St);
except
on EConvertError do
begin
Result:= tsDate;
try
WDate:= StrToDateTime(St);
except
on EConvertError do
Result:= tsString
end
end
end
end;


Как мне сделать, чтоб в дебаг режиме в этой функции не вылетало сообщение об ошибке. Или предложите другой метод проверки.


 
sask ©   (2002-11-11 08:01) [1]

Tools -> Debugger Options -> Language Exception: Stop on Delphi Exceptions


 
Separator ©   (2002-11-11 08:07) [2]

Ну так он не будет вообще останавливаться, а мне надо только в этой процедуре!!!!!


 
Smithson ©   (2002-11-11 09:38) [3]

никак


 
KoluChi ©   (2002-11-11 10:06) [4]

проверять по-символьно


 
stone ©   (2002-11-11 10:23) [5]

приведи значение к Variant, а потом проверяй стандартной функцией
function VarIsType(const V: Variant; AVarType: TVarType): Boolean;


 
Separator ©   (2002-11-11 10:23) [6]

Это слишком муторно писать, а других способов нет?


 
Separator ©   (2002-11-11 10:26) [7]


> stone © (11.11.02 10:23)
А пример можно, я вообще стараюсь варианты избегать, поэтому с ними еще и не работал


 
stone ©   (2002-11-11 10:27) [8]

ну уж если написать одну строку кода муторно, тогда я не знаю...


 
Separator ©   (2002-11-11 10:27) [9]


> stone © (11.11.02 10:27)
Это я не тебе писал


 
stone ©   (2002-11-11 10:29) [10]

Separator © (11.11.02 10:26)

> stone © (11.11.02 10:23)
А пример можно, я вообще стараюсь варианты избегать, поэтому с ними еще и не работал

Без проблем, только скажи для начала откуда ты получаешь значение которое надо проверить?


 
Separator ©   (2002-11-11 10:30) [11]

Из строковой переменной, это не имеет значения


 
stone ©   (2002-11-11 10:37) [12]

Separator © (11.11.02 10:30)
Из строковой переменной, это не имеет значения

Имеет значение, строковая переменная - это строковая переменная, и никакая другая, ее можно преобразовать в другой формат, но она сама является строкой.


 
Smithson ©   (2002-11-11 10:53) [13]

Если у тебя строка, то stone прав, как ни изгаляйся, а ничего кроме твоего дерева try .. except не предложишь.


 
Separator ©   (2002-11-11 10:53) [14]


> stone © (11.11.02 10:37
ты там что-то говорил про вариант, приведи пример пожалуйста


 
KoluChi ©   (2002-11-11 10:57) [15]

вот что нашел (функция возможно не оптимизирована),
что-то наподобие можно сделать и с датой:
function GetTextReal(Str: AnsiString; var Res: Real): Boolean;
function SkipBlanks(Buf: PChar): PChar;
begin
while (Buf^ = " ") do
Inc(Buf);
Result := Buf;
end;
var
Buf: PChar;
Negative: Boolean;
Int: Real;
Dec, Pow: Real;
begin
Int := 0;
Dec := 0;
Pow := 10;
Result := true;
Negative := false;
Buf := SkipBlanks(PChar(Str));
if (Buf^ = #0) then Res := 0;
if (Buf^ = "-") then
begin
Negative := true;
Inc(Buf);
end;
Buf := SkipBlanks(PChar(Buf));
while (Buf^ in ["0".."9"]) do
begin
Int := Int * 10 + (Ord(Buf^) - Ord("0"));
Inc(Buf);
end;
Buf := SkipBlanks(PChar(Buf));
if (Buf^ in [".", ","]) then
begin
Inc(Buf);
Buf := SkipBlanks(PChar(Buf));
while (Buf^ in ["0".."9"]) do
begin
Dec := Dec + (Abs(Ord(Buf^) - Ord("0")) / Pow);
Pow := Pow * 10;
Inc(Buf);
end;
end;
Res := Int + Dec;
if (Negative) then Res := -Res;
if (Res = 0) and (Trim(Str) <> "0") Result := false;
end;


 
Skyle ©   (2002-11-11 11:00) [16]

procedure Check(Value : Variant);
begin
case VarType(Value) of
varString : ShowMessage("This is a String");
varDouble, varInteger : ShowMessage("This is a number");
varDate : ShowMessage("This is a Date");
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Check(10);
Check("fuck off");
Check(Now);
end;


 
KoluChi ©   (2002-11-11 11:01) [17]

Variant все равно будет пытататься преобразовать с помощью системных настроек (т.е. разделителем будет считаться только "." или ",", а дата должна быть в определенном формате). Этот вариант/Variant в данном случае не очень хорош. Самое логичное решение - проверять по-символьно. Муторно, но что делать?


 
Skyle ©   (2002-11-11 11:09) [18]

Currency and date/time formatting variables ?


 
Separator ©   (2002-11-11 11:11) [19]


> Skyle © (11.11.02 11:09)
Это о чем?


 
Skyle ©   (2002-11-11 11:29) [20]


> KoluChi © (11.11.02 11:01)
> Variant все равно будет пытататься преобразовать с помощью
> системных настроек (т.е. разделителем будет считаться только
> "." или ",", а дата должна быть в определенном формате).
> Этот вариант/Variant в данном случае не очень хорош. Самое
> логичное решение - проверять по-символьно. Муторно, но что
> делать?

Это я об этом... Хотя, на самом деле, я мало что понял...%) Особенно по поводу того, какой вариант имеется ввиду...


 
KoluChi ©   (2002-11-11 11:40) [21]

Имеется ввиду вариант работы с Variant :)


 
Skyle ©   (2002-11-11 11:47) [22]

Это который мой чтоли? %)))


 
Separator ©   (2002-11-12 06:18) [23]


> Skyle © (11.11.02 11:00)
Это метод работает вообще не так. У меня только одеа строковая переменная, в ней хранится в тестовом виде строка, чило или дата: "текст", "1111", "12.11.02 9:14:39"


 
Separator ©   (2002-11-13 12:58) [24]

Решил. Оказываетс я это очень просто.


type
TTypeStr = (tsString, tsDate, tsNumber);

function CheckString(Value: string): TTypeStr;
begin
if StrToDateTimeDef(Value, 0) = 0 then
if StrToIntDef(Value, 0) = 0 then
Result:= tsString
else
Result:= tsNumber
else
Result:= tsDate
end;


 
Skyle ©   (2002-11-14 13:38) [25]

А не проще ли не заморачиваться приведением типов? Ведь типы даннх придумали для того, чтобы ими пользовались? Может имеет смысл передавать значения в процедуру именно того типа, которого нужно, без приведения их к строке.
Конечно, я не знаю, может это и оправдано в программе, но ИМХО, это увеличение энтропии, которая, в свою очередь, как известно, мера хаоса...:)


 
Separator ©   (2002-11-14 13:49) [26]

Во блин загнул. Было-бы конечно проще, но тут воозникает небольшая проблемка, я получаю эти данные в нормальном виде и записываю в StringGrid, а там как ивестно все храниться в текстовом формате. Просто сложилась такая ситуация, что в одном столбце могуть быть разные данные, там куча условий, вот мне иногда и надо проверять что там записано.



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

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

Наверх




Память: 0.53 MB
Время: 0.014 c
14-82964
Василий
2002-11-06 17:59
2002.11.25
Кто ни будь знает как программно инсталлировать шрифт ?


4-83042
kofman
2002-10-11 09:57
2002.11.25
Как сделать, что бы PopUpMenu не закрывалось сразу после выбора?


14-82926
PVOzerski
2002-11-05 14:13
2002.11.25
Какая-то проблема с железом


4-83063
Asteroid
2002-10-14 00:25
2002.11.25
Приостановка чужого процесса/нити


14-82913
Shadow
2002-11-06 22:31
2002.11.25
Детская преступность