Dopisywanie do końca lini w listbox znaku z wyrównaniem

0

Mam pytanie jak dodać na koniec każdej linii w komponencie Listbox znacznik | tak aby był ustalany według najdłuższej linii. A reszta znacznika | dopisywana jest według najdłuższego łańcucha. Mam ustaloną najdłuższy łańcuch za pomocą length.

Za pomocą procedury :

for i := 0 to ListBox1.Items.Count -1 do
ListBox1.Items[i] := ListBox1.Items[i] + ' |';

Uzyskam takie coś

mama i tata |
tata |
Basia |
Ola |

A efekt ma być taki jak tego dokonać ?

mama i tata |
tata        |
Basia       |
Ola         |

dodanie znacznika <code> - fp

0

Znaleźć maksymalna długość - MAX, po czym:

ListBox1.Items[i]:=ListBox1.Items[i]+StringOfChar(' ',MAX+1-Length(ListBox1.Items[i]))+'|';
0

Znajdź długość najdłuższego tekstu w listboxie.
Ustaw czcionkę o stałej szerokości znaków.

Dla każdego elementu w listboxie
Dodaj spacje tak aby długość elementu odpowiadała długości najdłuższego elementu +1. (w ten sposób dodasz też spacje do najdłuższego elementu)
Dodaj znak |

done!

2

Albo ListBox -- > Style na lbOwnerDrawFixed i:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);

function GetMaxLineWidth(const AListBox: TListBox): Integer;
var
  i, wx: Integer;
begin
  result:= 0;
  for i:= 0 to AListBox.Items.Count - 1 do
  begin
    wx:= AListBox.Canvas.TextWidth(AListBox.Items[i]);
    if wx > result then
      result:= wx;
  end;
end;

const
  LEFT_MARGIN_WIDTH = 3;
begin
  with TListBox(Control) do
  begin
    if odSelected in State then
      Canvas.Brush.Color:= clHighlight
    else
      Canvas.Brush.Color:= clWindow;
    Canvas.FillRect(Rect);
    Rect.Left:= Rect.Left + LEFT_MARGIN_WIDTH;
    DrawText(Canvas.Handle, PAnsiChar(Items[Index]), -1, Rect,
      DT_LEFT or DT_VCENTER);
    Rect.Left:= Rect.Left + GetMaxLineWidth(TListBox(Control)) + Canvas.TextWidth(' ');
    DrawText(Canvas.Handle, '|', -1, Rect,
      DT_LEFT or DT_VCENTER);
  end;
end;
0

@kAzek - obliczanie długości najdłuższej linii wykonywane jest w każdym wywołaniu zdarzenia OnDrawItem, co jest niepotrzebne; Lepiej będzie tę długość wyliczyć raz i ją wpisać do zmiennej czy pola klasy, a przy malowaniu itemów ją wykorzystać;

@Bruno(M) - równie dobrze zamiast rysować znak | możesz narysować linie za pomocą metod MoveTo i LineTo - dzięki temu będziesz mógł określić dodatkowo jej atrybuty, jak np. wysokość.

0

A po co Co w ogóle taka linia? Co chcesz uzyskać? Bo może listbox to nie to, czego potrzebujesz?

0

Dziękuję ślicznie Panowie. Kod _13th_Dragon wystarczył. Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1