I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Det er ret let. Kolonnerne opretter du ved at dobbeltklikke på listviewet. For at oprette linjer kører du ListView.Items.Add returnerer et TListItem objekt som har Caption for første kolonne, SubItems for de efterfølgende (en TStringList hvor du bare adder ny kolonner)
with ListView.Items.Add do begin Data := MyObject; // Smart at hægte eventuelle objekter på her (hvis man har dem) // men det skal være før du sætter Caption for det trigger en OnChange Caption := 'Hej'; SubItems.Add('mor'); end;
Jeg fulgte bare op på borrisholt og a_nors kommentarer. TListItem.Data (TTreeViews items har også .Data) er en bekvem måde at hægte et objekt på den linje hvor den vises. Eksempelvis kan du have en instans af TPersonData som indeholder cpr, navn, adresse, postnr, postby.
PersonData := TPersonData.Create('131233-1231','Hans Tauchen','Isvej 1','5000','Odense); with ListView.Items.Add do begin Data := PersonData; Caption := PersonData.CPR; SubItems.Add(PersonData.Navn); SubItems.Add(PersonData.Adresse); SubItems.Add(PersonData.PostNr); SubItems.Add(PersonData.PostBy); end;
Hvis du hægter dig på ListViewets OnSelected event får du direkte adgang til det objekt som linjen viser:
Et andet sted hvor det tit er praktisk at have adgang til objektet bag, fremfor Item'et er, hvis du sorterer (OnColumnClicked og OnCompare).
Bemærk: fColumnClicked og fSortAscending er private attributter (det hedder det!) i formen. Lidt et kiks at det ikke er i komponenten (det er det i .NET versionen). Desuden har jeg en imagelist koblet på SmallImages, der indeholder små ikoner der viser sorteringsretningen (i den valgte kolonne)
procedure .. OnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); var PD1, PD2 : TPersonData; begin PD1 := Item1.Data; PD2 := Item2.Data; case fColumnClicked of 0 : Compare := AnsiCompareStr(PD1.CPR,PD2.CPR); 1 : Compare := AnsiCompareStr(PD1.Navn,PD2.Navn); 2 : Compare := AnsiCompareStr(PD1.Adresse,PD2.Adresse); 3 : Compare := AnsiCompareStr(PD1.PostNr, PD2.PostNr); 4 : Compare := AnsiCompareStr(PD1.PostBy, PD2.PostBy); end; // Vend sorteringsordenen hvis der er klikket to gange på samme kolonne if not fSortAscending then aCompare := - aCompare; end;
procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.TabWidth := 20; ListBox1.Items.Add('Column1'^I'Column2'^I'Column3'); // ^I is the Tab char ListBox1.Items.Add('Column1'^I'Column2'^I'Column3'); // ^I is the Tab char end;
loopit: Hvis det skal se fint ud skal du vel bruge en fast font, såsom Courier New. Mange muligheder for at det bliver grimt og spørgsmålet er også, hvorfor man ikke bare springer på TListView.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.