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!
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.
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.
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?
Wszystko działa super świetnie!!
Dziękuję bardzo!
Pozdrawiam.