Форум: "Основная";
Текущий архив: 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