Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Вниз

Поиск в ListBox 


DeMoN-777   (2002-04-09 19:04) [0]

Уважаемые мастера прошу вас ответить на следующий вопрос
У меня в программе есть листбокс в котором мне необходимо
осуществить поиск по задонному слову и чтоб ещё и выделялся найденый текст.
Но вот только как енто реализовать я что-тоникак не пойму.

Помогите пожалуйста.



MBo   (2002-04-09 19:25) [1]

по целому слову или,скажем, поиск "123" должен выделять
"1234565" или "64351234"?



DeMoN-777   (2002-04-10 11:14) [2]

Поиск должен выделить "123"
Ну, например я ищу слово "Delphi".
Есть фраза "Delphi это среда разработки"
Поиск должен выделить так " Delphi это среда разработки"
только не жирным а цветом.
А если я ищу слово "Раз" он должен выделить"
"Delphi это среда разработки"
Во как.



Леха   (2002-04-10 11:45) [3]

Выделение с помощью OnDrawItem только устанлви стиль в lbOwnerDrawFixed

Поиск пооходишь по списку с помощью Pos

Если хочешь могу выслать работающий пример такого поиска пиши



Song   (2002-04-10 11:49) [4]

2Леха (10.04.02 11:45)
Ваш вариант самый плохой.
Я же ему уже советовал IndexOf и LB_FINDSTRING, ему не понравилось...



DeMoN-777   (2002-04-10 12:45) [5]

>Song © (10.04.02 11:49
>Я же ему уже советовал IndexOf и LB_FINDSTRING, ему не понравилось...

Да всё мне понравилось, только я не понимаю как найденный текст выделить ..............



Song   (2002-04-10 12:52) [6]

Дак так тогда и спрашивай.

Надо писать свой обработчик onDrawItem. Причём тут много гемороя, нужно часть текста выводить обычным шрифтом, часть выделенным, вообщем дерзай.



Леха   (2002-04-10 13:07) [7]

Song
а какой вариант вы можете предложить если требуется поиск по _подстроке_ IndexOf тут не поможет он ищет только строгие соответствия



Song   (2002-04-10 13:10) [8]

2Леха (10.04.02 13:07)
А это уже уточнил MBo © (09.04.02 19:25)
Если бы так проблема стояла, то, действительно, нужен будет перебор по Pos.



DeMoN-777   (2002-04-10 13:21) [9]

>Song ©
А ты вопрорс-то правильно понял ?
Прочитай ещё разок тогда я думаю поймёшь



DeMoN-777   (2002-04-10 13:24) [10]

Song © (10.04.02 13:10)
_________________________
Читай вопрос...
_________________________


Ну, например я ищу слово "Delphi".
Есть фраза "Delphi это среда разработки"
Поиск должен выделить так " Delphi это среда разработки"
только не жирным а цветом.
А если я ищу слово "Раз" он должен выделить"
"Delphi это среда разработки"
Во как.



Song   (2002-04-10 13:25) [11]

Конечно понял:
Вот у тебя есть 3 строки:
Маша
Наташа
Ирина

Ты ищешь по "Наташа" после поиска оно должно быть у тебя выделено. Если ты хочешь выделять жирным шрифтом то делай как я сказал. Если ты хочешь выделить "закрашенным фокусом ввода" не знаю как тебе это ещё объяснить, то тебе нужно юзать АПИ. Потому что не для первого ни для второго в классе TListBox нет встроенных средств.



Леха   (2002-04-10 13:36) [12]

Если ты хочешь просто отрисовать подстроку поиска жирным шрифтом то это графика и не более даже не очень хитрая
Если хочешь иметь возможность сразу отредактировать то проше поверх соответсвующей стороки выставить TEdit без рамки с выделением установленным по подстроке



Song   (2002-04-10 13:37) [13]

А знаете как делает Дельфи такую же штуку в хэлпе? Он просто "выделяет" нужные части строки закрашиванием нужных участков цветом фона (синего), потом рисует вокруг них пунктирную рамку и всё!. Т.е. это делается именно так как я Вам предлагал.
Если же Вы хотите именно выделить, то EM_SETSEL, но по-моему там можно выделить только один сплошной отрывок.



DeMoN-777   (2002-04-10 14:11) [14]

>Song ©
Надо писать свой обработчик onDrawItem

Помоги плиз его написать
Хотя-бы примерно.........



MBo   (2002-04-10 14:39) [15]

>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 раза, придумай сам, как быть.



Леха   (2002-04-10 14:52) [16]

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 минут довольно коряво и не учитывается то что подстроки может и не быть в строке но мысль думаю понятна



DeMoN-777   (2002-04-10 15:50) [17]

>Song © (10.04.02 13:37)

Вообще-то ты прав мне надо примерно такой-же поиск как и в хелпе.
Не подскажешь поподробнее как его реализовать?
И если можешь, то с примером.
Буду очень благодарен.



Song   (2002-04-10 16:07) [18]

Ищите на предмет вхождения слова, пока не найдёте рисуйте с белым цветом фона, как только нашли изменяте на синий цвет фона и рисуйте найденное слово. Далее удаляем наденное слово из строки и снова с начала.



DeMoN-777   (2002-04-10 17:46) [19]

Нет мне надо искать именно в самом ListBox
Вот этот метод мне не подходит.

procedure TForm1.ToolButton6Click(Sender: TObject);
begin
if edit1.text <> "" then
listbox1.ItemIndex:=( listbox1.Items.IndexOf(edit1.text))
else
showmessage("Вы должны ввести текст для поиска");
end;


Так как он ищет только строгие соответствия, а мне надо чтобы поис производился как например в хелпах, то есть по строгим соответствиям а по похожим.
Надеюсь я ясно изложил вопрос.
Как же быть-то ?



Леха   (2002-04-10 17:54) [20]

Я же тебе отправил решение



DeMoN-777   (2002-04-10 19:33) [21]

Ща посмотрю....



DeMoN-777   (2002-04-10 20:24) [22]

>Леха (10.04.02 17:54)
Спасибо тебе ОГРОМНОЕ!!!
Я уже начал думать что не дано...........
Но ведь есть ещё люди добрые =)

unit QStrings RuleZzz тама много инересного.........


Да кстати, вопрос закрыт на все 100%




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.023 c
1-69812           Dimaiv                2002-04-09 18:43  2002.04.22  
Что такое файлы с призвольным доступом и как с ними работать?


1-69781           Darlok                2002-04-09 17:47  2002.04.22  
Dll


1-69915           inko                  2002-04-09 17:55  2002.04.22  
Backup файла.


3-69733           ruslan_as             2002-04-01 11:28  2002.04.22  
InterBase (Lookup)


3-69691           GenBr                 2002-03-28 14:07  2002.04.22  
midas