Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: alexarmato66 - Maggio 20, 2024, 11:00:57 am

Titolo: [RISOLTO] ColumnClickSorts con le Stringgrid
Inserito da: alexarmato66 - Maggio 20, 2024, 11:00:57 am
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:
Codice: [Seleziona]
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.
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: tito_livio - Maggio 20, 2024, 11:29:45 am
Mentre popoli la stringgrid, nella colonna zero invece di scrivere 1,2,3,4,... scrivi, 0001,0002,0003,...0010,...
L'ordinamento come stringhe funzionerà anche come ordinamento numerico.
La cella della stringgrid è di tipo stringa.
Ciao
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: alexarmato66 - Maggio 20, 2024, 12:11:21 pm
quindi non degli interi ma stringhe(0001,0002...)?
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: quack - Maggio 20, 2024, 12:26:16 pm
Nel tuo esempio penso che dovresti verificare che anche BCol sia uguale a 0.

Come non detto.
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: bonmario - Maggio 20, 2024, 12:57:33 pm
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:
Codice: [Seleziona]
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.

Uso il metodo che stai usando tu da anni e funziona ... faccio qualcosa di simile anche con le date e gli orari.
Io però gestisco anche l'eventuale "ordinamento inverso" se clicchi 2 volte di fila sulla testata della stessa colonna.
Hai provato a fare un debug e vedere se passa di lì, e se effettivamente fa quello che ti aspetti?

Ciao, Mario
Ciao, Mario
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: alexarmato66 - Maggio 20, 2024, 01:34:50 pm
con questa modifica sembra funzioni:
Codice: [Seleziona]
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;
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: alexarmato66 - Maggio 20, 2024, 01:49:10 pm
La cosa strana è che se salvo il file e poi lo riapro non funziona più
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: alexarmato66 - Maggio 20, 2024, 02:03:30 pm
forse ho risolto.
All'apertura del file ho aggiunto:

Codice: [Seleziona]
StringGrid6.OnCompareCells := @StringGrid6CompareCells; 
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: tito_livio - Maggio 20, 2024, 02:13:36 pm
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:

Codice: [Seleziona]
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;   


Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: bonmario - Maggio 20, 2024, 02:14:58 pm
forse ho risolto.
All'apertura del file ho aggiunto:

Codice: [Seleziona]
StringGrid6.OnCompareCells := @StringGrid6CompareCells; 

Scusa, hai ragione, lo davo per scontato, perché per come faccio io la cosa è automatica, ma non mi ricordavo che andava fatta a mano !!!

Ciao, Mario
Titolo: Re:ColumnClickSorts con le Stringgrid
Inserito da: alexarmato66 - Maggio 20, 2024, 02:39:59 pm
risolto.Cosi ordino sia decrescente che crescente cliccando sull'intestazione:
Codice: [Seleziona]
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;
Titolo: Re:[RISOLTO] ColumnClickSorts con le Stringgrid
Inserito da: bonmario - Maggio 20, 2024, 02:54:49 pm
Non conosco ".SortOrder ", ma visto dove hai messo queste 2 righe,

Codice: [Seleziona]
     // 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