IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Comportement bizarre du tri dans un TStringGrid [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Comportement bizarre du tri dans un TStringGrid
    Bonjour à toutes et à tous,

    Dans un TStringGrid, j'ai 4 lignes de 7 colonnes. Une des colonnes représente des valeurs numériques.

    Lorsque je fais un tri (en cliquant sur la ligne fixe) basé sur la colonne représentant des nombres, j'obtiens les résultats suivants :

    Dans un sens :

    550
    500
    1200
    1050

    et dans l'autre :

    1050
    1200
    500
    550

    Moi pas comprendre

    et vous ?

    Y a-t-il un moyen d'utiliser un autre type de comparaison que celui par défaut ? Je l'avais fait pour un TDrawGrid, mais apparemment, je n'arrive pas à l'appliquer au TStringGrid.

    Cordialement.

    Pierre.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Une StringGrid contient des chaînes, et le tri de base se fonde sur leur valeur ASCII.
    Il faut ici lui demander de trier la colonne en lui fournissant la procédure de comparaison adaptéee, style MyGrid.Columns[i].Sort(MySortCallBack) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function MySortCallBack(item1, item2: string): integer;
    begin
      Result := item1.ToInteger - item2.ToInteger;
      // if MySens = msDesc then Result := -Result;
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Une StringGrid contient des chaînes, et le tri de base se fonde sur leur valeur ASCII.
    Il faut ici lui demander de trier la colonne en lui fournissant la procédure de comparaison adaptéee, style MyGrid.Columns[i].Sort(MySortCallBack) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function MySortCallBack(item1, item2: string): integer;
    begin
      Result := item1.ToInteger - item2.ToInteger;
      // if MySens = msDesc then Result := -Result;
    end;
    Merci tourlourou pour cette proposition. Pour autant, "MyGrid.Columns[i]", si MyGrid est du type TStringGrid, ne possède pas de fonction "Sort" (c'est "TStringList" qui en possède une) et je ne vois pas où introduite la fonction Callback.

    Cordialement.

    Pierre.

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    Exact, désolé...

    En fait, il y a un autre mécanisme prévu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    procedure TForm1.MyCompareCells(Sender: TObject; ACol, ARow, BCol,BRow: Integer; var Result: integer);
    begin
      with TStringGrid(Sender) do
        Result := Cells[ACol, ARow].ToInteger - Cells[BCol, BRow].ToInteger;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    const
      Last = 10;
    var
      i: integer;
    begin
      Randomize;
      StringGrid1.ColCount := 2;
      StringGrid1.RowCount := Last;
      for i := 0 to Last-1 do begin
        StringGrid1.Cells[0, i] := (Random(100)+1).ToString;
        StringGrid1.Cells[1, i] := StringGrid1.Cells[0, i];
      end;
      StringGrid1.OnCompareCells := @MyCompareCells;
      StringGrid1.SortColRow(True, 1);
    end;
    Seul problème : il doit trier les chaînes pointées, et comme identiques, il ordonne les 2 colonnes !
    Ce qu'il ne fait pas avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      i, j: integer;
    begin
      Randomize;
      StringGrid1.ColCount := 2;
      StringGrid1.RowCount := Last;
      for i := 0 to Last-1 do begin
        j := Random(100)+1;
        StringGrid1.Cells[0, i] := j.ToString;
        j := Random(100)+1;
        StringGrid1.Cells[1, i] := j.ToString;
      end;
    Ou alors, j'ai encore mal compris quelque chose
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    ...
    Je ne sais pas si ce que tu me proposes va résoudre mon problème car il met en jeu deux colonnes. Il est certainement possibles de l'étendre à plusieurs colonnes ...

    En effet, sur la base des valeurs (numériques ou alphanumériques) d'une seule colonne, il faut que ce soit les lignes entières qui soient réordonnées.

    J'ai trouvé cette procédure sur la toile (je ne sais plus où), que j'ai mise à mon goût et qui remplit la tâche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TLesArticles.ListingHeaderClick(Sender: TObject; IsColumn: Boolean;
      Index: Integer);
    var
      x, y, z: Integer;
      tmpstr: string;
    begin
      if (Index = 0) or (Index = 2) then             {Tri sur N° ordre et sur Prix}
        with Listing do
        begin
          for x:= 1 to RowCount-1 do
            for y:= 1 to RowCount-x-1 do
              if ((SortOrder = soDescending) and (strtoFloat(Cells[Index, y]) > strtoFloat(Cells[Index, y+1])))
              or ((SortOrder = soAscending) and (strtoFloat(Cells[Index, y+1]) > strtoFloat(Cells[Index, y]))) then
                for z:= 0 to ColCount-1 do // Toutes les colonnes sont réordonnées
                begin
                  tmpstr:= Cells[z, y];
                  Cells[z, y]:= Cells[z, y+1];
                  Cells[z, y+1]:= tmpstr;
                end;
        end;
    end;
    Cette procédure est appelée en cliquant sur la ligne fixe (où j'ai mis mes titres) et la colonne souhaitée. Dans mon cas, seules les colonnes 0 et 2 sont des valeurs numériques.

    Si je clique sur les en-têtes des colonnes alphanumériques, cette procédure n'est pas exécutée et le tri est fait selon la protocole interne au TStringGrid.

    Ce que je suppose est que lorsque je clique sur une colonne à valeurs numériques, le protocole interne est exécuté, mais suivi du mien qui remet les choses comme je le souhaite.

    Cordialement.

    Pierre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] comportement bizarre dans script
    Par zemadmat dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/02/2017, 13h04
  2. [Python 3.X] canavas dans fonction - PhotoImage - comportement bizarre
    Par theboubs dans le forum Tkinter
    Réponses: 5
    Dernier message: 24/04/2016, 21h47
  3. Comportement bizarre dans dll
    Par popo dans le forum C#
    Réponses: 4
    Dernier message: 18/06/2012, 09h21
  4. [Flex4] Doublons dans datagrid = comportement bizarre..
    Par baobab95 dans le forum Flex
    Réponses: 3
    Dernier message: 04/04/2012, 17h32
  5. Comportement bizarre dans POI
    Par bruno.wiesen dans le forum Documents
    Réponses: 1
    Dernier message: 23/05/2007, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo