![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() 1)
Написал типа справочника, короче на форме ListView,Memo1,ComboBox,Edit(10шт.) ,Buton,Edit_Pole в крации о работе программы, Memo - загружен текст, ListView - отображает 1ю строку из мемо (ФИО), ComboBox - выбор-список что нужно найти (ФИО,номер тел и т.д) EditPoisk - текст который нужно найти вот как я делаю поиск Код:
function FindInMemo(Memo: TMemo; const FindText: string; FindDown, MatchCase: Boolean): Boolean; 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; но вот в чем проблема, все ищет нормально, но как только доходит до конца списка в мемо тут же поиск и останавливается, как сделать так, как только цикл поиска остановился при следующему нажатию он искал или вверх или заново? помогите пожалуйста. 2) и еще один вопросик как сделать быстрый поиск в ListView через Edit по буквам, то есть если 1я буква а то оно должно и найти 1ю буква а, а не в строки как я сделал вот код Код:
var rct:TRECT; b: integer; const LVM_GETITEMRECT=4110; LVIR_BOUNDS=0; begin for b:=0 to ListView_Basa.Items.Count-1 do begin If pos(Edit.text, ListView_Basa.Items[b].Caption)>0 then begin ListView_Basa.Selected:=ListView_Basa.Items[b]; rct.Left:=0; SendMessage(ListView_Basa.Handle,LVM_GETITEMRECT,0,integer(@rct)); ListView_Basa.Scroll(0,(b-ListView_Basa.TopItem.Index)*(rct.Bottom-rct.Top)); ListView_BasaClick(Self); end else ListView_Basa.Items[b].Selected := False; end; вот пример,исходник 1 вопросу |