Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автосортировка с выделением в ListBox 
V
    Опции темы
Keeper89
Дата 18.10.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Доброго времени суток!

Делаю ListBox с автосортировкой:
user posted image
Код

procedure TForm2.Edit1Change(Sender: TObject);
var
  i: Integer;
begin
  ListBox1.Items.Clear;

  if Edit1.Text = EmptyStr then
    ListBox1.Items.Assign(sl)
  else

    for i := 0 to sl.Count - 1 do
    begin
      if AnsiPos(Edit1.Text, sl[i]) = 1 then
        ListBox1.Items.Add(sl[i]);
    end;

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  sl := TStringList.Create();
  sl.Add('123wer456gn;');
  sl.Add('345wer45ttn;');
  sl.Add('123wfg45tygn;');
  sl.Add('12dfer45jhn;');
  Edit1.OnChange(Self);
end;



Вопрос такой: как выделить в Листбоксе жирным искомую часть
+ Может есть замечания по коду сортировки?  smile 

P.S. Такое, например, можно увидеть при наборе адреса в адресной строке Firefox.

Это сообщение отредактировал(а) Keeper89 - 18.10.2009, 15:29


--------------------
PM MAIL WWW   Вверх
Qu1nt
Дата 19.10.2009, 00:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



Наверное, сделал бы как-нибудь так:
Код

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Line, Bold: AnsiString;
  Count, Offset: Integer;
begin
  ListBox1.Style := lbOwnerDrawFixed; // !
  with ListBox1.Canvas do
  begin
    FillRect(Rect);
    Brush.Style := bsClear;
    Count := Length(Edit1.Text);
    Line := ListBox1.Items[Index];
    Offset := Rect.Left + 2;
    if Count > 0 then
    begin
      Bold := Copy(Line, 1, Count);
      Font.Style := [fsBold];
      TextOut(Offset, Rect.Top, Bold);
      Inc(Offset, TextWidth(Bold));
      Line := Copy(Line, Count + 1, Length(Line) - Count);
      Font.Style := [];
    end;
    TextOut(Offset, Rect.Top, Line);
  end;
end;

PM MAIL   Вверх
Alexeis
Дата 19.10.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Пользуйтесь поиском http://forum.vingrad.ru/forum/topic-246193.html

Добавлено через 36 секунд
Внизу темы еще одна ссылка http://forum.vingrad.ru/topic-58882.html


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Keeper89
Дата 21.10.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Alexeis, в приведенный темах идет речь о выделении всего элемента, а я говорю только о части.

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


--------------------
PM MAIL WWW   Вверх
Qu1nt
Дата 22.10.2009, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



Вроде придумал, вот:
Код

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
const
  FLAG = #1;
var
  Line, Bold: AnsiString;
  i: Integer;
begin
  with (Control as TListBox), Canvas do // Style = lbOwnerDrawFixed
  begin
    Line := Items[Index];
    Bold := Edit1.Text;
    Bold := StringReplace(Line, Bold, StringOfChar(FLAG, Length(Bold)),
      [rfReplaceAll, rfIgnoreCase]);
    FillRect(Rect);
    Brush.Style := bsClear;
    Inc(Rect.Left, 2);
    for i := 1 to Length(Line) do
    begin
      if Bold[i] = FLAG then
        Font.Style := [fsBold, fsUnderline];
      TextOut(Rect.Left, Rect.Top, Line[i]);
      Inc(Rect.Left, TextWidth(Line[i]));
      Font.Style := [];
    end;
  end;
end;

В примере выделяются все вхождения подстроки. 

Это сообщение отредактировал(а) Qu1nt - 22.10.2009, 02:15
PM MAIL   Вверх
Keeper89
Дата 22.10.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Qu1nt, спасибо! Закрываю тему.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.