HTA - Position de fenêtre devient négative

salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018 - 11 avril 2017 à 20:46
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 12 avril 2017 à 21:49
Bonjour,

j'ai un fichier HTA dont une partie en vbscript, qui sert à mémoriser la position de la fenêtre et la restaurer au lancement suivant. Fonctionne bien, mais de manière rare et aléatoire, la fenêtre se retrouve parfois à des coordonnées autour de -32000,-32000. Un problème d'entier signé/non-signé je pense, mais sans comprendre d'où ça vient, et je ne peux pas reproduire le cas à volonté.

Le bout de code concerné :


wpPosKey = "HKEY_CURRENT_USER\Environment\JCMWinPosition\Test"
wpw = 400 : wph = 400 ' taille intérieure de la fenêtre
' ----- formater la fenêtre à la bonne taille en tenant compte des bords -----
window.resizeto wpw, wph
wpcw = document.body.clientWidth : wpch = document.body.clientHeight
wpBorder = (wpw - wpcw) / 2 : wpTitle = (wph - wpch) - wpBorder
window.resizeto 2 * wpw - wpcw, 2 * wph - wpch
' ----- positionner la fenêtre à son précédent emplacement, sinon centrée
on error resume next : wpdone = false : wpv = wsh.regread(wpPosKey)
if err.number = 0 then
dim wpt : wpt = split(wpv, ",") : if ubound(wpt) = 1 then window.moveto wpt(0), wpt(1) : wpdone = true
end if
if not wpdone then window.moveto (screen.width - wpw) / 2, (screen.height - wph) / 2
' ----- enregistrer la position de la fenêtre quand on quitte l'outil -----
sub Window_onBeforeUnload
wsh.RegWrite wpPosKey, (window.screenleft - wpBorder) & "," & (window.screentop - wpTitle), "REG_SZ"
end sub


Merci d'avance de vos idées
Jean-Claude

1 réponse

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
12 avril 2017 à 10:49
Bonjour
Sans certitude
A la ligne 8 pourquoi doubles-tu la longueur et la largeur de la fenêtre ?
window.resizeto (2 * wpw) - wpcw, (2 * wph) - wpch

J' ai rajouté les parenthèses pour montrer la priorité de l'opérateur * sur l'opérateur +

ce qui fait que ta fenêtre s'agrandit à chaque enregistrement et lorsqu'elle arrive vers la limite des INTEGER positif les dimensions basculent vers les INTEGER négatif
Un peu comme l'addition : si tu est à 32767 ( soit 7FFF en hexadécimal) tu fais + 1 cela donne 8000 en hexadécimal mais en arithmétique signée cela fait -32768 : tu bascules direct dans les négatifs
0
salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018
12 avril 2017 à 19:57
Déjà, merci d'avoir répondu.
Les lignes 5 à 8 servent à avoir une fenêtre avec une zone intérieure d'une taille définie (indépendant de la bordure choisie par l'utilisateur) :
window.resizeto wpw, wph
=> mettre la fenêtre 400x400
wpcw = document.body.clientWidth : wpch = document.body.clientHeight
=> récupérer la taille intérieure (ex. 386x351 sur mon poste)
wpBorder = (wpw - wpcw) / 2 : wpTitle = (wph - wpch) - wpBorder
=> en déduire l'épaisseur du bord et de la barre de titre (ex. 7 et 42)
window.resizeto 2 * wpw - wpcw, 2 * wph - wpch
=> redimensionner en 414x449 : largeur fenêtre = intérieur + 2*épaisseur du bord = 400 + 2*7 = 414, mais aussi = 2*400 - 386, donc la formule est juste, même si ce n'est pas très logique, j'en conviens (je m'en occuperai)Mais malgré cela, la largeur est bien calculée.
De plus, même quand j'ai un bug de positionnement, la taille de la fenêtre reste correcte (intérieur 400x400). Et la taille reste constante, sans augmentation ou décalage. Seule la position est touchée.
J'ai une utilisatrice de l'outil qui semble avoir le pb plus souvent : je lui ai mis une log pour essayer de pister la prochaine fois que ça se produit. Mais c'est frustrant.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018
12 avril 2017 à 21:49
bonsoir
Je comprends un peu mieux
La barre de titre et les bordures font-elles partie de la fenêtre au sens Windows : car dans ce cas c'est Window.Screenleft qu'il faut enregistrer dans la base de registre et non Window.Screenleft - Wpborder ( idem pour l'autre paramètre )
Je te dis cela mais sans certitude
bonne soirée
0
Rejoignez-nous