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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.04.2008, 16:50
shaman shaman вне форума
Новичок
 
Регистрация: 19.07.2007
Сообщения: 65
Репутация: 5
Стрелка Поиск текста в Memo

Мне необходимо выполнить поиск текста в memo. Искомый текст вводится в Edit и необходимо полностью задействовать компонент FindDialog.
Ответить с цитированием
  #2  
Старый 19.04.2008, 17:16
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

http://delphiworld.narod.ru/base/memo_str_search.html
http://www.beluch.ru/progr/100comp/8_7.htm
Учись пользоваться Яндексом.
__________________

Ответить с цитированием
  #3  
Старый 19.04.2008, 18:30
shaman shaman вне форума
Новичок
 
Регистрация: 19.07.2007
Сообщения: 65
Репутация: 5
По умолчанию

Спасибо конечно за поиск. Но я смотрел эти примеры, но они у меня не работают. Можете написать мне пример (Искомый текст вводится в Edit или можно задействовать компонент FindDialog, но лучше я думаю через FindDialog) и дать исходник. Заранее спасибо.

Последний раз редактировалось shaman, 19.04.2008 в 18:32.
Ответить с цитированием
  #4  
Старый 19.04.2008, 20:45
Аватар для moo2k
moo2k moo2k вне форума
Активный
 
Регистрация: 05.12.2006
Адрес: где-то там...
Сообщения: 321
Репутация: 35
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
function FindInMemo(Memo: TMemo; const FindText: string;
  FindDown, MatchCase: Boolean): Boolean;
 
{Если строка найдена, то результат True, иначе - False;
 
 FindText : искомая строка;
 FindDown : True - поиск вниз от курсора ввода;
             False - поиск вверх от курсора ввода;
 MatchCase : True - с учетом регистра букв,
             False - не учитывая регистр бук.
 
 Если у Memo стоит автоперенос слов, то могут
 возникнуть проблемы - текст будет найден,
 но выделен не там где надо. Так что, для нормального поиска
 свойство ScrollBars у Memo ставить в ssBoth (ну или ssHorizontal)}
 
  function PosR2L(const FindStr, SrcStr: string): Integer;
    {Поиск последнего вхождения подстроки FindStr в строку SrcStr}
  var
    ps, L: Integer;
 
    function InvertSt(const S: string): string;
      {Инверсия строки S}
    var
      i: Integer;
    begin
      L := Length(S);
      SetLength(Result, L);
      for i := 1 to L do
        Result[i] := S[L - i + 1];
    end;
 
  begin
    ps := Pos(InvertSt(FindStr), InvertSt(SrcStr));
    if ps <> 0 then
      Result := Length(SrcStr) - Length(FindStr) - ps + 2
    else
      Result := 0;
  end;
 
  function MCase(const s: string): string;
    {Перевод заглавных букв в строчные;
     Функция вызывается если регистр не учитывается}
  var
    i: Integer;
  begin
    Result := s;
    for i := 1 to Length(s) do
    begin
      case s[i] of
        'A'..'Z',
          'А'..'Я': Result[i] := Chr(Ord(s[i]) + 32);
        'Ё': Result[i] := 'ё';
        'Ѓ': Result[i] := 'ѓ';
        'Ґ': Result[i] := 'ґ';
        'Є': Result[i] := 'є';
        'Ї': Result[i] := 'ї';
        'І': Result[i] := 'і';
        'Ѕ': Result[i] := 'ѕ';
      end;
    end;
  end;
 
var
  Y, X, SkipChars: Integer;
  FindS, SrcS: string;
  P: TPoint;
begin
  Result := False;
 
  if MatchCase then
    FindS := FindText
  else
    FindS := MCase(FindText);
 
  P := Memo.CaretPos;
 
  if FindDown then
    {Поиск вправо и вниз от курсора ввода}
    for Y := P.y to Memo.Lines.Count do
    begin
 
      if Y <> P.y then
        {Если это не строка, в которой курсор вода,
         то ищем во всей строке}
        SrcS := Memo.Lines[Y]
      else
        {иначе обрезаем строку от курсора до конца}
        SrcS := Copy(Memo.Lines[Y], P.x + 1,
          Length(Memo.Lines[Y]) - P.x + 1);
 
      if not MatchCase then
        SrcS := MCase(SrcS);
      X := Pos(FindS, SrcS);
      if X <> 0 then
      begin
        if Y = P.y then
          Inc(X, P.x);
        P := Point(X, Y);
        Result := True;
        Break; {Выход из цикла}
      end
    end
  else
    {Поиск влево и вверх от курсора ввода}
    for Y := P.y downto 0 do
    begin
 
      if Y <> P.y then
        {Если это не строка, в которой курсор вода,
         то ищем во всей строке}
        SrcS := Memo.Lines[Y]
      else
        {иначе обрезаем строку от начала до курсора
         минус выделенный текст}
        SrcS := Copy(Memo.Lines[Y], 1, P.x - Memo.SelLength);
 
      if not MatchCase then
        SrcS := MCase(SrcS);
      X := PosR2L(FindS, SrcS);
      if X <> 0 then
      begin
        P := Point(X, Y);
        Result := True;
        Break; {Выход из цикла}
      end
    end;
 
  if Result then
  begin
    {Если текст найден - выделяем его}
    SkipChars := 0;
    for y := 0 to P.Y - 1 do
      Inc(SkipChars, Length(Memo.Lines[y]));
    Memo.SelStart := SkipChars + (P.Y * 2) + P.X - 1;
    Memo.SelLength := Length(FindText);
  end;
