Консультация № 110421
21.11.2007, 17:11
0.00 руб.
0 3 3
Извините если было, пишу в первый раз
Вопрос такой в ListBox есть набор полей некоторые нужно другим шрифтом вывести( в идеале еще и с картинкой вначале) в MSDN нашел только как изменить цвет под текстом.
Прочитав про RichEdit понял что вроде как подходит и он вместо ListBox только как узнать на какую строчку пользователь кликнул (аналог ListBox->ItemIndex)
Заранее благодарен

Обсуждение

Неизвестный
21.11.2007, 17:36
общий
это ответ
Здравствуйте, Simakov Leonid V!
в этом случае больше подойдет TListView
Неизвестный
21.11.2007, 17:48
общий
это ответ
Здравствуйте, Simakov Leonid V!

У RichEdit есть свойство CaretPos : TPoint - текущая позиция каретки - не поможет?

У ListBox можно написать свой DrawItem и рисовать что угодно - и картинки и шрифты менять и размер итемов. В какой-то из версий Дельфи вроде был пример про вывод списка шрифтов каждый своим шрифтом (даже если там ComboBox, техника все равно подойдет).

А вообще выше вам дали тоже правильный совет - TListView с установленным стилем vsReport - вполне заменяет ListBox.
Неизвестный
22.11.2007, 00:35
общий
это ответ
Здравствуйте, Simakov Leonid V!

Поскольку нет оценок предыдущим ответам, то предлагаю свой вариант на основе стандартного TListBox:
Устанавиливаем свойство ListBox1.Style:=lbOwnerDrawFixed
В обработчике ListBox1.OnDrawItem рисуем чего хотим :)
(Control as TListBox).Canvas - соотв. канва ListBox‘а
Index - соотв. индекс рисуемого элемента
Rect - координаты элемента относительно
State - состояние элемента (см. TOwnerDrawState)

Получится что-то на подобии приложения (надо подгонять под свои размеры и цвета)...

Приложение:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);begin if (Index<0) or (Index>ListBox1.Items.Count) then begin ListBox1.Canvas.Brush.Color:=clMoneyGreen; ListBox1.Canvas.FillRect(Rect); exit; end; if odFocused in State then begin ListBox1.Canvas.Brush.Color:=clMoneyGreen; ListBox1.Canvas.Font.Color:=clBlack; ListBox1.Canvas.FillRect(Classes.Rect(Rect.Left, Rect.Top, Rect.Left+20, Rect.Bottom)); inc(Rect.Left, 20); ListBox1.Canvas.Brush.Color:=clNavy; ListBox1.Canvas.Font.Color:=clWhite; ListBox1.Canvas.FillRect(Rect); end else begin ListBox1.Canvas.Brush.Color:=clMoneyGreen; ListBox1.Canvas.Font.Color:=clBlack; ListBox1.Canvas.FillRect(Rect); inc(Rect.Left, 20); end; ImageList1.Draw(ListBox1.Canvas, Rect.Left-19, Rect.Top+2, Index); ListBox1.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,ListBox1.Items[Index]);end;
Форма ответа