[UDF] Cacher/afficher des groupes

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

[UDF] Cacher/afficher des groupes

#1

Message par Manox »

bonjour,

J'ai du créer pour un projet des groupes qui puissent se minimiser et augmenter de taille suivant la volonté de l'utilisateur.

Voici donc HideAndShow.au3 cet UDF vous permettra de :
  • Créer des groupes rétractable
  • Déplacer tous les autres contrôles en conséquences
  • Activer indépendamment chaque groupe (j'imagine que cela va de soit :()
Voici donc un exemple basé sur une gui avec 3 groupes et quelques contrôles...
Exemple.au3
► Afficher le texte
voici l'UDF :

HideAndShow.au3 - 19.08.2013
► Afficher le texte
HideAndShow.au3 (Ancienne version)
► Afficher le texte
Explications :

_HS_Start() -> Première fonction à utiliser, elle sert juste à indiquer le "GUI" à utiliser pour la création des groupes, ça évite de le passer dans la fonction suivante à chaque fois.

_HS_GroupOpen()
-> Seconde fonction à utiliser, elle permet de déclarer un groupe, avec les paramètres qui vont avec, il retourne la valeur du bouton qui sera utiliser pour cacher/afficher le groupe. Il faut déclarer le return dans un Global pour pouvoir le réutiliser après coup pour afficher/cacher

_HS_GroupClose() -> Après avoir ouvert un groupe toujours utiliser cette fonction, elle ferme le groupe . (concrètement tous les contrôles entre groupOpen et groupClose seront cachés à contrario les autres non).

_HS_Stop() -> Défini jusqu'a quel item les contrôles seront déplacés, je sais pas si c'est clair mais sur les principe tous les contrôles de votre groupClose à Stop seront déplacés lors de la fermerture ou l'ouverture d'un groupe.

_HS_ActiveGroup() -> Est utilisé pour fermer ou ouvrir le groupe, le paramètre passer doit être le return de _HS_GroupOpen()

NEW FUNCTIONS

_HS_IsShown() -> Permet de savoir l'état du groupe (ouvert ou fermé)

_HS_PosBackUp() -> Sauvegarde la valeur "Top" de tous les contrôles pris en charge par l'udf. Cette func peut-être utile si vous utilisez une fenêtre redimensionnée avec des scrollbars par exemple, à utiliser conjointement avec _HS_PosRestore().

_HS_PosRestore() -> Restaure la valeur "Top" sur tous les contrôles sauvegardés auparavant par _HS_PosBackUp().

_HS_Exclude() -> Exclue le contrôle passé en paramètre de la function hide, le contrôle sera toujours visible. (à utiliser exclusivement sur les contrôles entre _HS_Start et _HS_Stop!)

_HS_GetIDGroup -> Retourne l'ID du groupe en passant en paramètre la valeur de retour de la function _HS_GroupOpen

l'UDF n'est pas parfait loin de là, je l'ai, à la base, fait pour un besoin particulier, mais c'est particulière le genre de controles que je pense avoir a réutiliser dans le futur, alors plutôt que de faire une version spécifique, en voici la version générique.

Tous les cas n'ont pas étés testés, aussi, je vous serais reconnaissant de me donner des retours en cas de bug et plus particulière si le code peut-être optimisé ne vous gênez pas, ça me servira surement beaucoup et j'espère à d'autres.

M40

Edit (20.07.13): Optimisations et corrections
Edit (31.07.13): Ajout de function.
Edit (02.08.13): Update mineure
Edit (19.08.13): Update mineure
Modifié en dernier par Manox le lun. 19 août 2013 08:33, modifié 11 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#2

Message par jguinch »

Très sympa ton script.
J'ai eu le même besoin il y a quelques semaines, mais j'ai pas eu le courage...
Bravo
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#3

Message par Manox »

Merci bien :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#4

Message par mikell »

Bien que tu n'aies pas jugé utile de poster chez nous, je vais quand même répondre à ce sujet
http://www.autoitscript.com/forum/topic ... ui-resize/
...flemme de traduire en anglais pour un français :mrgreen:

A défaut de solution je peux te proposer un semblant d'explication ^^
Axiome : les GUICtrlSetPos font mauvais ménage avec les GUICtrlSetResizing
Dans les savants calculs de repositionnement que fait Windows les valeurs ont forcément des décimales, il y a donc des arrondis et la valeur Default varie
Pour le vérifier tu peux
- commenter les GUICtrlSetPos dans la fonction HS_ActiveGroup
- activer la fonction HS_ActiveGroup mais sans toucher à la taille initiale de la gui
Dans les 2 cas => pas de décalage des groupes au redimensionnement de la gui
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#5

Message par Manox »

Le site anglophone est parcouru par plein d'autres communautés dont celle-ci, je pensais cela plus simple d'avoir un topic sur un sujet bien précis et là ou j'aurai le plus de chance d'avoir une réponse, même si finalement, ça pas été très... enfin pas du tout concluant.
Bien que tu n'aies pas jugé utile de poster chez nous
J'ai l'impression, à la lecture de cet phrase, que je vous ai jugé inutile or ce n’était pas du tout mon intention!

Mais je te remercie pour ta réponse, tu es bien le seul ! :)

De ce que j'ai pu constater, à chaque fois qu'il y à une réduction de la largeur (les autres paramètres étant bloqués si non, j'ai oublié de le préciser, le problème se retrouverai également à d'autres endroits) cela ne change que seulement d'un px ce qui confirme le round qui doit être fait à un moment donné.

Par contre je reste assez stupéfait, car en lisant la doc, on y retrouve ceci :
If Default keyword is used, the current value is not modified.
Or, selon ce que tu dis et ce que j'ai pu aussi constater, en réalité ça ré-applique la valeur "en cours" arrondi à l'unité... J'avoue ne pas comprendre...

Quels possibilités aurais-je pour contourner ça ?
Je gère les resizing moi-même ? même si je trouve ça dommage et lourd à gérer pour un petit bout de code...

Ou aurait-il un moyen de ne toucher qu'à la hauteur (Top) du contrôle ?

En tout cas merci pour ton message, je me sens un peu moins seul avec mon problème.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#6

Message par mikell »

Je gère les resizing moi-même ?
Heu oui, avec un GuiRegisterMsg et WM_SIZING, mais bon courage...

Sinon ya la solution 'tricky' : recaler les largeurs sur les arrondis quand tu actives ta fonction

Code : Tout sélectionner

    Func _HS_ActiveGroup($iCtrlID)
        Local $iCurrID = UBound($aHS_AllGroups)
        ; retrieve the group
        For $id = 0 To $iCurrID - 1
            If $iCtrlID = $aHS_AllGroups[$id][7] Then ExitLoop
        Next
; c'est glauque mais ça marche :
For $i = 0 to UBound($aHS_AllGroups)-1
        $pos = ControlGetPos($aHS_AllGroups[0][2], "", $aHS_AllGroups[$i][0])   ; on capte la foutue valeur arrondie
        GUICtrlSetPos($aHS_AllGroups[$i][0], Default, Default, $pos[2], Default)  ; et hop on la re-balance
Next
;... etc
:mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#7

Message par Manox »

Arf... je me doutais bien... Enfin je vais quand même chercher une solution de contournement, le resizing via le wm_sizing ne me plait guère.

Par contre, pour ce qui est de la solution "tricky", elle me semblait très bien, je l'ai modifié pour l'inclure à tous les contrôles et je me suis rendu compte du problème.

Au final on effectue le round sur tous les groupes, et problème, j'ai l'impression que le round se fait à l'unité inférieure... Ce qui a pour conséquence de réduire indéniablement la taille du contrôle petit à petit. Alors, ça cache un peu le problème, mais il est encore présent.

Je te remercie pour ton idée, un pas de plus vers la solution :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#8

Message par mikell »

Autre test pas mal non plus

Code : Tout sélectionner

Global $iGrpStyle = $GUI_DOCKHEIGHT + $GUI_DOCKTOP + $GUI_DOCKLEFT + [color=#FF0000]$GUI_DOCKRIGHT[/color]
Global $iIcoStyle = $GUI_DOCKHEIGHT + $GUI_DOCKTOP + [color=#FF0000]$GUI_DOCKWIDTH + $GUI_DOCKRIGHT[/color]
....
$hListView = GUICtrlCreateListView("wd", 12, 20, 500, 125)
GUICtrlSetResizing(-1, $iGrpStyle)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#9

Message par Manox »

ça à l'air de marcher à la perfection, bon reste qu'il faut jouer sur les styles pour les autres contrôles (labels, buttons etc...) mais sur le principe ça marche !

Je vais voir pour mettre à jour l'udf avec ces styles par défaut...

Encore merci pour l'aide :)
Avatar du membre
TopXm
Niveau 6
Niveau 6
Messages : 260
Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#10

Message par TopXm »

Hello :)

Juste une petite chose, attendu que l'include Array.au3 est seulement utilisée dans la fonction _HS_ActiveGroup, ne serait-il pas
judicieux que de faire l'include dans HideAndShow.au3.

Un grand merci néanmoins pour cette UDF bien sympa et pratique :)

:)

[EDIT 10/08/2013 15:27]A noter aussi un souci au niveau du positionnement du bouton à droite du contrôle Group au niveau du Left

Code : Tout sélectionner

    $aHS_AllGroups[$iCurrID][7] = GUICtrlCreateButton("", $iLeft + $iWidth +5, $iTop + 5, 19, 19, $BS_ICON)
Merci
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#11

Message par Manox »

Hello TopXm,

Merci pour ton commentaire, l'UDF a été mis à jour selon tes remarques :)

Pour info, je n'avais pas mis le include du Array dans l'UDF car il était déjà dans l'exemple, dorénavant il sera aussi dans l'UDF.

Encore merci pour les remarques !
Avatar du membre
TopXm
Niveau 6
Niveau 6
Messages : 260
Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#12

Message par TopXm »

Hello Manox :)

En fait j'ai pas mal bossé sur cette UDF attendu que j'en avais besoin et du coup je suis tombé sur quelques petits soucis.

Je te fais la remontée de ce que j'ai vu après libre à toi d'en tenir compte :
  • La gestion du cachage/affichage des contrôles via la fourchette d'ID ($aHS_AllGroups[$id][5]+1 To $aHS_AllGroups[0][1] - 1),
    car la création de certains contrôles n'est pas incrémentielle quand à l'ID (Ex : StatusBar / TabItem). De plus la création de certains contrôles
    ne retourne pas un ID mais direct un Handle (RichEdit / IpAdress control).
    Donc au final tout le code qui fonctionne via fourchette d'ID peut ne pas fonctionner dans certains cas.
    ► Afficher le textePetit test
  • GuiControlSetState et GUICtrlSetPos ne fonctionne pas sur les contrôles RichEdit. Perso j'ai fait deux fonctions pour parer au problème.
    ► Afficher le texte2 fonctions

Pour le souci de fourchette d'ID, je me suis fait une fonction qui retourne un array avec toutes les informations nécessaires relatives aux divers traitement de ton UDF :
► Afficher le texte_GuiCtrlGetGroupAndInfos
Je suis encore sur l'UDF mais si tu as besoin je peux te filer ton code que j'ai repris (j'ai effectué pas mal de changements pour mes besoins personnels, notamment le changement des noms de fonctions) :)

++
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#13

Message par Manox »

Heureux de voir l’intérêt que tu portes à l'UDF :)

La gestion du cachage/affichage des contrôles via la fourchette d'ID ($aHS_AllGroups[$id][5]+1 To $aHS_AllGroups[0][1] - 1),
car la création de certains contrôles n'est pas incrémentielle quand à l'ID (Ex : StatusBar / TabItem). De plus la création de certains contrôles
ne retourne pas un ID mais direct un Handle (RichEdit / IpAdress control).
Donc au final tout le code qui fonctionne via fourchette d'ID peut ne pas fonctionner dans certains cas.
Je n'ai utilisé que les contrôles de base d'autoit (Hors UDF) lors des mes tests et ceux-ci, retournent dans tout les cas une id incrémenté... (Je passerai sur le tabItem qui retourne l'id de l'onglet, relation tab <-> tabitem). Mais en effet, ça risque de poser problème, je vais tâché d'y remédier avec ce que tu as fourni (WinMove, ControlHide, ControlShow) :)
GuiControlSetState et GUICtrlSetPos ne fonctionne pas sur les contrôles RichEdit. Perso j'ai fait deux fonctions pour parer au problème.
Je n'ai pas réussi à reproduire le problème, quand tu parles de RichEdit, tu parles bien de GUICtrlCreateEdit ? (Pareil pour StatusBar, on parle de cette fonction : _GUICtrlStatusBar_Create ?)
Pour le souci de fourchette d'ID, je me suis fait une fonction qui retourne un array avec toutes les informations nécessaires relatives aux divers traitement de ton UDF :
Et bien, t'as du y passer du temps ! Avec ton accord, je vais voir pour l’intégrer à l'UDF histoire que cela soit plus flexible.

Merci pour tes remarques et ton boulot !
Avatar du membre
TopXm
Niveau 6
Niveau 6
Messages : 260
Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#14

Message par TopXm »

Hello :)
Manox a écrit :Je n'ai pas réussi à reproduire le problème, quand tu parles de RichEdit, tu parles bien de GUICtrlCreateEdit ? (Pareil pour StatusBar, on parle de cette fonction : _GUICtrlStatusBar_Create ?)
Non, non je parle de la RichEdit (en fait c'est comme un contrôle Edit en 10 fois mieux, enfin disons qu'on peut y faire pas mal de choses)

Regarde par ici : http://www.autoitscript.com/autoit3/doc ... Create.htm

En fait tu peux faire un max de tests sur uniquement ce contrôle car il prend en compte tous les soucis (Hide / Show / Déplacement du contrôle / HandleRetourné). Je pense que si ce contrôle est géré les autres le seront aussi :)

J'attaque ce matin (disons cet après-midi), une nouvelle méthode pour la gestion des Group, quand elle sera terminée je t'en ferai part.

Merci :)

++
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [UDF] Cacher/afficher des groupes

#15

Message par Manox »

Hello TopXm,

En reprenant en partie ta méthode et en l'adaptant à l'UDF, on peut imaginer ça :
► Afficher le texte
C'est possible, donc, mais j'ai des petits bug graphiques que j'ai pas avec l'ancienne méthode, mais sur le principe cela fonctionne.

Faudrait que je puisse revoir tout le code du coup, parce que là c'est fait vraiment patté a rajouter une méthode par dessus une autre :oops:

Bref, à voir par rapport à ce que tu as fais pour l'adapter au mieux.

a+

Edit: suppresion des alertes inutiles ...
Répondre