end;
 
Пример использования:
procedure TForm1.FindDialog1Find(Sender: TObject);
begin
  if not FindInMemo(Memo1,
    FindDialog1.FindText,
    frDown in FindDialog1.Options,
    frMatchCase in FindDialog1.Options) then
    Application.MessageBox('Поиск результатов не дал.',
      PChar(Application.Title),
      MB_OK or MB_ICONINFORMATION);
end;
__________________
Программирование - это искусство и наш смысл жизни.
Ответить с цитированием
  #5  
Старый 19.04.2008, 21:06
shaman shaman вне форума
Новичок
 
Регистрация: 19.07.2007
Сообщения: 65
Репутация: 5
По умолчанию

Можете выложить этот материал в виде готового работающего исходника?
Ответить с цитированием
  #6  
Старый 21.04.2008, 07:21
PashaXP PashaXP вне форума
Новичок
 
Регистрация: 05.02.2008
Сообщения: 81
Репутация: 15
По умолчанию

Подскажите, плиз, если в свойстве Memo ScrollBars выбрано ssNone, это значит автоперенос слов работает?
Ответить с цитированием
  #7  
Старый 21.04.2008, 11:08
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

За перенос слов отвечает свойство WordWrap.
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #8  
Старый 19.05.2009, 21:14
Stranger333 Stranger333 вне форума
Прохожий
 
Регистрация: 19.05.2009
Сообщения: 4
Репутация: 10
По умолчанию

Как мне сделать что бы компонент FindDialog, создовал поиск текста в Memo. Мне надо ето сделать при нажатии кнопки. Помогите плиз!!!
Ответить с цитированием
  #9  
Старый 19.05.2009, 23:49
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Собственно там особо и делать нечего если нужно искать только первое вхождение:
Код:
1
2
3
4
5
6
procedure TForm24.FindDialog1Find(Sender: TObject);
begin
 Memo1.SelStart := Pos(FindDialog1.FindText,Memo1.Text)-1;
 Memo1.SelLength := Length(FindDialog1.FindText);
 Memo1.SetFocus;
end;
А вот если надо реализовывать продолжение поиска, тогда уже чуток посложнее.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 20.05.2009, 00:32
Stranger333 Stranger333 вне форума
Прохожий
 
Регистрация: 19.05.2009
Сообщения: 4
Репутация: 10
По умолчанию

СПС! тут ище такое надо както сделать что бы принимался к вниманию параметры окна поиска - с учетом регистра, слово целиком, поис: верх, вниз. (у меня сегодня башка не работаетhttp://www.delphisources.ru/forum/im...lies/smile.gif)
Ответить с цитированием
  #11  
Старый 20.05.2009, 00:33
Stranger333 Stranger333 вне форума
Прохожий
 
Регистрация: 19.05.2009
Сообщения: 4
Репутация: 10
По умолчанию

[quote=Stranger333]СПС! тут ище такое надо както сделать что бы принимался к вниманию параметры окна поиска - с учетом регистра, слово целиком, поис: верх, вниз. (у меня сегодня башка не работает)
Ответить с цитированием
  #12  
Старый 09.06.2009, 21:39
Stranger333 Stranger333 вне форума
Прохожий
 
Регистрация: 19.05.2009
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Собственно там особо и делать нечего если нужно искать только первое вхождение:
Код:
1
2
3
4
5
6
procedure TForm24.FindDialog1Find(Sender: TObject);
begin
 Memo1.SelStart := Pos(FindDialog1.FindText,Memo1.Text)-1;
 Memo1.SelLength := Length(FindDialog1.FindText);
 Memo1.SetFocus;
end;
А вот если надо реализовывать продолжение поиска, тогда уже чуток посложнее.
помоги мне нцжно ищё продолжения поиска, я пробувал чё то у меня не выходит!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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