Форум: "Основная";
Текущий архив: 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%
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c