![]() |
|
|
Регистрация | << Правила форума >> | 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. |