Gambas France BETA


Pas de compte ? Incription

La propriété controle.screenX

1
AuteurMessages
Foromus#1 Posté le 22/12/2014 à 11:55:22
Bonjour à tous,

Un petit souci avec la propriété controle.screenX (et Y bien sûr):
Deux boutons au même endroit. J'aime bien que le curseur se place dessus au moment où il serait souhaitable de l'utiliser. Je prends la formule magique :

1
Mouse.Move(Button1.ScreenX + Button1.Width - 15, Button1.ScreenY + 25)


Même chose pour le Button2 et hop ! Tout se passe bien pour le premier, rien ne va plus pour le second...
Après maintes recherches et par mal de cheveux en moins, je m'aperçois que la particularité de mon Button2, c'est que sa propriété "visible" est désactivée au lancement, et réactivée lors de sa souhaitable utilisation.
Hélas, même après Button2.visible=true, la propriété Button2.ScreenX me retourne la valeur "3", au lieu des 1400 prévus... Et forcément, ça fait désordre...
La seule façon de m'en tirer, c'est de laisser Button2 visible, et de n'agir que sur sa propriété Enabled.
J'ai fait l'essai sur d'autres boutons, le malaise est confirmé.
Encore une fois de plus, je n'ai pas vraiment tout compris...


Petit ajout:
J'ai remarqué que le problème se posait lorsque le bouton avait sa propriété.visble = false, à la construction, sur la feuille, donc. Ainsi, dans la mesure où le bouton trouverait sa propriété.visble = true à la construction, puis rapidement mis à false, par exemple dans l'open, le souci ne semblerait pas se poser.
Curieux......
Foromus#2 Posté le 26/12/2014 à 10:34:48
Bonjour à tous,

Voici le code de mon étude.
La seule façon de pouvoir placer le curseur sur une position précise à l'ouverture de la feuille consiste à utiliser un timer, toutes les autres solutions ne fonctionnent pas, j'obtiens des valeurs genre "-1". Via un timer, ça fonctionne.
C'est une solution, certes, peut-être pas de la plus grande élégance...

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
' Gambas class file

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
ME.Center
'Button2.Visible = True
'Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)
'Mouse.Move(txtFocus.ScreenX + 10, txtFocus.ScreenY + 10)
Openbis

END
PUBLIC SUB Openbis()

'txtFocus.SetFocus
'Button1.SetFocus
'Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)
'Mouse.Move(Desktop.Width / 2, Desktop.Height / 2)
'Wait 2
Openter
END

PUBLIC SUB Openter()

Demarre
Mouse.Move(Label1.ScreenX + 40, Label1.ScreenY + 15)
'Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)
END


PUBLIC SUB Button1_Click()

'Button2.Visible = True
Mouse.Move(Button2.ScreenX + 40, Button2.ScreenY + 15)

END

PUBLIC SUB Button2_Click()

Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)
WAIT 5
Mouse.Move(Label1.ScreenX + 40, Label1.ScreenY + 15)
END

PUBLIC SUB cmdSortie_Click()

ME.Close
QUIT

END
PRIVATE SUB Demarre()

Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)

END


PUBLIC SUB Timer1_Timer()

Timer1.Enabled = FALSE
Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)
END
Foromus#3 Posté le 11/1/2015 à 09:37:04
Bonjour à tous,

La solution n'étant pas trouvée, je vais attendre bien gentiment la prochaine mise à jour (qui ne devrait pas tarder), en espérant que la chose soit revue et corrigée.
Il me semble que quand j'étais en versions 32 bits, ça fonctionnait normalement, ce qui n'est plus le cas en 64.
gambix#4 Posté le 18/1/2015 à 00:13:10
Faire simple !Pas sur ... c'est la première fois que j'entend parler de ce bug ... il faudrait le rapporter sur la mailing list si ça ne te dérange pas de le faire.
Moins de texte dans une signature c'est agrandir son espace.
Foromus#5 Posté le 31/1/2015 à 20:21:11
Bonjour,

Soucieux de montrer un peu de persévérance, j'ai passé plusieurs heures à essayer de démêler le truc.
Je n'ai trouvé que des solutions de pis-aller, par exemple, mettre une ligne pour envoyer le curseur à un endroit de l'écran, par exemple au milieu, et ensuite mettre une autre ligne pour l'envoyer là où je souhaite qu'il soit. Suivant le contexte, j'ai pu obtenir un "petit quelque chose", et surtout, en mettant un wait 0.5, histoire que le µ reprenne connaissance entre-deux...
Il semblerait aussi que des soucis apparaissent dès lors qu'on utilise les timers, je sais que, dans un projet où je manipulais des fichiers un peu importants, quand je voulais afficher une barre de progression pour suivre la marche du processus, ça coinçait délibérément, voire, une partie de la procédure était oubliée, j'ai eu plusieurs choses comme ça qui ont bien foiré, et seuls quelques wait judicieusement placés ont permis un aboutissement correct.
Là aujourd'hui, dans ce que j'ai essayé de faire, je reste délibérément coincé. Pour peu que dans une procédure, j'en appelle une seconde, et que je lance un ou deux timers, la fin de la procédure peut à la rigueur être traitée, mais s'il s'agit d'une commande de mose.move, elle passe à la trappe...

Maintenant, je reconnais que je suis parfois des mois sans taper une seule ligne de code, donc, entre-temps, j'oublie un peu, d'autant qu'avec les années, les facultés mémoriales ne sont pas en constantes améliorations, même si je tente malgré tout de les solliciter un peu quand même...
Tout ça pour dire que la "mailing list", désolé, je n'ai pas trop de souvenir, en supposant que par la passé j'en aie seulement eu...
Je vais donc attendre les mises à jour, il me semble que les dernières remontent déjà à pas mal de mois...
didier18#6 Posté le 15/2/2015 à 20:47:28
Bonsoir Foromus

En fait si je comprend bien ton soucis, tu as 2 boutons l'un sur l'autre.
Et quand tu cliques sur l'un il est caché et l'autre s'affiche (et inversement)...
C'est ça que tu veux faire ?
si oui essaye ce bout de code...

Public Sub Button1_Click()
With Button2
.Visible = True
.Raise
End With
Mouse.Move(Button2.ScreenX + 40, Button2.ScreenY + 15)
End

Public Sub Button2_Click()
With Button1
.Visible = True
.Raise
End With
Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)
End

Perso pour moi ça fonctionne (et du coup on économise le timer... ;-)

A bientôt
Foromus#7 Posté le 16/2/2015 à 08:57:19
Bonjour,

Eh ...non...

Mais, même avec deux boutons l'un sur l'autre, ce n'est pas un souci, sachant que, dans ce cas, un seul sera actif (visible) à la fois.

Comme (certainement mal) expliqué en entrée, je constate que la formule qui met le curseur dans un endroit quelconque de l'écran fonctionne très bien, sauf dans le cas d'un bouton (peu importe lequel) précis, et au démarrage. J'ai mis une démo sur le wiki à ce sujet, il est vrai que le code comprend de nombreux essais, et chaque essai est activé ou désactivé en le mettant en commentaires ( ' ), ce qui peut paraître un tantinet brouillon...
Au lancement de l'application, alors que je souhaite que le curseur se place, par exemple, sur le bouton1, non seulement il n'y va pas mais se place en haut, à gauche (+ 2 cm), de l'écran !.. Ensuite, les commandes agissent normalement.
C'est complètement tordu comme truc, d'autant plus que dans un passé pas si éloigné, ça fonctionnait normalement.
didier18#8 Posté le 16/2/2015 à 14:38:26
Hello Foromus
En réalité 2 problèmes...
En reprenant ton exemple tel que, le curseur se positionne en haut à gauche de l'écran (alors que le formulaire n'est pas encore affiché).
Tu travail effectivement dans le Form_Open(), mais ligne 55 le form n'est pas affiché à l'écran...
Il faut donc poursuivre en appuyant 3 fois [F8] pour fermer toutes les routines...
A ce moment, le formulaire s'affiche et le curseur est bien positionné comme demandé (ligne 55 en haut à gauche de l'écran).
Libre à toi de juger de l'opportunité du placement du curseur à ce moment là, mais si tu met un bouton quelque par, c'est pour que l'utilisateur clique dessus à un moment donné non ?
Donc je dirai qu'il vaut mieux s'occuper du déplacement du curseur dans la Public Sub Fmaim_AfterArrange().
Bien vu... ça n'existe pas... Donc le mieux un petit Wait.
Problème n°2 le déplacement du curseur Après l'appui sur le 2ème bouton. Là... Tu as tout a fait raison ! Y'a un truc que je comprend pas bien non plus, il semblerai que malgré l'ordre donné et les nouvelles coordonnées X et Y, le Mouse.move garde en mémoire les anciennes coordonnées du Label1.
Le Refresh n'y fait rien pas plus que la remise à 0 de X et Y.
Le seul palliatif que j'ai trouvé est (là encore) un Wait que j'ai mis à 0.01. Pas très élégant je reconnais mais ça fonctionne...
Quelle est l'interaction entre le Wait et le Mouse.move ??? Je ne saurai pas te répondre.
Apparemment la valeur du Wait importe peu...
Par contre si tu met l'un ou l'autre des Wait en commentaire, le phénomène de mémoire (parasitaire) réapparait.
Ci après le code fonctionnel avec déplacement du Label1...

Public Sub Button1_Click()

Button2.Raise
Label1.Move(21, 135)
Wait 0.01
Mouse.Move(Label1.ScreenX + 40, Label1.ScreenY + 15)

End

Public Sub Button2_Click()
' Mouse.Move(Button1.ScreenX + 40, Button1.ScreenY + 15)
' Wait 0.5

Button1.Raise
Label1.Move(21, 35)
Wait 0.01
Mouse.Move(Label1.ScreenX + 40, Label1.ScreenY + 15)

End

A+
Foromus#9 Posté le 19/3/2015 à 08:57:36
Bonjour à tous,

Ô rage, ô désespoir....
Plus de 80 mises à jour hier, autant ce matin... A moins que ce ne soient les mêmes qu'hier...
Après vérification sur le petit projet posté ici, je ne vois rien de changé, le curseur se plante toujours en haut, à gauche, sur l'icône du menu des applications (je suis sous xubuntu).
Et en plus ce matin, le programme ne voulait même pas démarrer. Un petit clic sur "Tout recompiler", ça semble reparti.
Enfin, j'ai Gambas 3.7, mais toujours le même problème.
Pour répondre à Didier - que je remercie vivement - des "wait", j'en ai collé un peu partout, sans grand résultat pour autant.
J'ai remarqué, sous Gambas, et comme c'est de l'interprété, il y a parfois des bavures, j'ai vu par exemple, quand il faut traiter un grand nombre de données - comme vérifier des fichiers par exemple, le truc s'emballe ou se bloque, la seule façon de s'en sortir est l'utilisation de "wait" judicieusement distribués.
Sans vouloir tout ramener à VB, le fichier compilé exécutable me semble nettement plus performant.
Après, pour ce que j'en ai à faire, voilà qui me suffit et me permet de m'amuser, tout en sachant que je suis loin de savoir en utiliser toutes les arcanes...
Dans l'attente, je vais patienter jusqu'à la prochaine mise à jour avec l'espoir de voir le truc résolu...


Edit le 20 mars :
Pour la troisième fois en trois jours, je viens de recevoir les 84 mises à jour !.. Il semblerait que ce soient sensiblement les mêmes - enfin presque, je ne sais pas vraiment ce qu'il y a dans les paquets..
Cela dit, rien de changé dans mon souci pour autant....
1