• Advertisement

[Résolu] Casse-tête : positionner un bouton contre une ligne

Tout ce qui concerne la version 10 de windev
**Windev est une marque déposée de Pcsoft**

[Résolu] Casse-tête : positionner un bouton contre une ligne

Messagepar DrWilly » Lun Avr 02, 2007 1:37 pm

Hello tous,

Attention casse-tête !

Le but est de pouvoir afficher un bouton juste à côté d'une ligne sélectionnée dans une table. Jusque là rien de très méchant.
Le problème est que cette table n'a pas de longueur fixe. C'est à dire que sa taille varie en fonction du nombre d'enregistrement qu'elle contient.
Contrainte supplémentaire, cette table doit évidemment stopper sa croissance au bon moment pour ne pas sortir du cadre dans lequel elle se trouve. Lorsqu'elle atteint cette taille maximale, un ascenseur doit apparaître pour permettre de consulter les enregistrements supplémentaires tout en gardant cette taille maximale.

Pour être plus concret, cette table représente un bon d’achat et elle contient les articles que le client compte acheter. Lorsqu’il passe à la caisse, ses article sont scannés et ajouté à la table à chaque fois.

Le bouton qui doit s’afficher à côté de la ligne sélectionnée permet de supprimer l’article voulu.

Image

Voici le code qui me permet d’afficher le bouton à côté de la ligne sélectionnée dans la table. Celui-ci s’exécute lors de la sélection d’une ligne dans cette table donc.

Code: Tout sélectionner
VraiPos est un entier = TableSelect(TABLE_Commande) - (TableOccurrence(TABLE_Commande) - TableHmax)

SI TableOccurrence(TABLE_Commande) > TableHMax ALORS
   FEN_AchatConso.BTN_SupprimeArticle..Y = BtnSupprimeYInit + TableHauteurLigne * VraiPos
SINON
   FEN_AchatConso.BTN_SupprimeArticle..Y = BtnSupprimeYInit+ TableHauteurLigne * TableSelect(TABLE_Commande)
FIN


TableHMax est le nombre maximum de ligne que peut afficher la table simultanément (sans ascenseurs donc)
VraiPos permet de connaître la vraie position de la ligne dans la table, même si celle-ci dépasse sa longueur maximale (apparition des ascenseurs). Pour cela je soustrait le nombre de ligne se trouvant « hors » de la table au table select de la ligne en cours.
BtnSupprimeYInit est la position initiale du bouton supprimer en Y (lorsque la table vaux 1 donc)

Tout marche à merveille avec ce code mais… uniquement lorsque le dernier enregistrement est visible… C’est logique car lorsque l’on remonte vers le haut dans la table avec les ascenseurs, VraiPos n’indique plus du tout la position réelle étant donné que le nombre que je soustrais au table select est le nombre maximum d’enregistrement pouvant se trouver hors de la table !

Comment faire pour savoir ou l’on se trouve dans la table ? Y a-t-il moyen de savoir quand l’utilisateur remonte l’ascenseur de la table ? Ou le descend ? Idem avec la roulette ?

Merci de votre recherche et à bientôt j’espère ![/img]
Dernière édition par DrWilly le Mar Avr 10, 2007 1:20 pm, édité 1 fois.
Avatar de l’utilisateur
DrWilly
Membre
 
Messages: 38
Inscription: Mar Jan 16, 2007 9:31 am

Advertisement

Messagepar WD3000 » Lun Avr 02, 2007 5:35 pm

la position de ton bouton doit etre calculée ainsi

positiony du bouton=positiony de la table+hauteur du titre de la table + (hauteur ligne de table * table) //table étant l'indice de la ligne selectionnée de la table



il ne faut pas s'occuper des lignes non visibles

l'ascenseur de table ne fait pas de sélection de ligne donc c'est bien en sélectionnant ta ligne que tu positionne ton bouton
WD3000
 

Messagepar DrWilly » Mar Avr 03, 2007 9:31 am

Le problème est que le tableselect me renvoie l'indice de la ligne de la table... en comptant les ligne non visible. C'est-à-dire qu'une ligne d'indice 5 peut très bien être la première ligne de ma table si elle est positionnée comme tel via l'ascenseur vertical.

Y a-t-il une fonction qui permet de récuperer l'indice des ligne visible ?
Avatar de l’utilisateur
DrWilly
Membre
 
Messages: 38
Inscription: Mar Jan 16, 2007 9:31 am

Messagepar Samifred » Mar Avr 03, 2007 6:42 pm

Regarde dans l'aide du côté de TableInfoXY()
Cordialement, en espérant que ma collaboration soit profitable. Fred Image
PS: Il est important d'indiquer, dans la question, la version WD utilisée.
Note: Pas de question par MP, merci.
Avatar de l’utilisateur
Samifred
 
Messages: 3550
Inscription: Sam Nov 26, 2005 12:16 pm
Localisation: 128.0.0.0

Messagepar DrWilly » Mer Avr 04, 2007 11:50 am

Effectivement c'est une fonction de ce type que je cherche à utiliser. En effet si je peux connaitre la coordonnée Y d'une ligne de la table au lieu de devoir calculer celle-ci à partir de toutes les action de l'utilisateur, je suis sauvé !

Cependant il me semble que la fonction que tu me propose (TableInfoXY) ne le permet pas...

D'après l'aide TableInfoXY renvoie des informations relatives au tableau en fonction des coordonnées des lignes de celui-ci et non le contraire...
Comment connaitre les coordonnées d'une ligne à partir d'informations du tableau dans ce cas ?

Merci !
Avatar de l’utilisateur
DrWilly
Membre
 
Messages: 38
Inscription: Mar Jan 16, 2007 9:31 am

Messagepar Samifred » Mer Avr 04, 2007 6:03 pm

C'est une table mémoire ou une table fichier ?
Cordialement, en espérant que ma collaboration soit profitable. Fred Image
PS: Il est important d'indiquer, dans la question, la version WD utilisée.
Note: Pas de question par MP, merci.
Avatar de l’utilisateur
Samifred
 
Messages: 3550
Inscription: Sam Nov 26, 2005 12:16 pm
Localisation: 128.0.0.0

Messagepar WD3000 » Mer Avr 04, 2007 8:01 pm

extrait de l'aide
tableselect()
Renvoie l'indice de la ligne sélectionnée dans une table. La ligne sélectionnée correspond à la ligne en cours sur laquelle le bandeau de sélection est affiché.

Par ligne invisible tu entends les lignes qui sont en dehors de la table ?
WD3000
 

Messagepar Samifred » Mer Avr 04, 2007 9:39 pm

Code: Tout sélectionner
VraiPos est un entier = TableSelect(TABLE_Commande) - (TableOccurrence(TABLE_Commande) - TableHmax)

SI TableOccurrence(TABLE_Commande) > TableHMax ALORS
   FEN_AchatConso.BTN_SupprimeArticle..Y = BtnSupprimeYInit + TableHauteurLigne * VraiPos
SINON
   FEN_AchatConso.BTN_SupprimeArticle..Y = BtnSupprimeYInit+ TableHauteurLigne * TableSelect(TABLE_Commande)
FIN


Ton code fonction très bien (si dans la description/détail/paramètres ascenseurs), tu décoche ascenseur proportionnel
et ascenseur vertical sur automatique

Code sans variable:
Code: Tout sélectionner
PosBandeau est un entier = TableSelect(Table_Produits) - (TableOccurrence(Table_Produits) - Table_Produits..HauteurMax)

SI TableOccurrence(Table_Produits) > Table_Produits..HauteurMax ALORS
   Fen_produits.BTNSupp..Y = BTNSupp..YInitial + Table_Produits..HauteurLigne * PosBandeau
SINON
   Fen_produits.BTNSupp..Y = BTNSupp..YInitial+ Table_Produits..HauteurLigne * TableSelect(Table_Produits)
FIN
Cordialement, en espérant que ma collaboration soit profitable. Fred Image
PS: Il est important d'indiquer, dans la question, la version WD utilisée.
Note: Pas de question par MP, merci.
Avatar de l’utilisateur
Samifred
 
Messages: 3550
Inscription: Sam Nov 26, 2005 12:16 pm
Localisation: 128.0.0.0

Messagepar DrWilly » Mar Avr 10, 2007 7:51 am

Il s'agit d'une table mémoire mais je ne pense pas vraiment que cela fasse de différence.
J'ai effectivement décoché ascenseur proportionnel et mis ascenseur vertical sur automatique mais malheureusement le problème est toujours le même...

Ce code n'est pas du tout satisfaisant pour la simple et bonne raison qu'il ne fait pas de différance entre les lignes hors de la table au dessus et en dessous de celle-ci. Je veux dire par la que tout marche niquel uniquement à partir du moment où, si l'ascenseur vertical est apparu, l'on se trouve sur le dernier enregistrement de la table.

Expliquons en detail le code pour mieux comprendre. Le problème se situe ici :

Code: Tout sélectionner
VraiPos est un entier = TableSelect(TABLE_Commande) - (TableOccurrence(TABLE_Commande) - TableHmax)


TableHMax est bien egal au nombre maximum que peux contenir la table (si le nombre d'enregistrements que doit contenir la table exède ce nombre, l'ascenseur vertical apparait sinon la table sortirait disgracieusement du cadre ou elle se trouve sur la fenêtre)

VraiPos devrait me renvoyer la position en Y réèle de la ligne selectionnée et ce même si l'ascenseur vertical est apparu ce qui fausse la fonction tableselect (en effet celle-ci me renvoie l'indice de l'enregistrement dans la table même si celui-ci n'est pas visible car hors de la table)

VraiPos est calculé en soustrayant à l'indice de l'enregistrement selectionné le nombre d'enregistrement hors table. Ainsi pour connaitre le numero de la ligne selectionnée contenant par exemple l'enregistrement d'indice 7 (connu grace à tableselect), je calcule qu'il y a 3 enregistrement hors de la table (TableOccurrence(TABLE_Commande) - TableHmax) donc 7 - 3 est égal à 4, c'est bien de la quatrième ligne qu'il s'agit ! Je n'ai plus qu'a multiplier la hauteur d'une ligne à ce nombre (en ajoutant la hauteur de la table au préalable) pour obtenir la position en Y réèle de cette ligne.

...mais ca ne marche pas tout le temps !!

En effet, il est très possible que dans les 3 enregistrements hors table, 1 soit au dessus et 2 en dessous de celle-ci dans le cas ou j'aurais utilisé l'ascenceur pour me balader au milieu de la table !

Dans ce cas la ligne selectionnée n'est pas du tout la quatrième mais plutot (7 - 1) la sixième !

Bref le code calcule uniquement le nombre d'enregistrement hors table, et non le nombre d'enregistrement a soustraire pour obtenir le vrai numero de ligne...

Cette methode ne marche pas... Ai-je été assez clair ? Quelqu'un à une idée pour règler ce problème ?
Merci beaucoup ! la résolution de ce problème est importante pour la bonne marche de mon projet dont l'echeance arrive bientot à son terme !
Avatar de l’utilisateur
DrWilly
Membre
 
Messages: 38
Inscription: Mar Jan 16, 2007 9:31 am

Messagepar DrWilly » Mar Avr 10, 2007 1:18 pm

Trouvé !

L'astuce était d'utiliser la fonction TablePosition(MaTable) qui permet de renvoyer l'indice de la première ligne de la table !
A partir de la il est aisé de corriger le code qui devient :

Code: Tout sélectionner
VraiPos est un entier = TableSelect(TABLE_Commande) - (TablePosition(TABLE_Commande) - 1)


Reste un petit bug quand à l'utilisation de la roulette souris quand semble être toujour un peu en retard... Enfin ca doit être corrigeable facilement.

Merci a tous pour votre aide !
Avatar de l’utilisateur
DrWilly
Membre
 
Messages: 38
Inscription: Mar Jan 16, 2007 9:31 am



  • Advertisement

Retourner vers Forum Windev 10

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités