Sortowanie StrinGrid

0

Mam pytanie. Jak zrobić żeby posortować wiersze w StringGrid np. wg tekstów w pierwezej kolumnie?

0
type
  TMoveSG = class(TCustomGrid); // reveals protected MoveRow procedure

{...}

procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of Integer);
var
  i, j:   Integer;
  Sorted: Boolean;

function Sort(Row1, Row2: Integer): Integer;
var
  C: Integer;
begin
  C      := 0;
  Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], Grid.Cols[ColOrder[C]][Row2]);
  if Result = 0 then
  begin
    Inc(C);
    while (C <= High(ColOrder)) and (Result = 0) do
    begin
      Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1],
        Grid.Cols[ColOrder[C]][Row2]);
      Inc(C);
    end;
  end;
end;

begin
  if SizeOf(ColOrder) div SizeOf(i) <> Grid.ColCount then Exit;

  for i := 0 to High(ColOrder) do
    if (ColOrder[i] < 0) or (ColOrder[i] >= Grid.ColCount) then Exit;

  j := 0;
  Sorted := False;
  repeat
    Inc(j);
    with Grid do
      for i := 0 to RowCount - 2 do
        if Sort(i, i + 1) > 0 then
        begin
          TMoveSG(Grid).MoveRow(i + 1, i);
          Sorted := False;
        end;
  until Sorted or (j = 1000);
  Grid.Repaint;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  { Sort rows based on the contents of two or more columns.
    Sorts first by column 1. If there are duplicate values
    in column 1, the next sort column is column 2 and so on...}
  SortGridByCols(StringGrid1, [1, 2, 0, 3, 4]);
end;
0

Czy kod jest na pewno dobry bo jakoś mi nie działa....? A i przy okazji mam pytanie jak zrobic zeby w labelu wyswietlał mi sie tekst zaznaczonej komórki w StringGrid. Pewnie StringGird1.Onclick... ale jak konkretnie?

0

Też kiedyś próbowałem to posortować i mi nie działało... A kod powyżej również tak jak u Królika u mnie nie działa. Może ktoś ma inny pomysł jak to zrobić albo wie co jest źle w kodzie powyżej.
No chyba, że kod powyżej jednak jest dobry to może ktoś ma jakąś koncepcje co ja robie źle :)

0

a nie lepiej uzyc komponentu AdvStringGrid??? on juz w ustawieniach ma sortowanie wiec nie czeba zadnego komponentu.

0

Czy ktoś ma procedurke jakąs która posortuje dobrze TstringGrida.
Ta wyglada super ale nie dziala :p

Znalazłem:

procedure Sortuj(A: TStringGrid);

  procedure Zamien(Lo, Hi: Integer);
  var
    T: TStringList;
  begin
    T := TStringList.Create;
    T.Assign(A.Rows[Lo]);
    A.Rows[Lo].Assign(A.Rows[Hi]);
    A.Rows[Hi].Assign(T);
    T.Free;
  end;

  procedure QuickSort(iLo, iHi: Integer);
  var
    Lo, Hi: Integer;
    Mid: string;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := A.Cols[0][(Lo + Hi) div 2];
    repeat
      while A.Cols[0][Lo] < Mid do Inc(Lo);
      while A.Cols[0][Hi] > Mid do Dec(Hi);
      if Lo <= Hi then
      begin
        Zamien(Lo, Hi);
        Inc(Lo);
        Dec(Hi);
      end;
    until Lo > Hi;
    if Hi > iLo then QuickSort(iLo, Hi);
    if Lo < iHi then QuickSort(Lo, iHi);
  end;

begin
  QuickSort(0, A.RowCount-1);
end;

ale polskie znaki sortuje jako ostanie
np.:
Albert
Zbysiu
Środek

0

skozystaj z gotowego komponentu

TStringAlignGrid

ze strony www.torry.net
ma on tez bardzo duzo innych przydatnych funkcji

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