Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Problème avec un texte défilant d'un USF lors de son ouverture

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Après que mapomme & Soan m'aient prêté main forte pour éclipser un USF via la touche "Esc", je me heurte à un nouveau problème. J'aurais pu rester sur le fil précédent, mais il s'agit là d'un tout autre problème.
J'ai un USF. Dans le TextBox qui s'y trouve on y rentre un mot de passe. Mais dans ce même TextBox peuvent apparaître des avertissements sous forme d'un texte défilant. Tout marche très bien, sauf à l'ouverture de l'USF. En effet, quand celui-ci s'ouvre, je voudrais que dans le TextBox il y ait un message défilant qui avertisse le pélerin du nombre d'essais auxquels il a droit. Il suffit ensuite de cliquer sur le champignon (à droite du TextBox) pour pouvoir rentrer le bon mot de passe ("zaza"). Quand on appelle l'USF et que l'on veut qu'il en soit ainsi à l'ouverture, ça plante (voir dans le module de l'USF où j'ai mis en REM la routine qui est censée gérer le défilement du texte à l'ouverture de l'USF).
Quoi qu'il en soit, on peut virer ipso facto l'USF en appuyant sur la touche "Esc" (astuce communiquée par mapomme dans le précédent fil).
 

Pièces jointes

  • Pb USF.xlsm
    26.3 KB · Affichages: 20
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Magic_Doctor

Personnellement, utiliser une zone de saisie pour faire défiler de l'information, c'est mélanger les fonctions et les finalités ; ça perturbe l'utilisateur: est-il dans une zone de saisie ou dans tout autre chose? Il ne sait ni où est le curseur (zone de saisie ou ailleurs) ni ce qu'il doit faire pour ressaisir un nouveau mot de passe. Je pense que cette méthode est tout sauf ergonomique et logique d'un point de vue utilisateur.
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour mapomme,

Je comprends vos objections qui tiennent la route, mais ceci n'est pas la version finale.
Version finale :
1/ Apparaît l'avertissement. Il n'y aura qu'un seul bouton : le champignon atomique.
2/ On ne peut cliquer que sur le champignon --> Le champignon est alors remplacé par un bouton "OK", le TextBox se vide et est automatiquement sélectionné pour y rentrer le fameux mot de passe. On clique sur le bouton "OK" pour valider.
Si ERREUR --> nouveau message et le champignon se substitue au bouton "OK".
Et ainsi de suite jusqu'au 3ème essai. Si on se plante au 3ème et dernier essai --> dernier message défilant pendant 2'' et fermeture drastique de l'application.
Et pour les initiés qui savent... touche "Esc" et basta !
Comprenez bien que tout ça c'est pour le fun.

En revanche, faisons abstraction de l'utilité de cet USF, pourquoi diable ça plante à l'ouverture quand on veut qu'il y ait un texte qui défile ?
 

Magic_Doctor

XLDnaute Barbatruc
Re,

