Jak zmieńić kolor i dodać "podlinie"

0

Na samym wstępie witam wszystkich którzy chcą pomóc w tej sprawie ;)

  1. Chce zmienić kolor zaznaczenia itema, nie kolor itema tylko kolor zaznaczenia. Jak klikamy na itema w listview robi sie taka ramka z kropek i szare pole (domyślny kolor zaznaczenia w win xp to szary, tą ramke zaznaczenia z kropek też chce usunąc) i ja chce zmienić jego kolor.

A więc ten kod w ogóle sie nie przydaje bo zmienia tylko kolor itema, a nie kolor zaznaczenia itema.

if Item.Index=1  then
ListView1.Canvas.Brush.Color:= clRed;
  1. Chce uzyskać taki efekt jak lista kontaktów w gg czyli ikonka dostępności, w tej samej lini Nazwa usera a pod spodem druga linia opis. Ale tak ze jak zaznaczam to zeby sie zaznaczały 2 itemy jako jedne tak jak w liście kontaktów GG

Od razu mówie ze mam Delphi 2007 Pro v2, wiec musi to być listView.

Pozdrawiam i czekam z niecierpliwością na pomoc

0

Na kolorowaniu listviewa się nie znam, ale za to znalazłem inny sposób, żeby wyświetlić to co chcesz...

Idea:
Na początku wrzucasz sobie scrollboxa, który będzie służył jako pasek przewijania... Potem do tego scrollboxa możesz sobie dynamicznie dodawać panele na których możesz dynamicznie stawiać komponenty

Rozwiązanie:

Wrzuć na forme(form1) scrollboxa, buttona i zamień kod na:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure klik(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tab: array of record
                panel:Tpanel;
                nazwa:Tlabel;
                obrazek:Timage;
                podpis:Tlabel;
                end;
  liczba:integer;


implementation

{$R *.dfm}

procedure Tform1.klik(Sender: TObject);
var
i:integer;
begin
for i:=0 to liczba-1 do
tab[i].panel.Color:=clSkyBlue;

tab[(Sender as TControl).Tag].panel.Color:=clred;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Setlength(tab,liczba+1);
tab[liczba].panel:=Tpanel.Create( Self );
tab[liczba].panel.Parent:=scrollbox1;
tab[liczba].panel.Height:=40;
tab[liczba].panel.Align:=alTop;
tab[liczba].panel.Top:=high(integer); //po to by nowy komponent był dodawany do końca listy
tab[liczba].panel.BevelOuter:=bvnone;
tab[liczba].panel.Color:=clSkyBlue;
tab[liczba].panel.Tag:=liczba;

tab[liczba].nazwa:=Tlabel.Create(Self);
tab[liczba].nazwa.Parent:=tab[liczba].panel;
tab[liczba].nazwa.Caption:='Jakas tam nazwa '+inttostr(liczba+1);
tab[liczba].nazwa.Font.Size:=12;
tab[liczba].nazwa.Top:=0;
tab[liczba].nazwa.Left:=15;
tab[liczba].nazwa.Tag:=liczba;

tab[liczba].podpis:=Tlabel.Create(Self);
tab[liczba].podpis.Parent:=tab[liczba].panel;
tab[liczba].podpis.Caption:='Jakis tam opis '+inttostr(liczba+1);
tab[liczba].podpis.Font.Size:=8;
tab[liczba].podpis.Top:=20;
tab[liczba].podpis.Left:=15;
tab[liczba].podpis.Tag:=liczba;

tab[liczba].obrazek:=Timage.Create(Self);
tab[liczba].obrazek.Parent:=tab[liczba].panel;
tab[liczba].obrazek.Top:=10;
tab[liczba].obrazek.Left:=0;
tab[liczba].obrazek.Width:=15;
tab[liczba].obrazek.height:=15;
tab[liczba].obrazek.Canvas.Brush.Color:=clyellow;
tab[liczba].obrazek.Canvas.Pen.Color:=clred;
tab[liczba].obrazek.Canvas.Ellipse(0,0,15,15);
tab[liczba].obrazek.Tag:=liczba;

//dopisanie zdarzeń

tab[liczba].panel.OnClick:=klik;
tab[liczba].obrazek.OnClick:=klik;
tab[liczba].podpis.OnClick:=klik;
tab[liczba].nazwa.OnClick:=klik;


inc(liczba);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
liczba:=0;
end;

end.

Podepnij zdarzenie Button1Click i FormCreate do odpowiednich zdarzeń i uruchom program...
Testowane na Delphi7, ale na twoim też powinno chodzić

Mam nadzieję że rozumiesz o co chodzi ;) Zamiast bawić się listview'em można sobie zrealizować takie rzeczy za pomocą dynamicznych paneli... Teraz możesz nawet dodawać sobie inne rzeczy, których byś nie mógł dodać za pomocą zwykłego listviewa... Trochę więcej pracy, a korzyści dużo więcej ;-P

