Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Табуляция в графическом ListBox



Автор: Virtualik

Использование табуляции в ListBox'е когда компонент находится в стандартном режиме не составляет труда. Но что делать если надо использовать графическое отображение элементов списка? Ведь при этом надо самому писать обработчик отрисовки элементов с разбиением на колонки. Элементарное решение - использование API функции TabbedTextOut, однако результаты работы этой функции меня явно не удовлетворили. Пришлось-таки "выкручиваться"... Символ-разделитель можно использовать любой. Например, будем использовать символ "|", тогда обработчик OnDrawItem может выглядеть следующим образом:


procedure TBrowser.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  S, Ss: string;
  P: Integer; // Флаг символа-разделителя
begin
  ListBox1.Canvas.FillRect(Rect);
  //Отрисовка графики
  ...
    //
  S := ListBox1.Items.Strings[Index];
  P := Pos('|', S);
  if P = 0 then
    Ss := S
  else
    // Если нет табуляции, то пишем всю строку,
    // иначе отрезаем кусок до разделителя
    Ss := Copy(S, 1, P - 1);
  ListBox1.Canvas.TextOut(Rect.Left + 20, Rect.Top + 2, Ss);
  if P > 0 then
    ListBox1.Canvas.TextOut(ListBox1.TabWidth, Rect.Top + 2, Copy(S, P + 1,
      Length(S) - P + 2));
end;

Не забудьте перед запуском поставить нужное значение TabWidth.





Похожие по теме исходники

CheckListBox Draw

Search text in ListBox

ListBox Hints

ListBox Elements Sort

 

Transparent ListBox

ListBox ComboBox

File icons in TFileListBox

ListBox Drag & Drop