Okropny wygląd TListView (vsReport)

0

Witam

Dopiero zaczynam przygodę z Delphi 2006. Moja aplikacja ma komponent TListView ale przyznam, że wygląd listy (vsReport i rowselect=true) pozostawia wiele do życzenia (może D2006 jest już tak przestarzały?) Generalnie nie wygląda tak jak lista w Windows Explorer (XP SP2).

Dlatego mam pytanko: czy można wyeliminować i jak, następujące wady:

  1. Górny margines pierwszego elementu na liście (nie powinno go być!)
  2. Czarna, przerywana ramka pozostająca na elemencie (to ma coś wspólnego z focusem, ale nie chodzi o zaznaczenie).
  3. Wysokość wiersza (czy można zmienić?? jak?), przecież to podstawa.
  4. Lewy margines wszystkich wierszy (pozostają chyba 2pixele z lewej strony - przecież nie powinno ich być!)
  5. Okropna ikona (jakby 16-kolorowa) nawet gdy wrzucam bitmapy 32bit

Bardzo proszę o jakąś poradę, fragmenty kodu, ewentualnie odpowiedź na pytanie podstawowe: czy można wyeliminować w D2006 to o czym napisałem wyżej. Próbowałem CustomDraw ale umiem tylko zmienić kolor i czcionkę, zresztą w Google nic ponad to nie znalazłem.

Sebastian

0

Na formularz daj TXPManifest bodajże z 3 zakładki

0

OK dzięki, to wyeliminowało górny margines.

A co z resztą? przecież musi być jakaś metoda. W żadnym programie pod win32 napisanym w Delphi nie widziałem tak brzydkiej listy jak u mnie - pomocy, to najważniejszy element...

0

witam jeśli chodzi ListView to jest on troche toporny jeżeli chcesz wprowadzać jakieś większe zmiany to ja proponuje skorzystać z czegoś innego np. VirtualTreeView lub EasyListView ew NextGrid to takie troche bardziej wypasione listViewy i oczywiście wszystkie za free

0

No tak, przy tych trzech TListView wymięka.

Wielkie dzięki [browar]

0

witam, a mozecie mi powiedziec jak tam dodawac linie w EasyListview ??? (rekordy) lub jak kto woli 'itemsy' jakos nie umiem tego zrobic, dodam ,ze w standardowym viewlist tez nie wychodzilo mi to ... :(

pozdrawiam

Ultimion

0

Tu masz kod do dodawania pozycji do standardowego ListView a co do EasyListview to <ort>niewiem</ort> czy zadziała bo niegdy nie używałem tego komponentu.

Var
L: TListItem;
begin
L := ListView1.Items.Add;
L.Caption := 'Jakiś tam tekst';
L.SubItems.Add(''Blla blaa');
end;

Ze standardowego ListViewa przy odrobinie wysiłku da się zrobić coś ładniejszego jedyny mankament to brak możliwości obsługi zdarzenia OnColumnResize ale można to obejść instalując sobie komponent ListViewEX bodajże a potem to już tylko własna obsługa rysowania kompontu

0

szukalem tego ListViewEx i nie znalazlem, masz moze pod ręką i mógbyś mi wyslac na maila ???

na razie uzywam EasyListView i analogicznie do standardowego ListView dziala dodawanie itemsow, ale mam takie pytanie:

a) jak sprawdzic w ktorej lini zmienilem status 'Checked' ???

juz doszedlem do tego
viewlog.Lines.Add('cos mieszam w itemsach - w lini nr:'+(inttostr(viewpid.Items.IndexOf(item)+1)));

b) jak sprawdzic w której lini nastapil dblclick ???
juz doszedlem do tego tylko dlaczego mam error ... nizej opis sytuacji.
viewlog.Lines.Add('cos mieszam w itemsach - w lini nr:'+(inttostr(viewpid.Items.IndexOf(item)+1)));

Dodam, ze w komponencie EasyListView jest takie zdazenie jak 'OnItemCheckChange' i to zdarzenie wystepuje gdy myszka zmienie 'Checked' w danym itemsie, ale nie wiem jak pobrac dane w ktorej lini nastapila ta zmiana.

Rowniez jest takie zdarzenie jak 'Ondblclick' i 'OnItemDblClick' ale jak zrobie obsluge tego zdarzenia np po to by sprawdzic w jakim momencie nastepuje to zdarzenie to wywala mi blad przy kompilacji i nie wiem co z nim zrobic :(

oto ten bląd:

Undeclared identifier: 'TEasyMouseButton'

i pokazuje mi linijke w "type"

procedure viewItemDblClick(Sender: TCustomEasyListview;
      Button: TEasyMouseButton; MousePos: TPoint;
      HitInfo: TEasyHitInfoItem);

sama procedura obslugi tego zdarzenia wyglada tak:

procedure TForm1.viewpidItemDblClick(Sender: TCustomEasyListview;
  Button: TEasyMouseButton; MousePos: TPoint; HitInfo: TEasyHitInfoItem);
begin
  viewlog.Lines.Add('podwojny klik');
end;

no i doszedl jeszcze jeden problemik ... he he he , jak odczytac dane z danych itemsow ??? powiedzmy przykladowo, ze chce odczytac z 3 lini w 2 kolumnie daną string, jak to zrobic ???

pozdrawiam

Ultimion

0

masz cos takiego ja

ListView.Selected.Caption - Tekst z zaznaczonego elementu z pierwszej kolumny
ListView.Selected.SubItems[0] - Tekst z zaznaczonego elementu z drugiej kolumny
ListView.Selected.SubItems[1] - Tekst z zaznaczonego elementu z trzeciej kolumny

itd

0

hmmm no tak, ale chyba zle napisalem problem....

moj programik musi dzialac tak...
uruchamiam program i on na wstepie pobiera dane z sieci i laduje je do itemsow (np 17 lini), kazda linia ma 'checked' i teraz jak w ktorejs lini odznacze lub zaznacze 'checked' to moja procedura musi odczytac kazdego itemsa w 2 kolumnie tworzac bufor w HEX z danymi , ktore itemsy sa zaznaczone a ktore nie, bardzo glupio to robi program, ktory wysyla mi dane, ale kazda zmiana 'checked' pociaga za soba wyslanie kompletnej listy itemsow ( w moim programie akurat dane z 2 kolumny ) wyglada to tak, ze kazdy items to dane 3 bajtowe (2 bajty do dana z 2 kolumny i jeden bajt to moj chcecked true=1 false =0 ) wiec zmieniajac jakikolwiek 'checked' musze stworzyc ciag bajtow, ktory wysylam w siec. a roznisie to tylko ktoryms bajtem odpowiedzialnym za 'checked'

wiec moj problem polega na tym, ze musze odczytac nie selection , ale wszystkie itemsy.
myslalem aby zrobic jakis dodatkowy bufor z danymi z 2 kolumny itemsowi z niej pobierac te dane, ale to takie nie profesjonalne podejscie :P

pozdro

Ultimion

0

to zwykła pętelka

for i:= to ListView1.Items.Count-1 do begin

i zamiast selected dajesz Items[i] gdzie i to index wiersza

0

Wybacz Puchi, ale cos mieszam ze skladnia ... :|

procedure TForm1.viewListCheckChanging(Sender: TCustomEasyListview;
  Item: TEasyItem; var Allow: Boolean);
  begin
    viewlog.Lines.Add('cos mieszam w itemsach - w lini nr:'+(inttostr(viewpid.Items.IndexOf(item)+1)));
    bufor:='';
    for x:=0 to ViewList.Items.Count-1 do
    begin
      if viewpid.Items.IndexOf(item) //tutaj chce sprawdzic czy jest zaznaczony checked i jezeli tak to (begin)
      Begin
        bufor:=bufor+ (no i tutaj chce dodac zawartosc kolumny N itemsa x, zwiekszajac dane bufora o nowe dane)
      end; 
    end;
    viewlog.lines.add(bufor);   //na koncu chce zobaczyc co ma w buforze - moj log lista:D
  end;

problem, ze cos mieszam w linijce IF i za chiny nie moge sprawdzic czy dany items jest 'checked'

0

bo źle to robisz
zamiast

if viewpid.Items.IndexOf(item) begin

daj coś takiego

if viewpid.Items[x].Checked = True then begin
0

Kontrolki VCL dziedziczące po TWinControl to jedynie wrappery na WinAPI, więc TListView to ta sama kontrolka co w eksploratorze.

0

hehe zanim odpisales to juz tak zrobilem ,ale mam dziwny problem... gdy wykonuje to w zdarzeniu "ItemCheckChanging" to on chyba nie widzi ostatniej zmiany ... zrobilem cos takiego:

procedure TForm1.ListviewItemCheckChanging(Sender: TCustomEasyListview;
  Item: TEasyItem; var Allow: Boolean);
  begin
    viewlog.Lines.Add('cos mieszam w itemsach - w lini nr:'+(inttostr(viewpid.Items.IndexOf(item)+1)));
    y:=0;
    bufor:='';
    for x:=0 to Listview.Items.Count-1 do
    begin
      if Listview.Items[x].Checked = true then
      begin
        bufor:= bufor + (zawartosc 2 kolumny w itemsie o nr [x]) // jak to zrobic ???
        y:=y+1;
      end;
    end;
    viewlog.Lines.Add('mamy obecnie '+inttostr(y)+' zaznaczonych checkedboxow');
    viewlog.Lines.Add(bufor);
  end;

mam problem by do bufora dodac wszystkie zawartosci 2 kolumny z kazdego itemsa gdzie checked jest = true

pozdro

Ultimion

0

Bo to jest zdarzenie "ItemCheckChanging" a nie "ItemCheckChanged", w argumentach tego zdarzenia masz aktualnie zmieniany item.

0

Nie kalecz kodu, wręcz go optymalizuj jak tylko się da:

procedure TForm1.ListviewItemCheckChanging(Sender: TCustomEasyListview;
  Item: TEasyItem; var Allow: Boolean);
  begin
    viewlog.Lines.Add('cos mieszam w itemsach - w lini nr:' + IntToStr(viewpid.Items.IndexOf(item)+1));
    y:=0;
    with Listview do
     for x := 0 to Items.Count-1 do
        if Items[x].Checked then
          begin
            bufor := bufor + Items[x].SubItems[0];
            Inc(y);
          end;

    viewlog.Lines.Add('mamy obecnie ' + IntToStr(y) + ' zaznaczonych checkedboxow');
    viewlog.Lines.Add(bufor);
  end;

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