Si on habilite (dans le module de l'USF) le texte défilant à l'ouverture, d'emblée il y a un problème : il faut cliquer 2 fois de suite sur le bouton "USF2" pour faire apparaître l'USF. Une fois l'USF présent, le texte est bien affiché mais figé.
Et si on appuie sur la touche "Esc", alors ça plante. C'est bizarre tout ça...

Tâchons de simplifier le problème dans un premier temps. Peut-on ouvrir un USF contenant un message défilant ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Tâchons de simplifier le problème dans un premier temps. Peut-on ouvrir un USF contenant un message défilant ?

J'ai déjà eu des problèmes quand j'ai voulu modifier l'affichage de composants sur le USF pendant la phase d'initialisation. Aussi, je m'abstiens de le faire. Quelque part ça peut se comprendre.
Quand on construit votre voiture sur la chaine de production, il ne viendrait à personne de vouloir actionner le lave-glace à n'importe quel stade de la production et constater que ça marche à tout les coups.
Je suis persuadé que tant que le processus d'initialisation n'est pas terminé, certaines instructions ou méthodes sont inopérantes ou invisible depuis l'interface visuelle.
 

Magic_Doctor

XLDnaute Barbatruc
Et faire une espèce de "Stand By" d'une seconde, par exemple, pour permettre à la bête de réaliser ce qu'on lui demande.
Sitôt la voiture est sortie de la chaîne, on peut actionner le lave-glace il me semble...

Enfin, pourquoi "Esc" plante ?
 

patricktoulon

XLDnaute Barbatruc
bonsoir a tous
@Magic_Doctor
VB:
Option Explicit

Dim Stop_Code As Boolean
Dim i&

Private Sub UserForm_Activate()
    i = -1
    Dim hwnd&
    '*************************************************************
    'Élimination de la barre de titre de l'UserForm "UserForm2"
    '*************************************************************
    hwnd = FindWindow(vbNullString, Me.Caption)
    SetWindowLong hwnd, -16, &H94080080: SetWindowLong hwnd, -20, &H0:    ' sans caption
    '*************************************************************
    CommandButton1_Click
End Sub
'
'arrête le défilement du texte dans le TextBox "TextBoxMotPasse"
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Stop_Code = True
End Sub
'
Private Sub CommandButton1_Click()    'CommandButton "OK"

    Dim phrase$, phrase1$, phrase2$, w#, temp#

    If TextBoxMotPasse = "zaza" Then
        Unload Me    'ferme l'USF "UserForm2"
    Else
        TextBoxMotPasse.ForeColor = &HFF&    'le texte du message défilant dans le TextBox "TextBoxMotPasse" est rouge
        i = i + 1
        If i = 0 Then phrase = "vous avez droit a trois essais "
        If i = 1 Then phrase = " Code erroné. Vous n'avez droit plus qu'à 2 essais. "
        If i = 2 Then phrase = " ¡CARAMBA! Encore raté... il ne vous reste plus qu'un seul essai. "
        If i = 3 Then phrase = " Mauvaise limonade ! Vous vous êtes encore planté. "
        If i > 3 Then
            phrase = " vous avez grillé vos trois essais !!! il ne vous reste plus qu'a appuyer sur ""ESC"""
            CommandButton1.Enabled = False
            With Champignon: .Width = 0: .Enabled = False: End With
         TextBoxMotPasse.Move 0, 0, Me.InsideWidth, Me.InsideHeight
        End If
        Stop_Code = False
        Do
            TextBoxMotPasse.Value = phrase
            w = 0.1
            temp = Timer
            Do While Timer < temp + w
                If Stop_Code = True Then Exit Do
                DoEvents
            Loop
            phrase1 = Right(phrase, Len(phrase) - 1)
            phrase2 = Left(phrase, 1)
            phrase = phrase1 & phrase2
        Loop Until Stop_Code = True
        TextBoxMotPasse.ForeColor = 0    'le texte dans le TextBox "TextBoxMotPasse" redevient noir pour entrer le mot de passe
    End If
End Sub
'
Private Sub CommandButton2_Click()    'CommandButton "OUT"
    Stop_Code = True  'arrête le défilement du texte dans le TextBox "TextBoxMotPasse"
    Unload Me  'ferme l'USF "USF_MotDePasse"
End Sub
'
Private Sub Champignon_Click()    'Efface le texte dans le TextBox "TextBoxMotPasse"
    Stop_Code = True    'arrête le défilement du texte dans le TextBox "TextBoxMotPasse"
    TextBoxMotPasse = ""    'efface le mot de passe erroné entré
    Me.TextBoxMotPasse.SetFocus    'sélectionne le TextBox "TextBoxMotPasse" pour y entrer le mot de passe
End Sub
bonne nuit
 
Dernière édition:
Réactions: cp4

soan

XLDnaute Barbatruc
Inactif
Bonjour Magic_Doctor, le fil,

Tu as écrit : « ... pour pouvoir rentrer le bon mot de passe ("zaza"). »

Tu as très bien choisi ton mot de passe ; il est charmant et ravissant à souhait ; en plus,
même quand il boude, il a le très gros avantage d'être bien plus léger qu'un menhir :


(du moins, c'est l'avis d'Obélix)

Pour ton problème actuel, j'espère que la solution de @patricktoulon marchera.

soan
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonsoir patricktoulon, soan,

La solution de patricktoulon marche à merveille. Très instructif, même si je n'ai pas saisi la nuance entre "Initialize" & "Activate".
Voir PJ pour apprécier.

Bonne journée à tous.
 

Pièces jointes

  • Pb USF3.xlsm
    27.1 KB · Affichages: 17

patricktoulon

XLDnaute Barbatruc
bonjour
même si je n'ai pas saisi la nuance entre "Initialize" & "Activate".


la différence je vais te l'expliquer a ma manière

le initialise:
on est dans un module classe userform!!!!!!!

le activate :
on est dans un userform!!!!!!!!!

il est évident que ces deux contextes n'offrent pas les même possibilités

tu a sans doute remarqué que j’appelle le clik du bouton au démarrage dans le activate

tu ne peux pas faire ça dans le initialise car a ce stade c'a n'est pas encore un userform ca n'est qu'un module classe et du code


le doevents dans le do permet de libérer l'userform pour que d'autre events ou macro puissent tourner
il est évident que dans le initialise comme ca n'est pas encore un userform le doevents servirait a rien(puisque un module n'a pas d'events)
et donc l'affichage complet(le repaint fini du userform ) du userform n'arriverait jamais car a ce stade il n'est pas encore object userform actif donc un beau carré blanc


il faut bien saisir le contexte entre vbcomponent et object userform
-------------------------------------------------------------------------------------------
pour ce qui est de ton dialog mot de passe

il y a 4 phrases dont celle d’accueil (l'avertissement de depart)
je les met toutes dans le click du bouton
tu constatera que ta variable i static est devenue long et globale module
et que i=-1 au départ
a chaque click i augmente de 1 et on change de phrase
donc des le départ je click donc i=0 et on est dans la phrase(0)
tu click donc 3 fois de plus si c'est pas zaza c'est la phrase (i)
une fois passé ces trois ratés j'ai pensé que bloquer le tout était normal
donc après 3 essais ratés tu a la phrase 4(la 5eme) et le textbox prend tout l'userform
et tu ne peux faire q'une chose : c'est cliquer ESC pour sortir

voila c'est simple

je vous aurais bien fait quelques démonstrations de servitude (module classe/userform/les deux ) pour vous expliquer mais je polluerais cette discussion
mais vous en avez déjà un aperçu assez large avec mes pseudo boite de dialog dans les ressources

 

soan

XLDnaute Barbatruc
Inactif
Bonjour Patrick, le fil,

Je trouve bizarre le début de ta réponse ; car sans être dans un module de classe,
mais dans le module d'un UserForm, il y a : Private Sub UserForm_Initialize()

Mais je pense que tu as voulu dire : « on est dans un module de type UserForm »

Perso, j'aurais dit : le code du Initialize() est le code qui s'exécute à l'ouverture du formulaire ;
et le code du Activate() est le code qui s'exécute quand on sélectionne le formulaire.


soan
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…