Wyświetlanie wierszy w odstępach w komponencie ListBox

0

Problem być może trywialny, ale w linuksowej wersji Lazarusa ciągi tekstowe w ListBoxie wyświetlaja się w co drugim wierszu. Dla przykładu:

  mtext:='Number: ';
  for i:=1 to 10 do
  begin
    ListBox1.Items.Add(mtext+IntToStr(i));
  end;

wyświetli się w 20 wierszach, zamiast spodziewanych dziesięciu. Wartość, puste pole wiersza, wartość, puste pole wiersza itd. Szukam jakiejś właściwości tego komponentu, która odpowiada za wyświetlanie kolejnych wierszy, ale nie znajduje (być może źle szukam). Naturalnie w windowsowej wersji, taka niedogodność nie występuje. Spotkał się może ktoś z czymś takim pod pingwinem?

0

Pokaż zrzut ekranu, bo trudno uwierzyć, że kontrolka przy domyślnych ustawieniach może (aż tak) świrować.

0

mmlist.png

0

Masz gdzieś w systemie jakieś okno, w którym jest ListBox, żeby mieć porównanie?

Fakt, trochę duże te odstępy.

0

Niestety Lazarus to jedyne środowisko okienkowe jakie posiadam na linuksie. Co ciekawe przetestowałem jeszcze komponent Memo, ale tam działa wszystko ok pod kątem kolejnych lini tekstu. Myślałem jeszcze, że to może kwestia wyświetlania w pętli, ale też nie. Każde kolejne

ListBox1.Items.Add(...)

wywoływywane pojedyńczo, ponownie powodują wyświetlanie co drugi wiersz.

3

To nie jest wyświetlanie co drugi wiersz, tylko akurat w domyślnej konfiguracji wyglądu Linux Mint są takie duże odstępy pomiędzy pozycjami. Jeżeli chcesz mniejsze, to musisz ustawić na samodzielne rysowanie pozycji i wtedy dostosować wysokość: ListBox1.ItemHeight := 20;

0

Dzięki, tylko co to za właściwość - "samodzielne rysowanie pozycji"? Jak to się ustawia? To w ramach komponentu ListBox, czy w ustawieniach systemu, czy w samym środowisku Lazarusa?

2
uses
  LCLType;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  //listbox1
  for i := 0 to 9 do
    ListBox1.Items.Add('ListBox1 - item ' + IntToStr(i));
  //listbox2 - inna wysokość pozycji
  ListBox2.Style := lbOwnerDrawFixed;  // <- samodzielne rysowanie
  ListBox2.ItemHeight := 36;  // <- wysokość pozycji
  ListBox2.OnDrawItem := @ListBoxDrawItem;
  for i := 0 to 9 do
    ListBox2.Items.Add('ListBox2 - item ' + IntToStr(i));
end;

procedure TForm1.ListBoxDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
begin
  if odSelected in State then
    TListBox(Control).Canvas.Brush.Color := clHighlight;
  TListBox(Control).Canvas.FillRect(ARect);
  TListBox(Control).Canvas.TextRect(ARect, 2, ARect.Top + 2, TListBox(Control).Items[Index]);
end;

screenshot-20230305161749.png

2

Tak na szybko sprawdziłem - ponieważ siedzę na linuksie, to mogę zweryfikować.
Linie nie dodają się podwójnie, tylko - jak napisał @Paweł Dmitruk, ten Twój linuks (ja siedzę na Mint) ma po prostu tak ustawioną wysokość wiersza dla tego komponentu.
Poniżej pokazane, jak to wygląda u mnie. Jak się zaznaczy jakiś element i przesuwa w górę/dół strzałkami to focus przenosi się o jeden, nie ma żadnych pustych linii pomiędzy.

screenshot-20230305163050.png
screenshot-20230305163056.png

0

Ciekawe czy te ustawienia ListBoxa dotyczą tylko Mint-ów i innych dystrybucji ubuntupodobnych, czy też może wszystkie linuksy tak "postrzegają" wyświetlanie w ListBoxie. Ewentualnie czy to zależy od srodowiska graficznego (Gnome,KDE etc).

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