PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → [WD14] ScrollBar et Table
[WD14] ScrollBar et Table
Débuté par nicojail, 21 jan. 2009 19:09 - 14 réponses
Posté le 21 janvier 2009 - 19:09
Bonjour

Le libellé avec animation ne me convenant pas (impossible de modifier la taille du texte, la couleur... pour une ligne spécifique), je m'oriente sur une table gérée par programmation.

Cette table doit faire défiler toutes ses lignes (verticalement) automatiquement (sans action clavier, ni souris).

L'utilisation de la commande TablePosition, ne me satisfait pas non plus car il y a une sorte de saccadement.

Afin d'avoir un déplacement plus fluide, je me suis donc orienté vers les API GetScrollPos, GetScrollRange, et SetScrollPos pour déplacer le curseur de la ScrollBar, tout fonctionne, sauf que le contenu de la table ne suit pas...

Pourriez vous m'orienter sur les évènements manquants?

En vous remerciant

nRet est un entier // Type C :INT
nHwnd est un entier // Type C :HWND
nBar est un entier // Type C :int
nPos est un entier // Type C :int
bRedraw est un booléen // Type C :BOOL
nMin, nMax sont des entiers système
nSB_VERT32 est un entier système = 1

// Handle de la table
nHwnd = Handle(TABLE_Table1)

// Ascenseur visible
bRedraw = Vrai;

// Récupération de la position de la scrollbar vertical
nPos = API("USER32","GetScrollPos",Handle(TABLE_Table1),nSB_VERT32)
API("USER32","GetScrollRange",Handle(TABLE_Table1),nSB_VERT32,&nMin,&nMax)

Trace("nMin => "+nMin)
Trace("nMax => "+nMax)

POUR i = 0 _A_ nMax PAS 10
// Deplacement ScrollBar
nRet=API("USER32","SetScrollPos",nHwnd,nSB_VERT32,i,bRedraw)

Multitâche(5)
MultitâcheRepeint()
FIN

Trace("Fin")
Posté le 22 janvier 2009 - 00:35
Bonsoir,

Nicolas Jaillet a écrit dans le message de news
Pourriez vous m'orienter sur les évènements manquants?

En vous remerciant


Il faut modifier la position de la ligne dans la table, cela modifie automatiquement la position de la scrollbar, et non l'inverse. Pas besoin d'API.

POUR i = 0 _A_ TABLE_Table1..Occurrence PAS 10

TABLE_Table1=i

FIN



amicalement,
--
Eric Boyron
Posté le 22 janvier 2009 - 10:14
Bonjour,

L'utilisation de la commande TablePosition,
ne me satisfait pas non plus car il y a une sorte de saccadement.


Ach, j'ai lu trop vite.

Cela ne sera pas plus fluide avec les API. Je suppose que c'est l'affichage du bandeau de sélection qui fait effet flicker.

Essayer de mettre avant :
TABLE_Table1..Etat = AffichageSansSélection

amicalement,
--
Eric Boyron
Posté le 22 janvier 2009 - 11:13
Bonjour
Le problème ne change pas avec TABLE_Table1..Etat = AffichageSansSélection que ce soit avec les API ou TablePosition.

Vous dites que ce ne sera pas plus fluide avec les API, alors que le défilement avec la molette de la souris à un effet qui me conviendrai très bien mais que je n'arrive pas à reproduire.

Cordialement

Nicolas Jaillet
Posté le 22 janvier 2009 - 16:53
Re',

Nicolas Jaillet a écrit dans le message de news
Vous dites que ce ne sera pas plus fluide
avec les API, alors que le défilement avec
la molette de la souris à un effet qui me
conviendrai très bien mais que je n'arrive
pas à reproduire.


Le problème n'est pas là, le problème est que la table n'est pas un contrôle Windows mais un contrôle Windev dont nous ne connaissons pas l'implémentation.

Simuler le défilement de la souris est assez facile, exemple de code ci-dessous, mais vous partez dans des problèmes insondables, pertes de focus, calcul du nombre d'évènements à envoyer avec la hauteur des lignes, bufferisation des évènements, etc.

MOUSEEVENTF_WHEEL is int = 0x800

DonneFocus(TABLE_Table1)
Multitask()

cpt is int = TABLE_Table1..Occurrence
FOR n=1 TO cpt
API("USER32", "mouse_event", MOUSEEVENTF_WHEEL, 0, 0, 120, 0)
END


Le delta doit toujours être un multiple de 120.

amicalement,
--
Eric Boyron
Posté le 22 janvier 2009 - 18:09
Merci pour cette réponse.

Malheureusement, je ne peux donner le focus au champ Table, car celui-ci sera sur un écran déporté, du coup la souris et clavier sont monopolisés par l'écran principal.

Si vous avez d'autres idées je suis preneur....

Cordialement

Nicolas Jaillet
Posté le 23 janvier 2009 - 01:12
Nicolas Jaillet a écrit dans le message de news <c75c30d3ddc85408931ea0ff31354859@news.pcsoft> :
Merci pour cette réponse.

Malheureusement, je ne peux donner le focus au champ Table, car celui-ci sera sur un écran déporté, du coup la souris et clavier sont monopolisés par l'écran principal.

Si vous avez d'autres idées je suis preneur....


A part afficher un champ image par dessus votre table et dessiner l'animation vous même ... je ne crois malheureusement pas qu'il y ait d'autres possibilités.

amicalement,
--
Eric Boyron
Posté le 23 janvier 2009 - 11:17
Bonjour
J'avais penser à cette solution mais je voulais éviter des écritures sur le disques, donc je me suis penché sur les API...

Pour l'instant en redimensionnant/redessinant la table, j'arrive à un résultat qui me convient mais qui reste à approfondir afin de l'intégrer sur tout type de table et visuel...

A voir si cela donne un résultat concluant.


Je vous tiendrais au courant


Cordialement


Nicolas Jaillet
Posté le 23 janvier 2009 - 15:54
> J'avais penser à cette solution mais je voulais éviter des écritures sur le disques, donc je me suis penché sur les API...

Je vois pas trop ce que tu veux dire...
On peut ecrire dans un champ image sans pour autant ecrire sur le disque.
De plus, c'est sans aucun doute ce qui permet le plus de flexibilité pour faire un texte défilant.

cordialement
Posté le 23 janvier 2009 - 16:17
Ayant très peut travailler avec les champs images, effectivement je n'ai pas pensé à la solution de sauvegarde en mémoire et non sur le disque.

Merci.
Membre enregistré
65 messages
Posté le 18 septembre 2013 - 18:00
Bonjour,
J'ai 3 tables dans ma fenetre
colonnes du fichier CSV
importer oui/non
nom de la rubrique destination

j'ai recopié le code dans un bouton (et testé aussi dans l'événement scroll de la table.
bien que le code ne plante pas, la table n'est jamais redessinée.

manque t'il quelques chose dans le code, ou quelque chose peut il bloquer le multitacherepeint ?
Membre enregistré
65 messages
Posté le 18 septembre 2013 - 18:14
Le défilement synchronisé fonctionne tout simplement dans le scroll de la table 1
C'est pas super fluide et il y a un décalage entre la mise à jour, mais ca fonctionne.
si quelqu'un a une solution plus jolie...

TABLE_2 = MoiMême
TablePosition(TABLE_2,TablePosition(MoiMême))
TABLE_3 = MoiMême
TablePosition(TABLE_3,TablePosition(MoiMême))
Posté le 24 décembre 2013 - 09:31
pour synchronisé 2 table sur un scroll horizontal moi j'ai ça


dans la procédure Ascenseur horizontal (WM_HSCROLL) de [votre table principale]

hwndbarv est un entier = AppelDLL32( "user32" , "FindWindowExA" , ...
Handle([table a piloter]) , Null , ...
"WDSCROLLBAR" , Null )
IF hwndbarv THEN
SendMessage( Handle(TABLE_Résultat) , _EVE.wMessage , _EVE.wParam , hwndbarv )
END
Posté le 29 juillet 2015 - 16:39
Oui ! C'est bon pour moi !
Je rajouterai que si on veut synchroniser l'ascenseur horizontal entre deux tableaux, il est indispensable d'utiliser une variable globale pour ne pas boucler sur les évenements:
//En déclaration globlale
iAscenceurEnUsage est un entier (variable globale)

//Sur l'évenement Ascenseur horizontal de chaque table
SI iAscenceurEnUsage = 0 ALORS
iAscenceurEnUsage = 1
hwndbarv est un entier = AppelDLL32( "user32" , "FindWindowExA" , Handle(Table1) , Null , "WDSCROLLBAR" , Null )

SI hwndbarv ALORS
SendMessage( Handle(Table2) , _EVE.wMessage , _EVE.wParam , hwndbarv )
FIN
iAscenceurEnUsage = 0
FIN
Membre enregistré
65 messages
Posté le 31 juillet 2015 - 12:05
Merci,
Cela fonctionne quand on clique sur les flèches haut ou bas du scrollbar,
mais si je déplace la barre de position, la synchro ne se fait pas.