![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Пожайлуста, прошу вашей помощи, нужно сделать так: Юзер вводит строку в Edit1. И если в этом Edit е есть слова cos или Sin нужно вывести Showmessage с ошибкой ? Как это реализовать ? Заранее всем спасибо .
|
|
#2
|
|||
|
|||
|
Цитата:
Например так: Код:
if pos('cos ',edit1.text)>0 or
pos('cos,',edit1.text)>0 or
pos('cos.',edit1.text)>0 then shiwmessage('Bla-bla-bla');можно занести разделители строк в массив и проверяться при помощи него в цикле. |
|
#3
|
|||
|
|||
|
Час попробую ! Значит по нажатию кнопки написать :
begin if pos('cos ',edit1.text)>0 or pos('cos,',edit1.text)>0 or pos('cos.',edit1.text)>0 then shiwmessage('Ошибочка !'); endl |
|
#4
|
||||
|
||||
|
Какой смысл писать 3 раза pos, когда все можно сделать одним?
if ((pos('cos', Edit1.Text)>0)or(pos('sin', Edit1.Text)>0)) then ShowMessage('Ошибка!'); З.Ы: перед проверкой преобразуй всю строку в один и тот же регистр, например, LowerCase; |
|
#5
|
|||
|
|||
|
Если можно, подробнее, по нажатию кнопки что писать ? Вы уж простите,но я ламер (
|
|
#6
|
||||
|
||||
|
Пишешь в OnClick для кнопки:
if ((pos('cos', LowerCase(Edit1.Text))>0)or(pos('sin', LowerCase(Edit1.Text))>0)) then ShowMessage('Ошибка!'); |
|
#7
|
|||
|
|||
|
Смысл в том что написано наличие слова, а не вхождения.
Например если в строке будет COSTIK то ваш алгоритм вернет сообщение. В предложенном мной он не посчитает что это искомое слово. |
|
#8
|
|||
|
|||
|
Так будет точнее, пожалуй :
Код:
if MyPOS2_SubStr('sin;cos', Edit1.Text, ';,/ \.:-',true)>0 then begin
Showmessage(...);
end; Код:
function MyPOS2_SubStr(sSubStr, Sx : String; sSepSubStr : String=';'; YesUpcase : boolean = true) : integer;
Var
c1,c2,i : integer;
sStr : String;
List : TStrings;
begin
Result:=0;
if (length(Sx)>0) and (length(sSubStr)>0) then begin
if YesUpcase then begin
sSubStr:=AnsiUpperCase(sSubStr);
Sx:=AnsiUpperCase(Sx);
end;
c1:=Get_CountWords_In_String(Sx, sSepSubStr, false);
c2:=Get_CountWords_In_String(sSubStr, sSepSubStr, false);
if (c1>0) and (c2>0) then begin
List:=TStringList.Create;
TRY
i:=0;
while i<c1 do
begin
i:=i+1;
sStr:=Get_Word_From_String(Sx, i, sSepSubStr, false);
if length(sStr)>0 then begin
List.Add(sStr);
end;
end;
i:=0;
while i<c2 do
begin
i:=i+1;
sStr:=Get_Word_From_String(sSubStr, i, sSepSubStr, false);
if length(sStr)>0 then begin
Result:=List.IndexOf(sStr);
if Result>=0 then begin
Result:=Result+1;
i:=c2+1;
end;
end;
end;
FINALLY
if List<>nil then begin
List.Clear;
List.Free;
end;
END;
end;
end;
end;
function MyPOS_SubStr(sSubStr, Sx : String; sSepSubStr : String=';'; YesUpcase : boolean = true) : integer;
//POS для ПодСтрок "по-группно"
//sSubStr - перечень групп символов, разделенных символом sSepSubStr
//Возвращается номер позиции в строке Sx (начиная с 1-цы), где найдена хотя бы одна группа из sSubStr
Var
c,i : integer;
sStr : String;
begin
Result:=0;
if (length(Sx)>0) and (length(sSubStr)>0) then begin
if YesUpcase then begin
sSubStr:=AnsiUpperCase(sSubStr);
Sx:=AnsiUpperCase(Sx);
end;
c:=Get_CountWords_In_String(sSubStr, sSepSubStr, false);
if c>0 then begin
i:=0;
while i<c do
begin
i:=i+1;
sStr:=Get_Word_From_String(sSubStr, i, sSepSubStr, false);
if length(sStr)>0 then begin
Result:=POS(sStr,Sx);
if Result>0 then begin
i:=c+1;
end;
end;
end;
end;
end;
end;
function Get_CountWords_In_String(Sx : String; UnChar: String=' '; YesAllTrim_Before: boolean=true) : integer;
//Определить кол-во слов в строке Sx. UnChar - множество разделителей
var
InWord : byte;
i : integer;
begin
Result:=0;
if YesAllTrim_Before then Sx:=trim(Sx);
if length(Sx)>0 then begin
InWord := 0;
i:=0;
while i<length(Sx) do
begin
i:=i+1;
if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
if InWord<=0 then Result:=Result+1; //переход на начало слова
InWord:=1; //Мы внутри слова
end
else begin //этот символ - разделитель
InWord:=0; //Мы снаружи слова
end;
end;
end;
end;
function Get_Word_From_String(Sx : String; NumWord : integer; UnChar: String=' '; YesAllTrim_Before: boolean=true) : String;
//Получить слово из строки Sx по номеру NumWord. UnChar - множество разделителей
//YesAllTrim_Before - если TRUE, то перед анализом удалить из строки левые и правые пробелы
Var
InWord : byte;
NumWordCur, i : integer;
begin
Result:='';
if YesAllTrim_Before then Sx:=trim(Sx);
if length(Sx)>0 then begin
if NumWord>0 then begin
InWord := 0;
NumWordCur:=0;
i:=0;
while i<length(Sx) do
begin
i:=i+1;
if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
if InWord<=0 then NumWordCur:=NumWordCur+1; //мы - на начале слова
InWord:=1; //Мы внутри слова
if NumWordCur=NumWord then begin //Это - наше слово
Result:=Result+Sx[i]; //и мы его выдираем из строки
end;
end
else begin //этот символ - разделитель
InWord:=0; //Мы снаружи слова
if NumWordCur=NumWord then begin //Это было - наше слово
i:=length(Sx)+1; //поэтому, выходим из цикла и функции
end;
end;
end;
end;
end;
end;Последний раз редактировалось roamer, 28.07.2010 в 16:20. |