Windev : carré de sélection dans table

Bon alors, j’ai une table. Dans cette table, je cherche à reproduire le mode de sélection des fichiers présent dans l’explorateur windows. C’est à dire que je veux pouvoir tracer un rectangle de sélection qui, après avoir relâché le bouton de la souris, délimite les enregistrements de la table qui seront sélectionnés. Je pense que c’est faisable en interceptant les évènemements souris sur la table et en utilisant un champs image (champs image en magenta pour qu’on puisse voir la table sous la sélection, avec, à priori, uniquement un cadre extérieur) :

  1. clic sur table -> je mets en mémoire les coordonnées de la souris
  2. tant que bouton appuyé, je change les coordonnées et les dimensions de mon champ image afin qu’un des coins de mon image ait les coordonnées de départ de mon clic (étape 1), et que le coin opposé ait les coordonnées de ma position souris actuelle.
    3)bouton relâché : J’en viens à ma question : comment savoir quels enregistrements sont survolés ?

Je pense avoir un début de solution en procédant ainsi : j’ai les coordonnées haut gauche de l’image, et j’ai les coordonnées de la table. Sachant qu’on peut connaitre la hauteur d’une ligne de la table (…HauteurLigne), ma ligne la plus haute sélectionnée sera la ((SourisY-Table.Y)/HauteurLigne)ème. Mais le problème est que c’est la Xème des enregistrements affichés, pas de la table. Comment donc retrouver l’indice de cette ligne ?

Si vous avez d’autres suggestions pour simuler le rectangle de sélection ou des conseils pour améliorer ma méthode, je suis carrément preneur. Si ça ne fait pas appel aux évènements de survol/souris c’est le paradis.

Il faudrait que tu nous dises sous quelle version de Windev tu es, car entre la 5.5b et la 7.5 (voir 8 mais j’ai pas eu le temps de la tester) il y a pas mal de différence, rien que dans la gestion des evenements et des champs images.

Ah oui, pardon, 7.5

Je n’ai pas testé non plus de 8.0

Je ne t’oublie pas, je matte ca dans l’apres-midi entre deux réunions ou deux requetes SQL. Je te fais une réponse détaillée d’ici là sauf si tu as plus besoin de moi
Ce message a été édité par Donjohn le 10/02/2004

Ok, merci.

Intéressante alternative; je pensais à ça au début mais je me disais que l’image étant au premier plan, on clique sur l’image et pas sur la table, et donc il n’y a pas de ligne sélectionnée. Mais c’est vrai que je peux retrouver l’info en utilisant la méthode ((SourisY-Table.Y)/HauteurLigne).
Je pense que ta méthode est la meilleure parce que plus souple sur la forme que peut prendre la rectangle de sélection (je pourrais faire du pointillé par exemple, ou carrément du pontillé en mouvement). Par contre, je me demande si je ne vais pas avoir un effet de clignotement dû à l’effacement du champs image puis au traçage du nouveau cadre à chaque mouvement de la souris (tu as peut-être déjà constaté aussi ce phénomène de clignotement sur certaines cartes graphiques lorsque tu réaffiches à intervalles rapides une image contenant du magenta, en particulier en cas de superposition de champs ?)
En tout cas, faut tester; je vais voir ça ce soir.

A propos du problème du Xeme élément :

On a une table vide, avec une hauteur permettant d’afficher 20 lignes simultanémment.

On lui ajoute 60 lignes. Si je clique sur la 14eme, je peux dire que j’ai cliqué sur la 14eme uniquement avec la position de ma souris en appliquant le ((SourisY-Table.Y)/HauteurLigne). Ok.
Maintenant, on scrolle légèrement dans la table vers le bas. Admettons qu’on voit maintenant dans la table les lignes 8 à 27. La méthode ((SourisY-Table.Y)/HauteurLigne) n’est plus valable puisqu’elle va bien nous renvoyer l’indice de la table relativement à la première ligne visible, et non pas à la première ligne de la table. Or, on ne peut pas savoir l’indice de la première ligne visible d’une table (ou alors je ne sais pas faire)

Je ne peux malheureusement pas t’envoyer le projet, c’est un truc sur lequel je bosse chez moi et je n’ai pas encore le net là-bas (déménagement inside), mais merci quand même

Il faut deja que tu mettes ta table en selection multiple. Ensuite tu met bien le champ image au dessus de ton champ table, couleur magenta pour la transparence.

Bon quand on a ca.
Click souris, detection de la ligne en cours, selection par programmation de la ligne. (n’oublie pas de gérer le cas ou on ne click pas sur une ligne de table remplie). elle sera vu selectionné par transparence du champ image.
Deplacement de la souris, le cadre s’agrandit (c’est ca qui risque de faire flasher ton champ, je suis entrain de voir comment faire pour eviter ca), et à chaque fois que ton deplacement en hauteur de ta souris depasse le modulo de ta hauteur de ligne, tu selectionne le suivant (haut ou bas). Utilise les zones memoires, c’est tres partique pour stocker ce style d’infos.

Pour ton probleme de Xeme ligne, je ne vois aps trop où est le probleme (dtc proof). Car si tu stocke le premier element clické dans une zone mémoire et que tu selectionne par programmation la table,  meme si tu scroll tu sais où tu en es et les lignes selectionnées correspondront à l’intervalle enter le ClickonMouse (indice stocké dans zonemem)et le relachage (j’ai oublié le nom de l’evenement là tout de suite ).

Tu es sur de pas pouvoir mettre ton projet sur CD et de me l’envoyer par mail sur CD, il dopit pas étre gros si tu as pas d’analyse ou autre…? (mail dispo dans mon profil)

Edit : attends je comprends pas un truc, tu fait ca avec une table fichier ??? car avec une table memoire, l’indice de la ligne correspond à l’indice de la table totale et non des lignes affichés…
Ce message a été édité par Donjohn le 10/02/2004

(Mon chef vénéré, puits sans fond de sagesse infinie vient de trouver l’astuce pour connaitre l’indice de la premiere ligne visible : on met un IndiceEnCours() dans le code d’affichage d’une ligne de la table. (On obtient à la fin l’indice de la dernière ligne, mais on peut bien sûr revenir sans problème à la première, en y soustrayant le nombre de lignes visibles de la table))

Ouais… j’aurais appellé le nom de la table tout simplement, ca renvoie l’indice de la ligne selectionnée, ou alors on se comprends vraiment pas (cf mon edit )
Ce message a été édité par Donjohn le 10/02/2004

Je pense que le problème du Xème se pose car on ne clique pas réellement sur la table; on clique sur le champs image : même si ton image est en magenta, c’est elle qui va intercepter le clic, et la ligne de la table ne sera pas sélectionnée. On a donc alors besoin de savoir sur quelle ligne on se trouve (pour simuler une sélection de la ligne) avec pour seule information les coordonnées de la souris au moment du clic.

Je t’enverrais bien le CD mais il s’agit d’un projet de shareware sur lequel je bosse depuis beaucoup -trop- de temps et pour lequel j’ai pas mal d’ambition, et je préferais que personne ne le voit avant qu’il soit en phase de test. (Ce n’est sincèrement pas un manque de confiance en toi, mais j’ai décidé d’être systématique quant au refus de montrer la bête avant l’heure)

[quote]Ouais… j’aurais appellé le nom de la table tout simplement, ca renvoie l’indice de la ligne selectionnée, ou alors on se comprends vraiment pas (cf mon edit )
Ce message a été édité par Donjohn le 10/02/2004[/quote]Ah ok, voilà où on ne s’est pas compris. Je parle bien de la première ligne visible de la table, et non pas de la première ligne de la table ou de la ligne sélectionnée

Ce message a été édité par Arkhatope le 10/02/2004

Ak, ca y est je pige (c’est pas facile de se comprendre ). Je comprends pourquoi ton gourou t’as dit de mettre IndiceEnCours(). Car le code d’affichage d’une ligne s’execute seulement quand la ligne apparait à l’ecran. Ce qui permet de savoir qu’elle est la derniere ligne affichée (tu stock ca dans une variable). Par contre en fonction du scroll up ou down, tu auras l’indice de la premiere ou derniere ligne. Donc faut jongler avec ca. Ensuite c’est pas grave que tu click sur le champ image au lieu du champ table, tu peux selectionner par programmation une ligne de table (TableSelectPlus()), en fonction de ta hauteur de ligne et de ta position de souris (j’utiliserais plus de distance parcourue par la souris apres le premier click). Si tu as besoin d’autres précision, je jetterais un oeil à ce thread dans l’apres midi, réunion powah là

PS : pour les sources, pani pwoblem

[quote]Donjohn a dit:


 tu peux selectionner par programmation une ligne de table (TableSelectPlus()), en fonction de ta hauteur de ligne et de ta position de souris (j’utiliserais plus de distance parcourue par la souris apres le premier click).[/quote]Bon, finalement ça ne marche pas : On ne passe dans le code d’affichage que lorsque on affiche une ligne qui n’a pas déjà été affichée. Donc : ca marche tant que tu scrolles vers le bas, mais dès que tu scrolles vers le haut, tu ne passes plus par ce code.

Je me demande si tu as bien compris ce qui pose problème : je ne peux pas utiliser TableSelectPlus() puisque je ne sais pas l’indice de la ligne (et c’est bien trouver l’indice de la ligne, le problème) que je survole lors de mon clic (et que je ne clique pas dessus puisque je clique sur l’image qui lui est superposée). Et comme la première ligne visible de ma table n’est pas forcément la première ligne de ma table, je ne peux pas faire simplement le calcul ((SourisY-Table.Y)/HauteurLigne)…

En bref : l’image est sur la table. Donc, on ne peut pas cliquer “sur” la table, et donc on ne peut pas sélectionner de lignes de la table. Et donc, je ne peux savoir l’indice de la ligne sur laquelle je clique. Et donc je suis obligé de calculer (on est d’accord) que c’est la Xeme des lignes affichées par rapport aux coordonnées souris. Le problème est que la première ligne affichée d’une table n’est pas forcément la première ligne de la table (dans le cas où le nombre de lignes est supérieur au nombre de lignes affichables et que j’ai scrollé vers le bas)

Comment remplis tu ta table ?? (j’y reflechis là, je pige tout now, on en a mis du temps, ca doit etre moi )

Par une simple boucle de tableajoute (ce n’est pas une table fichier si c’est ce que tu souhaites savoir)

Ce qui me bouffe avec ce problème, c’est que windev est capable de trouver cette info : quand tu scrolles dans une table à partir de la 7.0, tu as un info bulle sur l’ascenseur qui te donne ta position dans la table (genre 700-710 sur 1000)
Ce message a été édité par Arkhatope le 10/02/2004

Autre idee rapide : gérer le scroll à la mano et non en automatique, ca te permetteras de detecter le nombre de scroll down ou up que tu as effectué.

Au final, je pense, à défaut d’autre solution, que je vais garder la méthode que j’exposais dans mon premier post.
 Le fait que l’image soit superposée à la table me bloque trop pour d’autres trucs (je ne peux plus faire de menus contextuels dans la table sur clic droit par exemple). De plus, je n’aurai pas le problème de déterminer l’indice sur lequel je clique puisque je cliquerai directement dans la table.
Enfin, je pense que j’aurai beaucoup moins de problèmes d’affichage en me contentant d’afficher une image étirée plutôt que dessiner et réafficher.
Pour trouver la ligne sur laquelle je relâche le bouton, je vais simuler un clic souris -> la dernière ligne de ma sélection est sélectionnée -> je sélectionne tout de mon premier clic à celle-ci.