0

ojoj :) ślicznie dziękuje ;*, a teraz pytanko z innej beczki :) wiadomo że jak na scrollboxie będzie dużo paneli to pojawi się pasek przewijania, teraz jest problem jak dodać coś takiego że skroluje scrollem na myszce (czyli przewijam te panele tak jak zwykłą listę) oraz dodać obsługę klawiszy w górę i w dół na klawiaturze (to będzie prostrze)

najważniejsze jest to scroloowanie myszką, żeby je podczepić do scrollboxa ;)

dziękuwa, pozdrawiam :)

Edit:
hm... przydała by sie wymyślić jakąs procedure sortowanai tych paneli po nazwie (nazwa), bo jzu to rozwiązałem ale polega to na tworzeniu od nowa paneli badz ustawianiu ich na align altop, pisze to Od razu na forum ;) zebyn se niezapomnial ...
np.

for i:=0 to liczba do  //czysci liste
begin
panel[liczba].align:=alNone;
panel[liczba].visible:=false;
end;

for i:=0 to liczba do  // sortowanie po liczbach
if panel[liczba].nazwa = IntToStr(i) then
begin
panel[liczba].visble:=true; // pokazuje
panel[liczba].algin:=altop; // przesuwa na sam szczyt
end;

ale wolałbym zeby się po prostu przesuwał panel do góry bez chowania wszystkich, macie jakieś pomysły ?

0

sekunda googlowania i masz odpowiedź:
http://forum.ks-ekspert.pl/lofiversion/index.php?t82632.html
:-)

0

hehe i jeszcze tylko jedna sprawa :D, jak to posortować najlepiej ;/ ?? istniej coś takiego jak numeracja alignTop ??

Edit:
wtedy bym sobie ustawiał tylko indexy alignów i scrollbox update ;) i mamy szybkie sortowanie ??

da zrobić takie cos ?

0

No jakbyś przejrzał mój kod to byś znalazł taką linię:

tab[liczba].panel.Top:=high(integer);

Powoduje ona, że nowe elementy są tworzone na końcu (high(integer) oznacza największą liczbę typu integer)
Wystarczy więc jak utworzysz sobie taką tablicę:

sortab:array of record
                                   s:string;
                                   tag:integer;
                                   end;

Ustawisz jej długość w kodzie i przypiszesz nazwy i tagi tych pozycji:

Setlength(sortab,liczba);

for i:=0 to liczba-1 do
  begin
  sortab[i].s:=tab[i].nazwa.Caption;
  sortab[i].tag:=i;
  end;

Teraz wystarczy jak posortujesz rosnąco tablicę sortab względem stringa (Pamiętając o tym, żeby własność tag była zawsze przesuwana ze stringem).

Jak będziesz miał już to posortowane to wystarczy dać pętelkę:

for i:=0 to liczba-1 do
  tab[sortab[i].tag].panel.Top:=high(integer);

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