Советы по Delphi


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


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

    procedure TBrowser.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var
S, Ss: String; P: Integer; // Флаг символа-разделителя begin
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; end;

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

Virtualik [001445]



Содержание раздела