Avatar billede dkklein Nybegynder
15. marts 2003 - 15:25 Der er 1 kommentar og
1 løsning

Stringgrid - sortering på kolonne

Det er blevet spurgt et par gange men jeg synes ikke at have fundet et brugbart svar.

Jeg har et stringgrid defineret.

Jeg vil gerne kunne sortere på alle kollonner ved at klikke på kollonne titlen.

Hvilken event skal jeg anvende?

Og hvordan sorterer jeg rækkerne?
Avatar billede dkklein Nybegynder
16. marts 2003 - 13:04 #1
Jeg fandt en løsning som kan ses nedenfor.

Men hvordan finder jeg ud af hvilken kollenne der blev klikket på?

For StringGrid er der så vidt jeg kan se ikke en event for klik på kolonne?




type TStringGridExSortType = (srtAlpha,srtInteger,srtDouble);

procedure GridSort(SG : TStringGrid; ByColNumber,FromRow,ToRow : integer;
                  SortType : TStringGridExSortType = srtAlpha);
var Temp : TStringList;

    function SortStr(Line : string) : string;
    var RetVar : string;
    begin
      case SortType of
          srtAlpha  : Retvar := Line;
          srtInteger : Retvar := FormatFloat('000000000',StrToIntDef(trim(Line),0));
          srtDouble  : try
                          Retvar := FormatFloat('000000000.000000',StrToFloat(trim(Line)));
                        except
                          RetVar  := '0.00';
                        end;
      end;

      Result := RetVar;
    end;

    // Recursive QuickSort
    procedure QuickSort(Lo,Hi : integer; CC : TStrings);

        procedure Sort(l,r: integer);
        var  i,j : integer;
            x  : string;
        begin
          i := l; j := r;
          x := SortStr(CC[(l+r) DIV 2]);
          repeat
            while SortStr(CC[i]) < x do inc(i);
            while x < SortStr(CC[j]) do dec(j);
            if i <= j then begin
              Temp.Assign(SG.Rows[j]);      // Swap the 2 rows
              SG.Rows[j].Assign(SG.Rows[i]);
              SG.Rows[i].Assign(Temp);
              inc(i); dec(j);
            end;
          until i > j;
          if l < j then sort(l,j);
          if i < r then sort(i,r);
        end;

    begin {quicksort};
      Sort(Lo,Hi);
    end;

begin
  Temp := TStringList.Create;
  QuickSort(FromRow,ToRow,SG.Cols[ByColNumber]);
  Temp.Free;
end;
Avatar billede dkklein Nybegynder
16. marts 2003 - 13:36 #2
Jeg fandt ud af det.

StringGrid.col
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger leder til Lokal IT Servicecenter i Holstebro

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Solution Manager til Cyberdivisionen

Politiets Efterretningstjeneste

Configuration Manager til PET's IT-afdeling

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Senior Data Engineers til dataplatform i Forsvaret