Newsgroup: it.comp.lang.delphi
Titolo: Ordinare una string grid

Mi date un aiutino?
Ho una StringGrid con 5 colonne per un centinaio di righe.
Ora vorrei ordinare le righe alfabeticamente secondo qualsiasi colonna e,
forse chiedendo troppo, fare un ordinamento secondo più colonne in base a
determinate priorità.
Guardando l'oggetto StringList, sembra che abbia un metodo Sort, che non
sono però riuscito a usare.
Quindi stavo pensando di fare un array[colonne, righe] di stringhe,
trasferirci tutte le cells della grid  e farmi l'ordinamento tutto a manina,
o esiste qualche metodo più elegante, e soprattutto facile?
Grazie e ciao a tutti.

  |
|  Use manually this address!!   |
|  ICQ#: 19577419                |
+--------------------------------+

determinate priorità.
Oltre al solito consiglio (spesso la soluzione + rapida): hai guardato
su torry o dsp?
Potresti: 
a) copiare la colonna secondo cui vuoi ordinare in una TStringList;
aSl.Assign(aGrid.Cols[IndOfCol2Sort]);
b) in Objects mettere l'index corrente; 
for i := 0 to Pred(aSl.Count) do 
  aSl.Objects[i] := Pointer(i);
c) fai il sort della sl (aSl.Sort)
d) riordina le righe della grid secondo il nuovo ordine (indicato da
Objects)
for OldPos := 0 to Pred(aSl.Count) do begin
  NewPos := Longint(Pointer(aSl.Objects[OldPos]));
  if (NewPos >= 0) and (OldPos <> NewPos) then
    SwapRows(OldPos, NewPos);	// da implementare
  Longint(aSl.Objects[OldPos]) := -1;
end;
NB: disabilita il refresh mentre lo fai!
hth
Paolo Arosio

 NB: disabilita il refresh mentre lo fai!
Ti ringrazio per i tuoi consigli, che terrň bene in considerazione, cioč
vedrň se potrň applicarli al mio caso. Per ora ho risolto semplicemente con
queste due procedurine :-)
{ Scambia la posizione di due rows nella grid }
Procedure TFormDBP.ScambiaRows(row1, row2 : Integer);
var
  st : string;
begin
  st := SGrid.Rows[row1].Text;
  SGrid.Rows[row1].Text := SGrid.Rows[row2].Text;
  SGrid.Rows[row2].Text := st;
end;
{ Ordinamento in base al nome(prima colonna = 0)}
procedure TFormDBP.BtnOrdinaNomeClick(Sender: TObject);
var
  i, confront : Integer;
const
  NOME = 0; {la colonna da ordinare}
begin
  i := 1;
  while i < SGrid.RowCount - 2 do
  begin
    confront := CompareText(SGrid.Cells[NOME,i], SGrid.Cells[NOME, i+1]);
    if confront > 0 then
    begin
      ScambiaRows(i, i+1);
      i := 1;
    end
    else Inc(i);
  end;
end;
L'algoritmo di ordinamento č senza dubbio grezzo, ma per un centinaio di
record esegue istantaneamente. Gradirei consigli su come applicare qui
quicksort o bubblesort, se ne avete voglia, naturalmente :-)
Non mi piace usare tools fatti da altri che fanno mille cose quando a me ne
serve una sola.
E poi mi piace fare le cose da me, soprattutto per imparare!
Io ho chiesto un consiglio qui perché non avevo idea di come confrontare
alfabeticamente due stringhe, poi ho scoperto CompareText e CompareString.
Grazie per i tuoi consigli!
Ciao
--
(* MBSoftware *)
{ 
http://web.tiscalinet.it/mbsoftware
 }
///asibiri
///Justice is lost, justice is raped, justice is done{metallica}

alfabeticamente due stringhe, poi ho scoperto CompareText e CompareString.
v. anche AnsiCompareXxx. 
Riguardo a QSort: č l'algoritmo usato da TStringList.Sort.
Se vuoi utilizzare un tuo criterio puoi usare TStringList.CustomSort (il
cui parametro č la funzione di comparazione da te definita).
Riguardo all'applicazione di qsort: v. Classes.TStringList.QuickSort.
Saluti
Paolo Arosio