Avatar billede wired Nybegynder
24. juni 2002 - 22:50 Der er 15 kommentarer og
1 løsning

Tal-sortering i StringGrid ( eller TListView )

Jeg har en masse tal i en StringGrid som jeg gerne vil have sorteret. Hvordan gør jeg dette nemmest? Please....
Avatar billede dkn Nybegynder
25. juni 2002 - 04:36 #1
Hvis du vil bruge en listview virker det her perfekt:
http://www.howtodothings.com/showarticle.asp?article=291
Avatar billede borrisholt Novice
25. juni 2002 - 08:29 #2
eller bare en listbox !

Jens B
Avatar billede wired Nybegynder
25. juni 2002 - 09:55 #3
Syntes at begge tilfælde sortere tekst og ikke tal, dvs. rækkefølgen bliver 1,11,100,2,22, etc. i stedet for 1,2,11,22,100
Avatar billede hreiff Nybegynder
25. juni 2002 - 12:33 #4
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;
Avatar billede wired Nybegynder
25. juni 2002 - 17:35 #5
Hmm.. ok nu nærmer det sig... det virker dog ikke med sidste linie:
  if not Ascending then Result := -Result;

Jeg ville gerne have haft det i vsList mode, men når jeg bruger en knap i stedet mangler den Column informationen fra

procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);

Prøvede selv at definere var Column : TListColumn
men formoder at den anden indholder informationer.
Avatar billede borrisholt Novice
26. juni 2002 - 08:27 #6
det wierd snakker om er en TListView

Jens B
Avatar billede hreiff Nybegynder
26. juni 2002 - 12:18 #7
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.
Avatar billede wired Nybegynder
06. juli 2002 - 00:21 #8
Det går vist lidt galt.

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).

Please help me....
A bit wired
Avatar billede hreiff Nybegynder
08. juli 2002 - 12:12 #9
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:

ListView1.CustomSort(@SortByColumn, Column.Index);
Avatar billede borrisholt Novice
08. juli 2002 - 12:17 #10
Du vil altså gerne have en TListView hvor der i den første række står bliver sorteret som Tekst og den næste række som tal ?

Jens B
Avatar billede borrisholt Novice
08. juli 2002 - 13:09 #11
prøv det her :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;

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;

end.


Jens B
Avatar billede borrisholt Novice
08. juli 2002 - 13:30 #12
compareint skal selvfølgelig se sådan her ud :

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;


Jens b
Avatar billede borrisholt Novice
08. juli 2002 - 15:20 #13
Wierd ?
Avatar billede wired Nybegynder
09. juli 2002 - 09:31 #14
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.

Mange tak for tålmodigheden...
Avatar billede borrisholt Novice
09. juli 2002 - 11:08 #15
Lukker du spørgsmålet eller hvad ?

Jens B
Avatar billede wired Nybegynder
09. juli 2002 - 14:16 #16
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester