[algo] tri de composants sur une fiche Delphi

tri de composants sur une fiche Delphi [algo] - Programmation

Marsh Posté le 03-01-2002 à 09:51:59    

voilà, je suis à la recherche d'un algo de tri de composants insérés dynamiquement sur une fiche d'un prgm écrit en Delphi. Je voudrais les trier sur 2 critères : tout d'abord leur propriété top puis leur propriété left, le but étant à la fin, d'avoir une liste de ces composants dans l'ordre de leur position sur la fiche de haut en bat de gauche à droite. Mon pb est dû aux composants label placé avant un autre composant (genre TEdit ou TMemo) : en effet, bien que leur propriété left soit < à celle des autres composants situés après, il sera clasé dans la liste après eux à cause de sa propriété top qui est légèrement supérieure :(
 
    Je em suis donc orianté vers le centre de gravité mais, là encore, ça ne marche pas à tout les coups (mais ça marche mieux)...
 
    Alors, est-ce-que qq'un aurait déjà implémenté ce genre d'algo svp? Merci :)

Reply

Marsh Posté le 03-01-2002 à 09:51:59   

Reply

Marsh Posté le 03-01-2002 à 09:53:32    

je précise que la finalité de ce tri, c'est de pouvoir générer du code html pour créer des formulaires de manière graphique (et surtout, WYSIWYG)...

Reply

Marsh Posté le 03-01-2002 à 14:07:03    

up :)

Reply

Marsh Posté le 04-01-2002 à 09:45:48    

help! C'est vraiment important...

Reply

Marsh Posté le 05-01-2002 à 09:58:50    

alors, personne ne peut m'aider? snif :(

Reply

Marsh Posté le 05-01-2002 à 11:45:08    

j'aimerais bien t'aider, mais je sais pas trop comment...
peut etre en comparent la différence top/left/width du label par rapport à l'edit...
genre si label.top - edit.top < edit.left - label.left et que edit.left - label.left est pas bcp plus grand que label.width tu peux déterminer que le label doit être mis avant l'edit...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-01-2002 à 13:29:07    

si j'ai bien compris ça n'a rien à voir avec delphi ton truc, donc tu écartes pas mal de monde vu le titre de ton topic.
 
le problème c'est donc trier en fonction d'une propriété, et une fois ce tri effectué, faire un nouveau tri pour trier suivant une seconde propriété. donc si tu as disons des objets dont les propriétés ressemblent à  
 
1 4  
2 3
3 1
2 9
1 3
1 5
2 5
3 22
3 5
 
tu veux obtenir un tri suivant la première propriété puis la deuxième pour avoir :  
 
1 3
1 4
1 5
2 3
2 5
2 9
3 1
3 5
3 22
 
c'est bien ça ?
 
tout d'abord, tu utilises n'importe quel algo de tri (comme quicksort) pour trier suivant la première propriété. tu obtiens donc un truc trié suivant la première propriété, mais pas la deuxième :
 
1 4  
1 3
1 5
2 3
2 9
2 5
3 5
3 1
3 22
 
ensuite, il suffit de parcourir ton tableau et de trier par sous catégorie : tu regardes la première valeur, c'est 1, tu continues jusqu'à ce que tu tombes sur 1, tu isoles les valeurs suivantes :
 
1 4  
1 3
1 5
 
tu fais un quicksort sur ce sous ensemble pour obtenir
 
1 3
1 4
1 5
 
tu continues sur le tableau principal pour isoler la prochaine séquence :
 
2 3
2 9
2 5
 
tu tries le sous ensemble :
 
2 3
2 5
2 9
 
etc ...

 

[edtdd]--Message édité par youdontcare--[/edtdd]

Reply

Marsh Posté le 06-01-2002 à 10:14:34    

youdontcare a écrit a écrit :

si j'ai bien compris ça n'a rien à voir avec delphi ton truc, donc tu écartes pas mal de monde vu le titre de ton topic.
 
le problème c'est donc trier en fonction d'une propriété, et une fois ce tri effectué, faire un nouveau tri pour trier suivant une seconde propriété. donc si tu as disons des objets dont les propriétés ressemblent à  
 
1 4  
2 3
3 1
2 9
1 3
1 5
2 5
3 22
3 5
 
tu veux obtenir un tri suivant la première propriété puis la deuxième pour avoir :  
 
1 3
1 4
1 5
2 3
2 5
2 9
3 1
3 5
3 22
 
c'est bien ça ?
 
tout d'abord, tu utilises n'importe quel algo de tri (comme quicksort) pour trier suivant la première propriété. tu obtiens donc un truc trié suivant la première propriété, mais pas la deuxième :
 
1 4  
1 3
1 5
2 3
2 9
2 5
3 5
3 1
3 22
 
ensuite, il suffit de parcourir ton tableau et de trier par sous catégorie : tu regardes la première valeur, c'est 1, tu continues jusqu'à ce que tu tombes sur 1, tu isoles les valeurs suivantes :
 
1 4  
1 3
1 5
 
tu fais un quicksort sur ce sous ensemble pour obtenir
 
1 3
1 4
1 5
 
tu continues sur le tableau principal pour isoler la prochaine séquence :
 
2 3
2 9
2 5
 
tu tries le sous ensemble :
 
2 3
2 5
2 9
 
etc ...  
 
 




 
merci, mais c'est pas exactement ça que je veux car il y a une troisième prpriété de tri : le type d'objet. Dans le cas d'un TLabel qui se trouve juste à la gauche d'un TEdit ou d'un tout autre objet, on place le TLabel avec l'objet suivant, même si son Top est supérieur au Top de l'autre objet... C'est là que réside la difficulté...

Reply

Marsh Posté le 06-01-2002 à 10:18:08    

rufo a écrit a écrit :

merci, mais c'est pas exactement ça que je veux car il y a une troisième prpriété de tri : le type d'objet. Dans le cas d'un TLabel qui se trouve juste à la gauche d'un TEdit ou d'un tout autre objet, on place le TLabel avec l'objet suivant, même si son Top est supérieur au Top de l'autre objet... C'est là que réside la difficulté...


tu pourrais donner un screenshot qui montre le problème ? je suis pas sûr de voir ...
mais si c'est bien ce que je pense :D, la méthode bourrin serait de trier avec une précision inférieure : ie si ton label a y = 42 et l'edit à côté à y = 40, tu divises tout ça par ... 4, ou par 8, pour obtenir des coordonnées entières qui seront identiques. et ton tri marchera.

Reply

Marsh Posté le 06-01-2002 à 10:21:58    

youdontcare a écrit a écrit :

tu pourrais donner un screenshot qui montre le problème ? je suis pas sûr de voir ...
mais si c'est bien ce que je pense :D, la méthode bourrin serait de trier avec une précision inférieure : ie si ton label a y = 42 et l'edit à côté à y = 40, tu divises tout ça par ... 4, ou par 8, pour obtenir des coordonnées entières qui seront identiques. et ton tri marchera.  




 
à ça c'est pas con :D je vais essayer de mettre en ligne un screenshot...

Reply

Marsh Posté le 06-01-2002 à 10:21:58   

Reply

Marsh Posté le 06-01-2002 à 10:26:51    

http://perso.libertysurf.fr/chris.jav/screenshot.jpg

 

[edtdd]--Message édité par rufo--[/edtdd]

Reply

Marsh Posté le 06-01-2002 à 10:32:08    

donc, je veux que mes composants soient dans le même ordre dans la liste que sur l'écran, de haut en bas et de gauche à droite...

Reply

Marsh Posté le 06-01-2002 à 10:34:32    

ok, bah essaye déjà de trier avec une plus petite précision.
 
sinon, tu sais qu'on peut positionner les éléments html de façon absolue ou relative (par rapport au parent) ? :D ça pourrait t'éviter tout ça ...

Reply

Marsh Posté le 06-01-2002 à 13:35:53    


 
bhouuuu le moche screenshot en jpeg :p
PNG la prochaine fois mon gars ;)
 
(je sais c'est hors-sujet comme à chaque fois que je le dis, mais bon je milite pour les screenshots en PNG)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 06-01-2002 à 14:52:42    

youdontcare a écrit a écrit :

ok, bah essaye déjà de trier avec une plus petite précision.
 
sinon, tu sais qu'on peut positionner les éléments html de façon absolue ou relative (par rapport au parent) ? :D ça pourrait t'éviter tout ça ...  




 
comment ça?... un exemple svp :)

Reply

Marsh Posté le 06-01-2002 à 15:39:21    

rufo a écrit a écrit :

comment ça?... un exemple svp :)


http://www.w3.org/TR/REC-CSS2/
 
http://www.w3.org/TR/REC-CSS2/visuren.html
d'ailleurs j'ai confondu :D
 
lorsque tu écris un élément en html (comme <p>mon paragraphe !</p> ), il est positionné statiquement dans la page. tu peux lui donner une position absolue (par rapport au premier parent lui-même positionné en absolu) ou une position relative à la position qu'il occupe statiquement.
 
ie  
 
<p style='position: relative; top: 10px; left: 10px'>....</p>
 
le paragraphe sera décalé de 10 pixels en bas et vers la droite par rapport à sa position initiale.
 
quand tu remplaces 'relative' par 'absolute', la position est absolue par rapport au premier élément parent dont la position est elle aussi absolue.
 
donc si tu fais :
 
<p style='position: absolute; top: 10px; left: 10px'>....</p>
 
ton paragraphe, même s'il est au milieu de la page, se retrouvera tout en haut du document, décalé de 10 pixels en bas et vers la droite.
 
maintenant, ce que tu peux faire, c'est positionner les éléments absolument par rapport à leur parent dans ton formulaire, n'est-ce pas ? il suffit donc de leur donner exactement les mêmes positions & tailles (style='width ... & co';) et de positionner absolument ton formulaire.
 
et si tu ne sais pas comment positionner ton formulaire, tu le fais au chargement de la page, en récupérant par ex la position de l'élément situé juste avant la position où tu veux l'insérer.
 
et hop.

Reply

Marsh Posté le 06-01-2002 à 21:37:21    

oui, effectivement, c'est une solution, mais ça fait quand même pas mal de code en plus... Mais, bon, je la garde sous le coude en attendant de trouver mieux. Merci en tout cas. :)

Reply

Marsh Posté le 08-01-2002 à 21:45:37    

je suis toujours preneur si qq'un a une suggestion... :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed