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

- Rejestracja:prawie 20 lat
- Ostatnio:ponad 19 lat
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;

- Rejestracja:prawie 20 lat
- Ostatnio:ponad 10 lat
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 :)
- Rejestracja:około 21 lat
- Ostatnio:około 13 lat
- Postów:556
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

- Rejestracja:około 22 lata
- Ostatnio:około 5 lat
- Postów:448
0
skozystaj z gotowego komponentu
TStringAlignGrid
ze strony www.torry.net
ma on tez bardzo duzo innych przydatnych funkcji