dkn's forslag viser hvordan man sorterer tekst - der benyttes AnsiCompareText. Du kan selv lave det om til Integer:
function SortByColumn(Item1, Item2: TListItem; Data:integer):integer; stdcall; begin if Item1.Caption = Item2.Caption then result := 0 else If StrToInt(Item1.Caption) > StrToInt(Item2.Caption) then result := 1 else result := -1; if not Ascending then Result := -Result; end;
Ascending er bare en variabel som bruges i eksemplet til at definere om der skal sorteres stigende eller faldende. Du kan bare udelade det hvis du ikke vil have den mulighed.
Jeg vil lave en TListView med kolonnerne "nr" og "navn".
Hvis der trykkes på en extern "buttom" skal der sorteres efter nr (tal). Hvis der trykkes på en anden extern "buttom" skal der sorteres efter navn(text)
Jeg har fået sorterings functionen, men vil gerne at den kan sortere ved at trykke på en extern "buttom" (og eventuelt derefter skifter til vsList mode).
Hvis det stadig er dkn's artikel som du bruger som forbillede kan du vel kalde sorterings proceduren hvorsomhelst fra. I stedet for ColumnClick kan du bare lave en Button, hvor du kalder:
type TForm1 = class(TForm) ListView1: TListView; procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn); procedure ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM} var lastColumn : Integer = -1;//Initialiser lastColumn til et ikke eksisterende kolonne nummer reverse : Boolean = false;
procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin if Column.Index = lastColumn then Reverse := not Reverse; lastColumn := Column.Index;
ListView1.CustomSort (nil, Column.Index);
end;
Function CompareInt(a,b : Integer) : Integer;assembler; { The return value is -1 if a is less than b, 0 if a equals b 1 if a is greater than b. } asm xor ecx, ecx cmp edx, eax je @CompareIntDONE jg @GreaterThan inc ecx jmp @CompareIntDONE @GreaterThan: dec ecx @CompareIntDONE: mov eax, ecx end;
procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if data = 0 then //Først række sorteres som Bogstaver Compare := CompareStr (Item1.Caption, Item2.Caption) else //ALLE andre rækker som tal Compare := CompareInt ( StrToInt(Item1.SubItems.Strings [Data - 1]) , StrToInt(Item2.SubItems.Strings [Data - 1]));
if reverse then Compare := -Compare; end;
procedure TForm1.FormCreate(Sender: TObject); var ListItem : TListItem; i,j : Integer; begin randomize; for j := 0 to 40 do begin ListItem := ListView1.Items.Add; i := Random(20); ListItem.Caption := IntToStr(i); ListItem.SubItems.Add (IntToStr(i)); end; end;
Function CompareInt(a,b : Integer) : Integer;assembler; { The return value is -1 if a is less than b, 0 if a equals b 1 if a is greater than b. } asm xor ecx, ecx cmp eax, edx je @CompareIntDONE jg @GreaterThan dec ecx jmp @CompareIntDONE @GreaterThan: inc ecx @CompareIntDONE: mov eax, ecx end;
hreiff havde løsningen. Jeg skulle selvfølgelig bare ListView1.CustomSort(@SortByColumn, Column.Index); dog skulle Column skiftes ud med nul da der et vilkårligt sted ikke er kendskab til det aktuelle nr. Jeg havde dog også gælde dkn eksempel derfor får du også lidt.
Yep jeg lukker spørgsmålet. Jeg giver også lige dig nogle point da det viste sig at jeg faktisk også fik brug for subitems egenskaben, men det var ikke det oprindelige spørgsmål, hvilket var løst af hreiff og dkn. Tak for svaret.
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.