Page 1 sur 1
[R] Faire défiler 2 Edit en même temps
Posté : jeu. 03 nov. 2011 22:01
par TT22
Bonsoir

,
Voilà mon problème :
Je crée une GUI avec 2 Edit côte à côte, je voudrais que lorsque l'on fasse défiler un Edit, l'autre défile en même temps.
Voilà, en espérant que vous avez compris,
Merci d'avance...
Re: [..] Faire défiler 2 Edit en même temps
Posté : jeu. 03 nov. 2011 22:30
par Ahbadiane
Bonsoir,
_GUICtrlEdit_LineScroll(), non ?
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#Include <GuiEdit.au3>
Global $Form1 = GUICreate("Form1", 408, 106, 349, 206)
Global $Edit = _GUICtrlEdit_Create($Form1, "Texte à faire défiler - Texte à faire défiler - Texte à faire défiler - Texte à faire défiler - Texte à faire défiler - Texte à faire défiler - Texte à faire défiler - Texte à faire défiler", 8, 24, 377, 21)
Global $ButtonM = GUICtrlCreateButton("<<<", 104, 56, 75, 30)
Global $ButtonP = GUICtrlCreateButton(">>>", 204, 56, 75, 30)
GUISetState(@SW_SHOW)
_GUICtrlEdit_SetSel($Edit, 1, 1)
Global $iPos = 1
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $ButtonP
$iPos += 1
_GUICtrlEdit_LineScroll($Edit, $iPos, 1)
Case $ButtonM
$iPos -= 1
_GUICtrlEdit_LineScroll($Edit, $iPos, 1)
EndSwitch
WEnd
Re: [..] Faire défiler 2 Edit en même temps
Posté : ven. 04 nov. 2011 11:05
par TT22
Non, ce n'est pas ça
En fait, je voudrais qu'avec un code comme ça :
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
$Form1 = GUICreate("Form1", 500, 250)
$Edit1 = GUICtrlCreateEdit("Ligne 1"&@CRLF&"Ligne 2"&@CRLF&"Ligne 3"&@CRLF&"Ligne 4"&@CRLF&"Ligne 5"&@CRLF&"Ligne 6"&@CRLF&"Ligne 7"&@CRLF&"Ligne 8"&@CRLF&"Ligne 9"&@CRLF&"Ligne 10"&@CRLF&"Ligne 11"&@CRLF&"Ligne 12"&@CRLF&"Ligne 13"&@CRLF&"Ligne 14"&@CRLF&"Ligne 15"&@CRLF&"Ligne 16"&@CRLF&"Ligne 17"&@CRLF&"Ligne 18"&@CRLF&"Ligne 19"&@CRLF&"Ligne 20",10,10,235,230)
$Edit2 = GUICtrlCreateEdit("Ligne 1"&@CRLF&"Ligne 2"&@CRLF&"Ligne 3"&@CRLF&"Ligne 4"&@CRLF&"Ligne 5"&@CRLF&"Ligne 6"&@CRLF&"Ligne 7"&@CRLF&"Ligne 8"&@CRLF&"Ligne 9"&@CRLF&"Ligne 10"&@CRLF&"Ligne 11"&@CRLF&"Ligne 12"&@CRLF&"Ligne 13"&@CRLF&"Ligne 14"&@CRLF&"Ligne 15"&@CRLF&"Ligne 16"&@CRLF&"Ligne 17"&@CRLF&"Ligne 18"&@CRLF&"Ligne 19"&@CRLF&"Ligne 20",255,10,235,230)
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Lorsque l'on bouge l'Edit de gauche de façon à ce que la première ligne soit "Ligne 5", l'Edit de droit bouge en même temps de façon à ce que la première le devienne aussi "Ligne 5".
Bon, c'est vrai que ce n'est pas très clair mais j'espère que vous avez compris cette fois

Re: [..] Faire défiler 2 Edit en même temps
Posté : ven. 04 nov. 2011 12:48
par moi
tu fait un input dans la GUI. tu entre le numéro de ligne tu appuis sur un bouton OK.
et la tu utilise _GUICtrlEdit_LineScroll() sur les deux Edit.
??? :)x===>
Re: [..] Faire défiler 2 Edit en même temps
Posté : ven. 04 nov. 2011 13:05
par TT22
Non, je veux que ça se commande avec le scroll

Re: [..] Faire défiler 2 Edit en même temps
Posté : sam. 05 nov. 2011 23:44
par TT22
Re: [..] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 12:16
par mikell
ça va, ça va ! on se calme ...

Les "up" c'est pour les forums de kikoolol et de toute façon ça fera pas avancer les choses plus vite
Bref bon ouala ce que tu veux
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#Include <GuiEdit.au3>
$Form1 = GUICreate("Form1", 500, 250)
$Edit1 = GUICtrlCreateEdit("",10,10,235,230)
$Edit2 = GUICtrlCreateEdit("",255,10,235,230)
GUISetState()
$text = ""
For $i = 1 To 50
$text &= "Ligne " & $i & @CRLF
Next
GuiCtrlSetData($Edit1, $text)
GuiCtrlSetData($Edit2, $text)
While 1
$ind_1 = _GUICtrlEdit_GetFirstVisibleLine($Edit1)
$ind_2 = _GUICtrlEdit_GetFirstVisibleLine($Edit2)
If $ind_1<$ind_2 Then _GUICtrlEdit_Scroll($Edit2, 0) ; $SB_LINEUP
If $ind_1>$ind_2 Then _GUICtrlEdit_Scroll($Edit2, 1) ; $SB_LINEDOWN
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Re: [..] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 12:19
par Tlem
Edit : J'ai été devancé par mikell. Ceci dit, sa solution ne fonctionne pas en temps réel

. Donc selon vos besoins lisez la suite.
Une
callback sur chaque Edit pour vérifier si déplacement vertical, puis on applique le même déplacement à l'autre Edit.
Re: [..] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 12:29
par TT22
Merci à vous deux, je passe en résolu.
mikell a écrit :ça va, ça va ! on se calme ...

C'est la première fois que j'utilise un up et ce forum les tolères (avec modération)
Et en plus, ça a fonctionné, j'ai ma réponse

Re: [..] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 12:51
par mikell
Tlem a écrit :Ceci dit, sa solution ne fonctionne pas en temps réel
Expliquez... chez moi si je scrolle l'edit 1, ça scrolle l'edit 2 de façon identique, et c'est bien ce qui avait été demandé...
Le même moins consommateur de ressources
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#Include <GuiEdit.au3>
$Form1 = GUICreate("Form1", 500, 250)
$Edit1 = GUICtrlCreateEdit("",10,10,235,230)
$Edit2 = GUICtrlCreateEdit("",255,10,235,230)
GUISetState(@SW_SHOW)
$text = ""
For $i = 1 To 50
$text &= "Ligne " & $i & @CRLF
Next
GuiCtrlSetData($Edit1, $text)
GuiCtrlSetData($Edit2, $text)
While 1
$a = GuiGetCursorInfo($Form1)
If $a[4] = $Edit1 Then
$ind_1 = _GUICtrlEdit_GetFirstVisibleLine($Edit1)
$ind_2 = _GUICtrlEdit_GetFirstVisibleLine($Edit2)
If $ind_1<$ind_2 Then _GUICtrlEdit_Scroll($Edit2, 0) ; $SB_LINEUP
If $ind_1>$ind_2 Then _GUICtrlEdit_Scroll($Edit2, 1) ; $SB_LINEDOWN
EndIf
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Tlem a écrit :vérifier si déplacement vertical, puis on applique le même déplacement à l'autre Edit.
Et avec _GUICtrlEdit_GetFirstVisibleLine, la condition sur les index de lignes et _GUICtrlEdit_Scroll je fais quoi, alors ?

De plus mon script a le mérite d'être simple, surtout si on ne garde que les fonctions nécessaires de GuiEdit.au3 ^^
Je reconnais toutefois que ça aurait été plus "propre" avec un GuiRegisterMsg
Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 14:45
par Tlem
Je vois que vous êtes aussi
susceptible sensible que moi ...
J'ai bien dit que votre code fonctionnait, mais pas en temps réel. Il faut relâcher le clic de la souris sur le curseur pour que le deuxième édit ce mette à jour. J'ai simplement supposé que TT22 voulait cela en temps réel, c'est à dire que lors du déplacement de l'edit 1, l'edit 2 bouge simultanément.
Ceci dit, comme je l'ai précisé, 'selon vos besoins lisez la suite', donc rien de spécial, juste deux solutions.

Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 14:58
par TT22
Tlem a écrit :Je vois que vous êtes aussi susceptible sensible que moi ...
Quel moi ? (
celui-là ou
celui-là ?)
Tlem a écrit :J'ai simplement supposé que TT22 voulait cela en temps réel
Cela n'a pas de grande importance (je prend le code de Mikell car il est déjà programmé

)
Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 15:00
par Tlem
Mon message est à la suite de celui de mikell et je ne précise au autre participant, donc il est adressé à ... mikell.
Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 15:33
par mikell
Tlem a écrit :J'ai bien dit que votre code fonctionnait, mais pas en temps réel. Il faut relâcher le clic de la souris sur le curseur pour que le deuxième édit ce mette à jour.
Ah voilà pourquoi je pigeais pas...
C'est bizarre parce que quand je teste, si je garde le bouton gauche pressé sur la barre de scroll de l'edit 1 et si je balade cette barre en haut ou en bas, ça me balade aussi la barre de scroll de l'edit 2, exactement comme si je manipulais la barre de l'edit 2... si je le fais vraiment très vite (avec la roulette de la souris par exemple) alors là j'ai un léger retard mais c'est tout
Heu par contre ça m'intéresserait bien de voir comment vous gèreriez ça avec un callback parce que là je vois pas...
Tlem a écrit :Je vois que vous êtes aussi susceptible sensible que moi ...
Comment, vous n'allez quand même pas avoir le culot de prétendre que vous ne le découvrez que maintenant

Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 15:41
par Tlem
1 - Sous XP (en tout cas sur mon poste), le comportement est différent.
2 - [Mode mauvaise foi ON]
Si si, je le découvre que maintenant.
[Mode mauvaise foi OFF]

Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 19:09
par mikell
Bah j'ai un XP SP3 x86 ... comprends pas.
Alors vous voulez bien me le montrer ce callback ? je sèche...
Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 20:19
par Tlem
Ben, il me faudrait un peut de temps (et c'est ce qui me manque le plus en ce moment ...).
Mais si je trouve une demi-heure ou une heure à consacrer à cela, je vous en ferait part.
Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 21:04
par mikell
Merci ça serait sympa
J'ai du mal avec ces callback, ça veut pas rentrer

Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 21:53
par Tlem
Il faut pas forcément essayer de le faire rentrer (en tout cas, moi ça rentre pas plus) mais avoir une bonne connexion internet, accès aux forums AutoIt et le temps de chercher.
Voilà quelque chose de fonctionnel.
Je sais d'avance ce que vous allez dire, mais le résultat final est là !
► Afficher le texte
Code : Tout sélectionner
; Code original, trouvé ici : http://www.autoitscript.com/forum/topic/122739-how-to-catch-event-scrolling-in-guictrlrichedit/page__view__findpost__p__852258
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiRichEdit.au3>
Global $sText = "", $hGui, $hRichEdit1
For $i = 1 To 50
$stext &= "Ligne " & $i & @CRLF
Next
$stext &= "Cette longue ligne est là pour le scroll horizontal"
$hGui = GUICreate("GUI Test", 350, 300, -1, -1)
$hRichEdit1 = _GUICtrlRichEdit_Create($hGui, $sText, 10, 10, 160, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
_GUICtrlRichEdit_SetEventMask($hRichEdit1, BitOR($ENM_SCROLL, $ENM_SCROLLEVENTS))
$hRichEdit2 = _GUICtrlRichEdit_Create($hGui, $sText, 180, 10, 160, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
_GUICtrlRichEdit_SetScrollPos($hRichEdit1, 0, 0)
_GUICtrlRichEdit_SetScrollPos($hRichEdit2, 0, 0)
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($hRichEdit1)
_GUICtrlRichEdit_Destroy($hRichEdit2)
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
; $tagEN_MSGFILTER = hwnd hWndFrom;uint_ptr IDFrom;INT Code;uint msg;wparam wParam;lparam lParam
#forceref $iMsg, $iWparam
Local $hWndFrom, $iCode, $tNMHDR, $tMsgFilter, $hMenu
$tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hRichEdit1
Select
Case $iCode = $EN_MSGFILTER
$tMsgFilter = DllStructCreate($tagEN_MSGFILTER, $iLparam)
$aPos = _GUICtrlRichEdit_GetScrollPos($hRichEdit1)
Switch DllStructGetData($tMsgFilter, "msg")
Case 276
;ConsoleWrite("Debug: Horz Scroll: x = " & $aPos[0] & "; y = " & $aPos[1] & @LF)
_GUICtrlRichEdit_SetScrollPos($hRichEdit2, $aPos[0], $aPos[1])
Case 277
;ConsoleWrite("Debug: Vert Scroll: x = " & $aPos[0] & "; y = " & $aPos[1] & @LF)
_GUICtrlRichEdit_SetScrollPos($hRichEdit2, $aPos[0], $aPos[1])
EndSwitch
EndSelect
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Re: [R] Faire défiler 2 Edit en même temps
Posté : dim. 06 nov. 2011 22:49
par mikell
Tlem a écrit :Je sais d'avance ce que vous allez dire
Quoi ?
Que ce script est une usine à gaz ? Que RichEdit est une vraie catastrophe bouffeuse de ressources ? Qu'on s'embarque 1 Mo d'includes avec pour résultat des scrolls tremblotants sur les edit ?
Et bien non je ne le dirai pas
Merci en tout cas
Je garde le script pour essayer une fois de plus de comprendre les finesses de GUIRegisterMsg et de ces foutues fonctions WM