Как в memo найти

В этом маленьком уроке я покажу вам как осуществить поиск текста в компоненте MEMO. Давайте откроем Delphi и создадим новый проект, кидаем на форму компонент Edit, Memo, Button все они с закладки Standart. Отлично, идем дальше, в обработчике OnClick кнопки прописываем следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var // Объявляем переменные
Find:string; // Искомая строка
i:integer; // Счетчик для цикла
begin
find:=Edit1.Text; // Записываем в find текст из Edit
For i:=0 to Memo1.Lines.Count-1 do // Запускаем цикл поиска строки
If Pos(FIND, Memo1.Lines.Text)<>0
Then
Begin
Memo1.SetFocus();
Memo1.SelStart:=Pos(FIND,Memo1.Lines.Text)-1;
Memo1.SelLength:=Length(FIND);
End;
end;

Программа будет искать в Memo текст введенный в Edit и если найдет выделит его. Довольно просто и понятно..

Похожие материалы

    Последние из рубрики

    • Delphi. Запрещаем второй запуск.
    • Учимся в delphi получать информацию о системе
    • Учимся освобождать занимаемую программой память на Delphi

    Мне не до конца понятно задание.
    Ты говоришь тебе даны строки
    photo1_1
    photo1_2
    photo1_2
    phot
    и нужно удалить строчку со словом phot. Строка должна в точности соответствовать вводимому тексту или слово просто должно встречаться в строке, чтоб она была удалена? Т.е. в данном примере должны удалиться все строки или только последняя?

    Добавлено через 9 минут
    Если нужно удалить только строки полностью соответствующие условию, то делаем так:

    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Find:string; // Искомая строка
    i:integer; // Счетчик для цикла
    begin
     Find:=Edit1.Text; // Записываем в find текст из Edit
    For i:=Memo1.Lines.Count-1 downto 0 do // Идём с конца мемо к началу, чтоб не пропустить строки
      If Memo1.Lines[i]=Find Then //если строка полностью совпадает, то...
        Memo1.Lines.Delete(i);//удаляем найденную строку
      end;
    end.

    Добавлено через 1 минуту
    Если же нужно удалить строки, в которых присутствует данное слово, то делаем так:

    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Find:string; // Искомая строка
    i:integer; // Счетчик для цикла
    begin
     Find:=Edit1.Text; // Записываем в find текст из Edit
    For i:=Memo1.Lines.Count-1 downto 0 do // Запускаем цикл поиска строки
      If pos(Find, Memo1.Lines[i])>0 Then//если искомое слово присутствует в строке, то...
        Memo1.Lines.Delete(i);//удаляем найденную строку
      end;


    Форум программистов Vingrad

    Модераторы: Poseidon, Snowy, bems, MetalFan

    Поиск:

    Ответ в темуСоздание новой темы
    Создание опроса
    > Как в компоненте Memo найти нужное слово, и определить номер строки,его содержащий 

    :(

       

    Опции темы

    Johnny M
    Дата 6.5.2005, 18:08 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Новичок

    Профиль
    Группа: Участник
    Сообщений: 14
    Регистрация: 21.4.2005

    Репутация: нет
    Всего: нет

    Привет всем. Нужна помощь!!!

    Пример. Компонент memo заполнен текстом. Нужно найти необходимую комбинацию слов (или просто нужное слово), например, «ананас» — и определить номер строки, его содержащий, чтобы затем вставить строку с текстовым комментарием сразу за данной строкой.

    PM MAIL   Вверх
    _hunter
    Дата 6.5.2005, 18:45 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Эксперт
    ****

    Профиль
    Группа: Участник Клуба
    Сообщений: 8564
    Регистрация: 24.6.2003
    Где: Europe::Ukraine:: Kiev

    Репутация: 15
    Всего: 98

    ну так в чем проблема? strings memo получить можно — потом в этом списке пробегаеш. а найти слово — pos

    ———————

    Tempora mutantur, et nos mutamur in illis…

    PM ICQ   Вверх
    Негодяй
    Дата 6.5.2005, 19:09 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Порядочный
    ***

    Профиль
    Группа: Завсегдатай
    Сообщений: 1513
    Регистрация: 13.2.2005
    Где: Kazakhstan, Almat y

    Репутация: нет
    Всего: 32

    Код

    procedure TForm1.Button1Click(Sender: TObject);
    var i:Integer;
    ....   //делаем ещё какие-то переменные
    begin
    for i:=1 to Memo1.Lines.Count-1 do
    if pos('ananas',memo1.Lines.Strings[i])>0 then //найдено искомое слово

    ....
    //делаем чего надо

    end;

    end.

    PM MAIL   Вверх
    Негодяй
    Дата 6.5.2005, 19:53 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Порядочный
    ***

    Профиль
    Группа: Завсегдатай
    Сообщений: 1513
    Регистрация: 13.2.2005
    Где: Kazakhstan, Almat y

    Репутация: нет
    Всего: 32

    Цитата(Johnny @ 6.5.2005, 18:08)
    … затем вставить строку с текстовым комментарием сразу за данной строкой.

    значит я перетрудился, я вставил строку сразу за словом, решение

    Код

    procedure TForm1.Button1Click(Sender: TObject);
    var i:Integer;
        s:String;
    begin
    for i:=1 to Memo1.Lines.Count-1 do
    if pos('ananas',memo1.Lines.Strings[i])>0 then
    begin
    s:=Memo1.Lines.Strings[i];
    Insert(' <-yahoo!',s,pos('ananas',memo1.Lines.Strings[i])+length('ananas'));
    Memo1.Lines.Strings[i]:=s;
    end;
    end;
    end.

    PM MAIL   Вверх
    Pakshin A. S.
    Дата 6.5.2005, 21:24 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Эксперт
    ****

    Профиль
    Группа: Участник Клуба
    Сообщений: 5056
    Регистрация: 16.2.2003

    Репутация: 21
    Всего: 61

    А случаем не от нуля ли цикл начинать надо… smile

    PM   Вверх
    RA
    Дата 6.5.2005, 22:08 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Брутальный буратина
    ****

    Профиль
    Группа: Участник Клуба
    Сообщений: 3497
    Регистрация: 31.3.2002
    Где: Лес

    Репутация: 14
    Всего: 115

    Цитата(Pakshin @ 6.5.2005, 21:24)
    А случаем не от нуля ли цикл начинать надо…

    от нуля smile

    PM   Вверх
    Негодяй
    Дата 7.5.2005, 07:52 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Порядочный
    ***

    Профиль
    Группа: Завсегдатай
    Сообщений: 1513
    Регистрация: 13.2.2005
    Где: Kazakhstan, Almat y

    Репутация: нет
    Всего: 32

    Johnny M
    Это такое задание от преподов? Можно же вместо всего описанного сделать поиск как ворде (нажимаешь поиск выделяется текст).

    PM MAIL   Вверх
    Serhik_z
    Дата 7.5.2005, 10:28 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Шустрый
    *

    Профиль
    Группа: Участник
    Сообщений: 108
    Регистрация: 4.12.2004

    Репутация: нет
    Всего: нет

    Код

    // Поиск по тексту строк
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      find: string;
      text: string;
      st, len: integer;
      res: integer;
    begin
      if Memo1.SelStart >= Length(Memo1.Text) then
        Memo1.SelStart := 0;
      st := Memo1.SelStart + 1;
      if (Memo1.SelLength <= 0) or (not CheckBox1.Checked) then
      begin
        inc(st, Memo1.SelLength);
        len := Length(Memo1.Text) - st;
      end
      else
        len := Memo1.SelLength;
      text := copy(Memo1.Text, st, len);
      find := Edit1.Text;
      res := pos(find, text);
      if res = 0 then
      begin
        ShowMessage('Строка "' + find + '" не найдена');
        Exit;
      end;
      Memo1.SelStart := res + st - 2;
      Memo1.SelLength := length(find);
    end;

    Добавь на форму CheckBox

    PM MAIL   Вверх
    Fantasist
    Дата 7.5.2005, 18:29 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Лентяй
    ***

    Профиль
    Группа: Участник Клуба
    Сообщений: 1517
    Регистрация: 24.3.2002

    Репутация: нет
    Всего: 41

    Что-то не понял, а на фига цикл по Lines? Есть же свойство Техt, которая выдает текст целиком.

    ———————

    Волны гасят ветер…

    PM MAIL   Вверх
    Marriage
    Дата 7.5.2005, 20:08 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Опытный
    **

    Профиль
    Группа: Участник
    Сообщений: 842
    Регистрация: 4.5.2004
    Где: Таганрог

    Репутация: нет
    Всего: 2

    А если слово перенесено ……smile
    То есть

    Цитата
    ……………………………………… Ана-
    нас

    ———————

    Praemonitus, praemunitus

    PM MAIL ICQ   Вверх
    RA
    Дата 7.5.2005, 21:08 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Брутальный буратина
    ****

    Профиль
    Группа: Участник Клуба
    Сообщений: 3497
    Регистрация: 31.3.2002
    Где: Лес

    Репутация: 14
    Всего: 115

    Цитата(Marriage @ 7.5.2005, 20:08)
    А если слово перенесено

    То ворд врап включить.
    Добавлено @ 21:10

    Цитата(Fantasist @ 7.5.2005, 18:29)
    Что-то не понял, а на фига цикл по Lines? Есть же свойство Техt, которая выдает текст целиком.

    Ну в вопросе сказанно что нужен номер строки.

    PM   Вверх



















    Ответ в темуСоздание новой темы
    Создание опроса
    Правила форума «Delphi: Общие вопросы»
    SnowyMetalFan
    bemsPoseidon
    Rrader

    Запрещается!

    1. Публиковать ссылки на вскрытые компоненты

    2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

    • Литературу по Дельфи обсуждаем здесь
    • Действия модераторов можно обсудить здесь
    • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
    • Вопросы по реализации алгоритмов рассматриваются здесь
    • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


    Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

     

    0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
    0 Пользователей:
    « Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

    Июнь 29, 2013

    Untitled-2 Memo потрясающий по своей простоте и удобности компонент! Но далеко не все осознают его мощь.

    Сегодня я хочу научить вас делать поиск по этому компоненту.

    На многих сайтах видел подобные статьи с примерами, но меня не устраивал всегда один нюанс: поиск всегда производился всего один раз, без возможности реализации кнопки «найти след.» Давайте сделаем нормальный поиск по компоненту Memo:

    Скачать видео

    Кидаем на форму компоненты Memo1, Button1, Edit1

    Для начала нам понадобятся несколько вспомогательных, глобальных переменных:

    1
    2
    3
    4
    
    var
    s:string;  //В этой переменной мы будем производить поиск, в ней же будем обрезать текст
    p:integer; //Здесь будут храниться координаты найденного куска текста
    i:integer; //Количество обрезанных символов

    В обработчике нажатия Button1 пишем:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
     
    if p=0 then begin
     i:=0;                       //если поиска еще не было то заполняем переменные начальными для поиска значениями
     s:= Memo1.Text ;            // переносим весь текст в переменную в которой будем производить поиск
    end;
     
    p:= pos(edit1.Text,s);      //ищем строку в переменной s
    if p<>0 then                //если строка найдена то делаем
     begin
                                //три следующие строчки - выделяем найденный текст
      Memo1.SetFocus();                    
      memo1.SelStart:=p+i-1;                
      memo1.SelLength:=length(edit1.text); 
     
      i:=i+p+length(edit1.Text)-1;                  //заполняем i новыми данными об обрезанном количестве символов
      s:= copy(s,p+length(edit1.Text),length(s));   //обрезаем строковую переменную чтобы исключить повторные нахождения одного и того же элемента
     end else showmessage('поиск закончен');

    Чтобы не было лишних багов при любом изменении Edit1 нужно обнулять переменную p. Я делаю это в событии OnKeyDown:

    Вот и все, удачки вам)

    P.S. Если хотите постичь все фишки работы с Delphi, то возможно стоит задуматься о приобретении моего курса по Delphi — progdelphi.ru/

    Понравилась статья? Жми:

    Поделиться в соц. сетях

    Публикатор/Автор: Артём Кашеваров

      msm.ru

      Нравится ресурс?

      Помоги проекту!

      Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


      Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
      1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
      2. Как «свернуть» программу в трей.
      3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
      4. Как прочитать список файлов, поддиректорий в директории?
      5. Как запустить программу/файл?
      … (продолжение следует) …


      Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
      Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


      Внимание
      Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
      Повторная попытка — 60 дней. Последующие попытки бан.
      Мат в разделе — бан на три месяца…

      >
      Поиск строки в Мемо

      • Подписаться на тему
      • Сообщить другу
      • Скачать/распечатать тему

        


      Сообщ.
      #1

      ,
      02.08.06, 15:58

        есть компонент Мемо1 в нем имеется некоторый текст
        Как мне в этом Мемо1 организавать поиск средующей построки —####
        и если ее нет в Мемо1 то выдать сообщение об этом

        Profi

        Shaggy



        Сообщ.
        #2

        ,
        02.08.06, 16:02

          Moderator

          *****

          Рейтинг (т): 130

          Memo.Text+pos


          olga90



          Сообщ.
          #3

          ,
          02.08.06, 16:16

            Цитата Shaggy @ 02.08.06, 16:02

            Memo.Text+pos

            а можно пример или чуть поподробнее


            DMX_XC



            Сообщ.
            #4

            ,
            02.08.06, 16:17

              Senior Member

              ****

              Рейтинг (т): 21

              Если правильно понял тебя. Но эту процедуру я использовал для RichEdit

              ExpandedWrap disabled

                procedure TTextDoc.Stroka;

                VAR

                RLNum : LongInt;

                RKNum : LongInt;

                begin

                RLNum := RichEdit.Perform(EM_LINEFROMCHAR, RichEdit.SelStart, 0);

                RKNum := RichEdit.Perform(EM_LINEINDEX, RLNum, 0);

                StatusBar1.Panels[0].text := ‘Ст ‘+IntToStr(RLNum+1)+’    Кол ‘+IntToStr((RichEdit.SelStart-RKNum)+1);

                end;


              Alex Wolf



              Сообщ.
              #5

              ,
              02.08.06, 16:24

                Full Member

                ***

                Рейтинг (т): 16

                Цитата olga90 @ 02.08.06, 16:16

                а можно пример или чуть поподробнее

                ExpandedWrap disabled

                  if Pos(’55’, Memo1.Text)=0 then

                    ShowMessage(‘Не найден текст «55»‘);

                Вместо ’55’ — подставь то, что тебе надо найти

                Сообщение отредактировано: Alex Wolf — 02.08.06, 16:27


                olga90



                Сообщ.
                #6

                ,
                02.08.06, 16:43

                  Всем спасибо. :yes:


                  olga90



                  Сообщ.
                  #7

                  ,
                  09.08.06, 16:28

                    а как мне удалить найденные символы
                    т.е. нахожу так

                    ExpandedWrap disabled

                      if Pos(’55’, Memo1.Text)=0 then

                      //нужно их удалить из Мемо1


                    Anatoly Podgoretsky



                    Сообщ.
                    #8

                    ,
                    09.08.06, 16:34

                      SelStart, SelLength
                      SelText := »
                      SelStart вернет Pos, SelLength=длина текста поиска
                      Pos() должен быть > 0


                      olga90



                      Сообщ.
                      #9

                      ,
                      09.08.06, 17:07

                        Цитата Anatoly Podgoretsky @ 09.08.06, 16:34

                        ExpandedWrap disabled

                          Pos() должен быть > 0

                        это конечно же так :yes: — я видать просмотрела :rolleyes:

                        так как удалить, я так и не поняла??? :huh:


                        Soul :)



                        Сообщ.
                        #10

                        ,
                        09.08.06, 17:18

                          ExpandedWrap disabled

                            ps:=Pos(substr, Memo1.Text);

                            if ps<>0 then

                              begin

                               st:=memo1.text;

                               delete(st,ps,length(substr));

                               memo1.text:=st;

                              end;

                             else

                              showmessage(‘Ошибка!’);

                          ИМХО так элегантнее, и удалит все вхождения подстроки в строку…

                          ExpandedWrap disabled

                            memo1.text:=stringreplace(memo1.text,substr,»,[rfReplaceAll, rfIgnoreCase]);


                          olga90



                          Сообщ.
                          #11

                          ,
                          09.08.06, 17:41

                            Цитата Soul :) @ 09.08.06, 17:18

                            ExpandedWrap disabled

                              memo1.text:=stringreplace(memo1.text,substr,»,[rfReplaceAll, rfIgnoreCase]);

                            такой вариант для меня лучше, т.к. сразу удаляет из всех строк нужную подстроку
                            как тем временем первый вариант только первое найденное и нужно вызывать еще раз
                            Soul :), спасибо :yes:

                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                            0 пользователей:

                            • Предыдущая тема
                            • Delphi: Общие вопросы
                            • Следующая тема

                            Рейтинг@Mail.ru

                            [ Script execution time: 0,0377 ]   [ 16 queries used ]   [ Generated: 27.05.23, 17:10 GMT ]  

                            Понравилась статья? Поделить с друзьями:
                          • Как найти продюсера для певца в москве
                          • Как найти the open road
                          • Как найти скалярное произведение коллинеарных векторов
                          • Как найти длину ломанной линии
                          • Как найти коэффициент точечной эластичности спроса