Jak wstawić w TListView ikony do innej niż pierwsza kolumny?

Odpowiedz Nowy wątek
2011-07-22 17:56
Asarnil
0

Witam serdecznie!
Jestem początkującym amatorem programowania w Delphi i napotkałem problem, którego, mimo poszukiwań w Internecie, nie udało mi się rozwiązać.
Otóż mam prostą bazę danych ładującą się do komponentu TListView (bazowałem na skrypcie Adama Boducha z jego wyśmienitej książki). Każdemu z wierszy przypisany jest odpowiedni ImageIndex z właściwości SmallImages w zależności od jednej z wartości. Problem polega na tym, że ikonka wyświetla się zawsze przed pierwszą kolumną, a ja bym chciał, żeby wyświetlała się przy na przykład trzeciej kolumnie.
Jeśli taka opcja nie istnieje, to czy możliwe jest by w jednej z kolumn zamiast tekstu wyświetlany był po prostu obrazek (na przykład ładowany z pliku?)
Pozdrawiam i z góry dziękuję za pomoc!

Pozostało 580 znaków

2011-07-22 18:31
0

Jeżeli chcesz mieć w trzeciej kolumnie, a załóżmy że masz w sumie 6 to zrób dwa TListView, e jednym zrób dwie, a w drugim 4.

ListView1.BorderStyle := bsNone;
ListView2.BorderStyle := bsNone;

A wszystko obtocz TBevel'em.


char mander; bool basaur;

Pozostało 580 znaków

2011-07-22 18:40
Opi
0

Lepiej namalować ikonę i zrobić to można w dowolnym miejscu.

Potrzebny Ci jeden wypełniony ikonami ImageList1 oraz drugi pusty ImageList2 potrzebny do zwiększenia wysokości wierszy.

ImageList1 wypełnij ikonami o wielkości 20x20.
ImageList2 pozostaw pusty, a jego Width i Height ustal po 20. Przypisz go do ListView.SmallImages
W ListView wstaw pustą kolumnę o szerokości stałej = 25. Załóżmy, że to jest kolumna druga. To w niej będą ikony.

Dodajesz elementy do listy

var Item: TListItem;
begin
 {Dodanie do listy}
 Randomize;
 Item := ListView.Items.Add;
 Item.Caption    := 'Kolumna I';
 Item.SubItems.Add('');  //Kolumna II pusta - w niej będzie rysowanie ikon
 Item.SubItems.Add('Kolumna III');
 Item.ImageIndex := Random(5);  //Twój nr ikony
end;

W procedurze ListView.OnAdvancedCustomDrawItem

var
 R: TRect;
 W: Integer;
begin
 W := Sender.Column[0].Width + 5;
 {Pobierasz szerokość pierwszej kolumny. 
 Jeśli chcesz rysować w dalszej kolumnie, musisz sumować szerokości pierwszych}
 
 R := Item.DisplayRect(drLabel);
 ImageList1.Draw(Sender.Canvas, W {Położenie w poziomie}, R.Top + 2 {Położenie w pionie}, Item.ImageIndex);
end;

Ponieważ przypisałeś do ListView ImageList2 (ten pusty), ikony nie zostaną wyświetlone, ale zachowasz odwołanie do indeksu w ImageIndex.

edytowany 2x, ostatnio: Opi, 2011-07-22 19:05

Pozostało 580 znaków

2011-07-22 19:43
Asarnil
0

Hejka!
Dzięki za odpowiedź, spróbuję tak zrobić (choć to pewnie po weekendzie ;)).
Rozumiem, że rozwiązanie to nie będzie się kłócić z sortowaniem kolumn?

Pozostało 580 znaków

2011-07-23 19:50
Asarnil
0

Wszystko działa super świetnie!!
Dziękuję bardzo!
Pozdrawiam.

Zaakceptować rozwiązania to nie łaska, co nie? - payl 2011-07-23 20:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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