Ho inserito al funzione OncompareCells, ma l'ordinamento peggiora, nel senso che non mi ordina nemmeno le colonne alfabetiche.
procedure TForm1.SgDaOrdinareCompareCells(Sender: TObject; ACol, ARow, BCol,
BRow: Integer; var Result: integer);
begin
if Acol<>5 then exit;
// Result will be either <0, =0, or >0 for normal order.
result := StrToIntDef(SgDaOrdinare.Cells[ACol,ARow],0)-StrToIntDef(SgDaOrdinare.Cells[BCol,BRow],0);
// For inverse order, just negate the result (eg. based on grid's SortOrder).
if SgDaOrdinare.SortOrder = soDescending then
result := -result;
end;
procedure TForm1.popolagriglia;
var cl,rg:integer;
begin
SgDaOrdinare.rowcount:=6;
for rg:=1 to 5 do with SgDaOrdinare
do begin
cl:=0;
Cells[cl,rg]:=ArrElementi[rg].primo;inc(cl);
Cells[cl,rg]:=CreaNumeroCurrency(ArrElementi[rg].secondo);inc(cl);
Cells[cl,rg]:=ArrElementi[rg].terzo;inc(cl);
Cells[cl,rg]:=ArrElementi[rg].quarto;inc(cl);
Cells[cl,rg]:=CreaNumeroCurrency(ArrElementi[rg].quinto);inc(cl);
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
ArrElementi[1].primo:='il';
ArrElementi[1].secondo:=1;
ArrElementi[1].terzo:='elemento1';
ArrElementi[1].quarto:='primo';
ArrElementi[1].quinto:=1010.05;
ArrElementi[2].primo:='il';
ArrElementi[2].secondo:=2;
ArrElementi[2].terzo:='elemento2';
ArrElementi[2].quarto:='secondo';
ArrElementi[2].quinto:=220.22;
ArrElementi[3].primo:='il';
ArrElementi[3].secondo:=3;
ArrElementi[3].terzo:='elemento3';
ArrElementi[3].quarto:='terzo';
ArrElementi[3].quinto:=3000.17;
ArrElementi[4].primo:='il';
ArrElementi[4].secondo:=4;
ArrElementi[4].terzo:='elemento4';
ArrElementi[4].quarto:='quarto';
ArrElementi[4].quinto:=40;
ArrElementi[5].primo:='il';
ArrElementi[5].secondo:=5;
ArrElementi[5].terzo:='elemento5';
ArrElementi[5].quarto:='quinto';
ArrElementi[5].quinto:=5000;
popolagriglia;
end;
Così dovrebbe funzionare:
procedure TForm1.SgDaOrdinareCompareCells(Sender: TObject; ACol, ARow, BCol,
BRow: Integer; var Result: integer);
var Num1, Num2:Longint;
begin
//if Acol<>5 then exit;
Num1:=StrToIntDef(SgDaOrdinare.Cells[ACol,ARow],0);
Num2:=StrToIntDef(SgDaOrdinare.Cells[BCol,BRow],0);
// Result will be either <0, =0, or >0 for normal order.
if (Num1 > Num2) then Result:=1
else
if (Num1 = Num2) then Result:=0
else
Result := -1;
// For inverse order, just negate the result (eg. based on grid's SortOrder).
if SgDaOrdinare.SortOrder = soDescending then
result := -result;
end;
P.S. Che senso ha questa : "if Acol<>5 then exit;" ???
La prima colonna è la colonna 0, l'ultima è la colonna 4. Con quella istruzione la "SgDaOrdinareCompareCells" non viene mai eseguita !!!
P.P.S. Invece di usare "','", usa "FormatSettings.DecimalSeparator".
Stessa cosa per il "'.'", usa "FormatSettings.ThousandSeparator".
Solo così puoi essere sicuro che le successive conversioni tra numeri e stringhe funzionino correttamente
Dopo queste correzioni, il codice che ho postato sopra, funziona solo per la colonna 1, che è l'unica che contiene numeri validi in tutte le righe.
Ciao, Mario
Grazie per la colonna 2 funziona, purtroppo per la colonna 5 no, in realtà era quella che piu' mi serviva (numeri "Currency")
Occhio che le colonne vanno da 0 a 4, quindi funziona per colonna 1 e non per colonna 4 .....
Per farla funzionare anche per colonna 4, devi togliere i punti di separazione delle migliaia prima di fare il confronto:
procedure TForm1.SgDaOrdinareCompareCells(Sender: TObject; ACol, ARow, BCol,
BRow: Integer; var Result: integer);
var Num1, Num2:Extended;
Str1, Str2:String;
begin
Str1:=StringReplace(SgDaOrdinare.Cells[ACol,ARow], FormatSettings.ThousandSeparator, '', []);
Str2:=StringReplace(SgDaOrdinare.Cells[BCol,BRow], FormatSettings.ThousandSeparator, '', []);
if (not TryStrToFloat(Str1, Num1)) then Num1:=0;
if (not TryStrToFloat(Str2, Num2)) then Num2:=0;
// Result will be either <0, =0, or >0 for normal order.
if (Num1 > Num2) then Result:=1
else
if (Num1 = Num2) then Result:=0
else
Result := -1;
// For inverse order, just negate the result (eg. based on grid's SortOrder).
if SgDaOrdinare.SortOrder = soDescending then
result := -result;
end;
Così funziona sia per colonna 1 che per colonna 4.
Ciao, Mario