Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.07.2010, 13:13
ilsur ilsur вне форума
Прохожий
 
Регистрация: 04.03.2009
Сообщения: 17
Репутация: 10
По умолчанию Работа со строками

Пожайлуста, прошу вашей помощи, нужно сделать так: Юзер вводит строку в Edit1. И если в этом Edit е есть слова cos или Sin нужно вывести Showmessage с ошибкой ? Как это реализовать ? Заранее всем спасибо .
Ответить с цитированием
  #2  
Старый 28.07.2010, 13:33
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от ilsur
Пожайлуста, прошу вашей помощи, нужно сделать так: Юзер вводит строку в Edit1. И если в этом Edit е есть слова cos или Sin нужно вывести Showmessage с ошибкой ? Как это реализовать ? Заранее всем спасибо .
использовать например функцию POS

Например так:
Код:
if pos('cos ',edit1.text)>0 or 
   pos('cos,',edit1.text)>0 or
   pos('cos.',edit1.text)>0 then shiwmessage('Bla-bla-bla');
либо
можно занести разделители строк в массив и проверяться при помощи него в цикле.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #3  
Старый 28.07.2010, 13:45
ilsur ilsur вне форума
Прохожий
 
Регистрация: 04.03.2009
Сообщения: 17
Репутация: 10
По умолчанию

Час попробую ! Значит по нажатию кнопки написать :

begin
if pos('cos ',edit1.text)>0 or
pos('cos,',edit1.text)>0 or
pos('cos.',edit1.text)>0 then shiwmessage('Ошибочка !');
endl
Ответить с цитированием
  #4  
Старый 28.07.2010, 13:45
Аватар для Autumn
Autumn Autumn вне форума
Прохожий
 
Регистрация: 29.06.2010
Сообщения: 4
Репутация: 10
По умолчанию

Какой смысл писать 3 раза pos, когда все можно сделать одним?

if ((pos('cos', Edit1.Text)>0)or(pos('sin', Edit1.Text)>0)) then ShowMessage('Ошибка!');

З.Ы: перед проверкой преобразуй всю строку в один и тот же регистр, например, LowerCase;
Ответить с цитированием
  #5  
Старый 28.07.2010, 13:47
ilsur ilsur вне форума
Прохожий
 
Регистрация: 04.03.2009
Сообщения: 17
Репутация: 10
По умолчанию

Если можно, подробнее, по нажатию кнопки что писать ? Вы уж простите,но я ламер (
Ответить с цитированием
  #6  
Старый 28.07.2010, 14:09
Аватар для Autumn
Autumn Autumn вне форума
Прохожий
 
Регистрация: 29.06.2010
Сообщения: 4
Репутация: 10
По умолчанию

Пишешь в OnClick для кнопки:

if ((pos('cos', LowerCase(Edit1.Text))>0)or(pos('sin', LowerCase(Edit1.Text))>0)) then ShowMessage('Ошибка!');
Ответить с цитированием
  #7  
Старый 28.07.2010, 15:16
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Смысл в том что написано наличие слова, а не вхождения.

Например если в строке будет COSTIK то ваш алгоритм вернет сообщение.
В предложенном мной он не посчитает что это искомое слово.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #8  
Старый 28.07.2010, 15:50
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Так будет точнее, пожалуй :
Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025