![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в ;ListBox [D5]
DeMoN-777 © (2002-04-09 19:04:00)Уважаемые мастера прошу вас ответить на следующий вопрос
У меня в программе есть листбокс в котором мне необходимо
осуществить поиск по задонному слову и чтоб ещё и выделялся найденый текст.
Но вот только как енто реализовать я что-тоникак не пойму.
Помогите пожалуйста.
DeMoN-777 (2002-04-10 20:24:00) [1]>Леха (10.04.02 17:54)
Спасибо тебе ОГРОМНОЕ!!!
Я уже начал думать что не дано...........
Но ведь есть ещё люди добрые =)
unit QStrings RuleZzz тама много инересного.........
Да кстати, вопрос закрыт на все 100%
DeMoN-777 (2002-04-10 19:33:00) [2]Ща посмотрю....
Леха (2002-04-10 17:54:00) [3]Я же тебе отправил решение
DeMoN-777 (2002-04-10 17:46:00) [4]Нет мне надо искать именно в самом ListBox
Вот этот метод мне не подходит.
procedure TForm1.ToolButton6Click(Sender: TObject);
begin
if edit1.text <> "" then
listbox1.ItemIndex:=( listbox1.Items.IndexOf(edit1.text))
else
showmessage("Вы должны ввести текст для поиска");
end;
Так как он ищет только строгие соответствия, а мне надо чтобы поис производился как например в хелпах, то есть по строгим соответствиям а по похожим.
Надеюсь я ясно изложил вопрос.
Как же быть-то ?
Song (2002-04-10 16:07:00) [5]Ищите на предмет вхождения слова, пока не найдёте рисуйте с белым цветом фона, как только нашли изменяте на синий цвет фона и рисуйте найденное слово. Далее удаляем наденное слово из строки и снова с начала.
DeMoN-777 (2002-04-10 15:50:00) [6]>Song © (10.04.02 13:37)
Вообще-то ты прав мне надо примерно такой-же поиск как и в хелпе.
Не подскажешь поподробнее как его реализовать?
И если можешь, то с примером.
Буду очень благодарен.
Леха (2002-04-10 14:52:00) [7]procedure GirnyyPos(Text,Str:string;Canvas:TCanvas;Left,Top:integer);
var s,s1,s2,s3:string;
Tek:integer;
begin
Tek:=Left;
s:=Text;
s1:=copy(s,1,pos(Str,s)-1);
delete(s,1,pos(Str,s));
s2:=Str;
delete(s,1,length(Str));
s3:=s;
Canvas.TextOut(Tek,Top,s1);
Tek:=Tek+Canvas.TextWidth(s1);
Canvas.Font.Style:=Canvas.Font.Style+[fsBold];
Canvas.TextOut(Tek,Top,s2);
Tek:=Tek+Canvas.TextWidth(s2);
Canvas.Font.Style:=Canvas.Font.Style-[fsBold];
Canvas.TextOut(Tek,Top,s3);
end;
Написанно за 5 минут довольно коряво и не учитывается то что подстроки может и не быть в строке но мысль думаю понятна
MBo (2002-04-10 14:39:00) [8]>DeMoN-777
возможно, тебе подойдет RichEdit, т.к. в вопросе нет намеков на действия, характерные для ListBox
тогда задача решается так - строки в Richedit1.Lines
SS:искомая строка
with Richedit1 do begin
i:=Pos(ss, Lines.Text);
if i>0 then begin
SelStart:=i-1;
SelLength:=Length(ss);
SelAttributes.Color:=clRed;
end;
end;
Если слово встречается более 1 раза, придумай сам, как быть.
DeMoN-777 (2002-04-10 14:11:00) [9]>Song ©
Надо писать свой обработчик onDrawItem
Помоги плиз его написать
Хотя-бы примерно.........
Song (2002-04-10 13:37:00) [10]А знаете как делает Дельфи такую же штуку в хэлпе? Он просто "выделяет" нужные части строки закрашиванием нужных участков цветом фона (синего), потом рисует вокруг них пунктирную рамку и всё!. Т.е. это делается именно так как я Вам предлагал.
Если же Вы хотите именно выделить, то EM_SETSEL, но по-моему там можно выделить только один сплошнойотрывок.
Леха (2002-04-10 13:36:00) [11]Если ты хочешь просто отрисовать подстроку поиска жирным шрифтом то это графика и не более даже не очень хитрая
Если хочешь иметь возможность сразу отредактировать то проше поверх соответсвующей стороки выставить TEdit без рамки с выделением установленным по подстроке
Song (2002-04-10 13:25:00) [12]Конечно понял:
Вот у тебя есть 3 строки:
Маша
Наташа
Ирина
Ты ищешь по "Наташа" после поиска оно должно быть у тебя выделено. Если ты хочешь выделять жирным шрифтом то делай как я сказал. Если ты хочешь выделить "закрашенным фокусом ввода" не знаю как тебе это ещё объяснить, то тебе нужно юзать АПИ. Потому что не для первого ни для второго в классе TListBox нет встроенных средств.
DeMoN-777 (2002-04-10 13:24:00) [13]Song © (10.04.02 13:10)
_________________________
Читай вопрос...
_________________________
Ну, например я ищу слово "Delphi".
Есть фраза "Delphi это среда разработки"
Поиск должен выделить так " Delphiэто среда разработки"
только не жирным а цветом.
А если я ищу слово "Раз" он должен выделить"
"Delphi это среда разработки"
Во как.
DeMoN-777 (2002-04-10 13:21:00) [14]>Song ©
А ты вопрорс-то правильно понял ?
Прочитай ещё разок тогда я думаю поймёшь
Song (2002-04-10 13:10:00) [15]2Леха (10.04.02 13:07)
А это уже уточнил MBo © (09.04.02 19:25)
Если бы так проблема стояла, то, действительно, нужен будет перебор по Pos.
Леха (2002-04-10 13:07:00) [16]Song
а какой вариант вы можете предложить если требуется поиск по _подстроке_ IndexOf тут не поможет он ищет только строгие соответствия
Song (2002-04-10 12:52:00) [17]Дак так тогда и спрашивай.
Надо писать свой обработчик onDrawItem. Причём тут много гемороя, нужно часть текста выводить обычным шрифтом, часть выделенным, вообщем дерзай.
DeMoN-777 (2002-04-10 12:45:00) [18]>Song © (10.04.02 11:49
>Я же ему уже советовал IndexOf и LB_FINDSTRING, ему не понравилось...
Да всё мне понравилось, только я не понимаю как найденный текст выделить ..............
Song (2002-04-10 11:49:00) [19]2Леха (10.04.02 11:45)
Ваш вариант самый плохой.
Я же ему уже советовал IndexOf и LB_FINDSTRING, ему не понравилось...
Леха (2002-04-10 11:45:00) [20]Выделение с помощью OnDrawItem только устанлви стиль в lbOwnerDrawFixed
Поиск пооходишь по списку с помощью Pos
Если хочешь могу выслать работающий пример такого поиска пиши