Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.22;
Скачать: CL | DM;

Вниз

Поиск в 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%



Страницы: 1 вся ветка

Текущий архив: 2002.04.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.025 c
6-69950
zam
2002-02-11 04:24
2002.04.22
Конвертировать ISAPI в webappdebugger executable


7-70038
SVF
2002-01-26 01:52
2002.04.22
Файл ресурса иконок больше 16 цветов


14-69977
Алексей Петров
2002-03-12 14:28
2002.04.22
Можно ли быть профессионалом - программистом, не имея высшего образования?


3-69672
roman_tutov
2002-04-03 12:54
2002.04.22
компонент Table & memo поле


3-69694
amamed_3071
2002-03-30 09:17
2002.04.22
Как увеличит TimeOut в AdoQuery