Tri dans une stringgrid [Résolu]

manytime 23 Messages postés mercredi 18 janvier 2006Date d'inscription 2 avril 2008 Dernière intervention - 1 févr. 2006 à 10:07 - Dernière réponse : CaineDev 2 Messages postés mardi 29 août 2006Date d'inscription 30 août 2006 Dernière intervention
- 30 août 2006 à 07:42
salut.
Je souhaite faire un tri par ordre alphabétique sur la première colonne de ma stringgrid. besoin d'aide! Merci à tous.
Afficher la suite 

Votre réponse

5 réponses

cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 1 févr. 2006 à 23:03
+3
Utile
Solution proposée :
1- Pour permettre l'accès à une méthode protégée de la classe TStringGrid, nous déclarons une pseudo classe héritant de TStringGrid :
type
  THackedGrid =   class (TStringGrid);

2- Nous déclarons une méthode (ou une procédure, au choix) :
<CODE>procedure TForm1.SortStringGrid(AGrid: TStringGrid; SortCol: integer);
var
  i, J: integer;
begin
with AGrid do
//contr&#244;ler que la colonne &#224; trier est dans les limites
if (SortCol > FixedCols) and (SortCol < = ColCount) then
for i :=  FixedRows  to  RowCount - 2do
for j : = i + 1to RowCount - 1do
//comparaison non sensible &#224; la casse
if AnsiCompareText(Cells[SortCol, i], Cells[SortCol, j]) > 0then
//permuter les deux lignes
            THackedGrid(Agrid).RowMoved(j, i);
end;


</CODE>Le principe est celui du tri à bulles. Le principal intérêt est l'utilisation de la méthode RowMoved à laquelle nous accédons après avoir transtypé le composant TStringGrid en THackedStringGrid.
A noter aussi que le code ci-dessus ignore les colonnes et les lignes fixes et ne trie que les cellules censées avoir un contenu significatif.

3- L'utilisation devient alors simple :
procedure TForm1.btnSortStringGridClick(Sender: TObject);
begin
  SortStringGrid(StringGrid1, StrToIntDef(Edit1.Text, 1));
end;

Donc, si tu décides de changer de colonne à trier, il suffira de faire varier le deuxième paramètre.

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
TheShAmAn 148 Messages postés lundi 3 février 2003Date d'inscription 1 février 2006 Dernière intervention - 1 févr. 2006 à 21:23
0
Utile
Et bien si ton résultat viens d'une requete, tu peux tout simplment rajouter un ORDER BY dans celle ci.

Sinon, je crois qu'il y a une source qui explique comment trier un stringgrid.

Voila Voilou
Commenter la réponse de TheShAmAn
CaineDev 2 Messages postés mardi 29 août 2006Date d'inscription 30 août 2006 Dernière intervention - 29 août 2006 à 22:12
0
Utile
Bonjour, je profite du topic, car si je n'ai pas un problème de tri, j'ai un problème de déplacement de ligne.
Malgrè les propriétés goEditing,goRowMoving.misent à true, je n'arrive pas à déplacer les lignes dans la grilles par code (non par la souris).

Et pour simplifier (ironie), RowMoved n'est pas connu dans le composant (D6 Personnel).

Faut-il obligatoirement dérivé d'un TStringGrid pour accéder à cette méthode?

Merci de vos réponses.
Commenter la réponse de CaineDev
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 29 août 2006 à 23:06
0
Utile
Bonjour CaineDev,

En déclarant une classe dérivant de TStringGrid dans l'unité où tu as besoin d'accéder à des méthodes "protected", alors tu peux accéder à ces méthodes. C'est ce que démontre le code que j'ai donné ci-desssus.
C'est une méthode un peu limite par rapport aux bonnes manières de la POO mais ça rend parfois bien service.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
CaineDev 2 Messages postés mardi 29 août 2006Date d'inscription 30 août 2006 Dernière intervention - 30 août 2006 à 07:42
0
Utile
Merci pour ta rapidité de réponse.

J'avais espoir (maigre) que cette méthode ne soit pas "protected", l'aide n'en faisant pas mention.

Le hic c'est que le composant est créé sur la fiche, donc il faudrait que je dérive la classe et que j'installe le composant.

C'est quand même une sacré limitation du TStringGrid je trouve!

Heureusement que je n'ai pas d'obkets stockés, je vais opter pour une échange des propriétées "text" des lignes.

Ha ce TStringGrid, tout ce qu'il faut faire pour rendre son utilisation ergonomique!

Bonne journée.
Commenter la réponse de CaineDev

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.