In un progetto ho popolato una stringgrid (Stringgrid6) con dei valori numerici .
La colonna zero è numerata da 1 ad n con interi (1,2,3,4,….).Nelle proprietà della stringgrid6 ho posto ColumnClickSorts = true. Quando faccio un sort sulla colonna zero il programma vede la numerazione delle righe definita da numeri interi(1,2,3,4…) come delle stringhe e non riesce ad ordinare le righe in modo crescente o decrescente.Devo intervenire in qualche Evento della stringgrid6?
Ho provato così ma non funziona:
procedure TForm1.StringGrid6CompareCells(Sender: TObject; ACol, ARow, BCol, BRow: Integer; var Result: Integer);
var
Val1, Val2: Integer;
begin
// Controlla se la colonna è quella che contiene i numeri interi
if ACol = 0 then
begin
// Converte le stringhe in numeri interi
Val1 := StrToInt(StringGrid6.Cells[ACol, ARow]);
Val2 := StrToInt(StringGrid6.Cells[BCol, BRow]);
// Confronta i valori interi
if Val1 < Val2 then
Result := -1
else if Val1 > Val2 then
Result := 1
else
Result := 0;
end
else
begin
// Per le altre colonne utilizza il confronto standard
Result := CompareText(StringGrid6.Cells[ACol, ARow], StringGrid6.Cells[BCol, BRow]);
end;
end;
La colonna zero coincide con la colonna fissa.
con questa modifica sembra funzioni:
procedure TForm1.StringGrid6CompareCells(Sender: TObject; ACol, ARow, BCol,
BRow: Integer; var Result: integer);
var
Val1, Val2: Integer;
begin
if ACol = 0 then
begin
// Convertire le stringhe in numeri interi per la colonna zero
Val1 := StrToIntDef(StringGrid6.Cells[ACol, ARow], 0);
Val2 := StrToIntDef(StringGrid6.Cells[BCol, BRow], 0);
// Confrontare i valori numerici
if Val1 < Val2 then
Result := -1
else if Val1 > Val2 then
Result := 1
else
Result := 0;
end
else
begin
// Utilizzare il confronto predefinito per le altre colonne
Result := CompareStr(StringGrid6.Cells[ACol, ARow], StringGrid6.Cells[BCol, BRow]);
end;
end;
forse ho risolto.
All'apertura del file ho aggiunto:
StringGrid6.OnCompareCells := @StringGrid6CompareCells;
quindi non degli interi ma stringhe(0001,0002...)?
Vedo che hai trovato il modo per ottenere l'ordinamento in maniera corretta, comunque finisco di spiegarti il mio metodo alternativo.
Per popolare la StringGrid nella colonna 0 devi comunque convertire l'intero in stringa, a questo punto completi la stringa con degli zeri a sinistra, in maniera tale che le stringhe abbiano tutte la stessa lunghezza, nel mio caso la lunghezza è 4.
Ovviamente, si deve considerare il max numero intero che potrai mettere e regolarti di conseguenza con la lunghezza della stringa.
Io uso questa funzione per mettere gli zeri:
function zeri_sx(s: string; larg: integer): string;
begin
if length(s)>=larg then
zeri_sx:=s
else
zeri_sx:='0'+zeri_sx(s,larg-1)
end;
risolto.Cosi ordino sia decrescente che crescente cliccando sull'intestazione:
procedure TForm1.StringGrid6CompareCells(Sender: TObject; ACol, ARow, BCol,
BRow: Integer; var Result: integer);
var
Val1, Val2: Integer;
begin
if ACol = 0 then
begin
// Convertire le stringhe in numeri interi per la colonna zero
Val1 := StrToIntDef(StringGrid6.Cells[ACol, ARow], 0);
Val2 := StrToIntDef(StringGrid6.Cells[BCol, BRow], 0);
// Confrontare i valori numerici
if Val1 < Val2 then
Result := -1
else if Val1 > Val2 then
Result := 1
else
Result := 0;
end
else
begin
// Utilizzare il confronto predefinito per le altre colonne
Result := CompareStr(StringGrid6.Cells[ACol, ARow], StringGrid6.Cells[BCol, BRow]);
// Se si desidera l'ordinamento decrescente, invertire il risultato
if StringGrid6.SortOrder = soDescending then Result := -Result;
end;
end;
Non conosco ".SortOrder ", ma visto dove hai messo queste 2 righe,
// Se si desidera l'ordinamento decrescente, invertire il risultato
if StringGrid6.SortOrder = soDescending then Result := -Result;
mi viene da dire che lo farebbe solo per quelle alfanumeriche
Ciao, Mario