Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
1-82793
dimonf
2002-11-13 15:30
2002.11.25
Как зашифровать от лишних глаз INI файл ???


3-82581
Gadfly
2002-11-07 11:49
2002.11.25
Почему меня все игнорируют?


1-82751
Lina
2002-11-15 10:45
2002.11.25
Может у кого есть доки по созданию ActiveX EXE серверов ?


1-82746
Sectey
2002-11-15 11:20
2002.11.25
Организация MDI проектов или меню, толбары в MDI приложениях.


3-82658
kern
2002-11-06 13:17
2002.11.25
Read about Paradox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский