Bonjour,
Dans le cadre d'une application, j'ai une fenêtre qui possède un grand nombre de boutons, inconnu à l'avance (ChampClone depuis une BDD). Les boutons sont groupés, et j'en ai trop pour la taille de la fenêtre.
J'ai recherché un moyen d'avoir un ascenseur dans une fenêtre, sans résultat (les ChampClone() m'empêchent d'utiliser une fenêtre interne).
J'ai finalement réussi à obtenir un résultat super intéressant en codant moi-même mon ascenseur. Voici le résultat. C'est une classe (plus facile à exporter) avec 2 fonctions globales :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 PROCEDURE GLOBALE InitialiseAscenseur(sFenetre est une chaîne, sAscenseur est une chaîne) yDebut est un entier = 0 yTemp est un entier = 0 yFin est un entier = 0 iChamp est un entier = 1 // On recherche l'élément de la fenêtre positionné le plus en bas sChamp est une chaîne = EnumèreChamp(sFenetre, iChamp) TANTQUE (sChamp <> "") // On récupère la position du champ SI (sChamp <> sAscenseur) ALORS yTemp = {sChamp, indChamp}..Y + {sChamp, indChamp}..Hauteur + 35 // 35 pour l'écart avec le bas de la fenêtre yFin = Max(yTemp, yFin) FIN // On passe au champ suivant iChamp++ sChamp = EnumèreChamp(sFenetre, iChamp) FIN // L'écart se calcule par rapport au bas de la fenêtre yFin = yFin - {sFenetre, indFenetre}..Hauteur // Si l'écart est négatif (l'élément le plus bas est dans la fenêtre), l'ascenseur est invisible SI (yFin <= 0) ALORS {sAscenseur, indChamp}..Visible = Faux RETOUR FIN // Initialisation des bornes de l'ascenseur {sAscenseur, indChamp}..BorneMin = yDebut {sAscenseur, indChamp}..BorneMax = yFin {sAscenseur, indChamp}..AvanceRapide = (({sFenetre, indFenetre}..Hauteur) / ({sFenetre, indFenetre}..Hauteur + yFin)) * yFinLa première fonction permet d'initialiser les bornes de l'ascenseur, la second rafraîchit la fenêtre selon la position de l'ascenseur. Les 2 paramètres à passer sont le nom de la fenêtre et le nom du champ Ascenseur, placé dans la fenêtre (en vertical).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 PROCEDURE GLOBALE RafraichitAscenseur(sFenetre est une chaîne, sAscenseur est une chaîne) iChamp est un entier = 1 sChamp est une chaîne // On parcourt la liste des champs sChamp = EnumèreChamp(sFenetre, iChamp) TANTQUE (sChamp<>"") // On modifie la position des champs (sauf celle de l'ascenseur SI (sChamp <> sAscenseur) ALORS {sChamp, indChamp}..Y = {sChamp, indChamp}..YInitial - {sAscenseur, indChamp}..Valeur FIN iChamp++ sChamp = EnumèreChamp(sFenetre, iChamp) FIN // On repeint la fenêtre FenRepeint(sFenetre)
InitialiseAscenseur(...) doit être appelé après que tous les champs soient placés sur la fenêtre.
RafraichitAscenseur(...) doit être appelé à chaque modification de l'ascenseur.
En espérant que ça serve à quelqu'un
Partager