Envoyer le nom d'un objet à une fonction ? [Résolu]

Signaler
Messages postés
152
Date d'inscription
mardi 4 novembre 2008
Statut
Membre
Dernière intervention
10 avril 2017
-
Messages postés
152
Date d'inscription
mardi 4 novembre 2008
Statut
Membre
Dernière intervention
10 avril 2017
-
Bonjour tout le monde,


J'aimerais envoyer le nom d'un objet sur lequel je suis à une fonction.


Je suis sur un objet (zone de texte) nommée txtNomClient.


J'aimerais envoyer le nom de mon objet à une fonction afin qu'il puisse y faire certaines opérations.


Sauriez-vous me dire comment je passe le nom de mon objet ?


Sauriez-vous aussi me dire comment je réceptionne mon objet ?


Avec

widget asobject

?


Merci d'avance.


beegees

8 réponses

Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
(je continue avec mes copier/coller de fainéant) ...

Je repasse par là, lis et ....

et je te demande de réfléchi en outre à 2 choses !

La première concerne ton code :

             SelStart = 0
            'sélectionne tout le texte
            .SelLength = Len(.Text)
            'remet le texte d'origine
            .Text = .Tag

Tout ce que j'ai mis en rouge est totalement inutile ! (j'espère que tu vois pourquoi !)

Le deuxième concerne le mécanisme que tu veux mettre en oeuvre avec ta "fonction"...

Tu devrais tout simplement t'intresser aux groupes de contrôles indexés ! <!-- / message --><!-- edit note -->
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
J'espère que tu comprendras cet exemple parlant :

Private Sub Command1_Click()
 Text1.Text = "titi"
 MsgBox toto(Text1)
End Sub
Private Function toto(lobjet As Object) As String  If lobjet.Text "titi" Then toto "voilà"
End Function

Un "détail" qui n'est pas anodin ...
J'ai mis ici As Object.
Ce serait mieux de mettre As Control lorsque tu sais qu'il s'agit d'un contrôle
et encore mieux de mettre As TextBox lorsque tu sais que le contrôle est une TextBox
En fonction de la précision que tu as en ce qui concerne ton objet
Messages postés
152
Date d'inscription
mardi 4 novembre 2008
Statut
Membre
Dernière intervention
10 avril 2017
1
Bonsoir,

Merci pour ta réponse.

Je pense que je n'ai pas posé la bonne question.

En fait, j'ai ce code :

Private Sub txtNomClient_LostFocus()
    If Not (EstUneChaine(txtNomClient.Text)) Then
        With txtNomClient
            'Se positionne à la position 0
            .SelStart = 0
            'sélectionne tout le texte
            .SelLength = Len(.Text)
            'remet le texte d'origine
            .Text = .Tag
'        End With
    End If
End Sub

Vue que je vais devoir le réécrire plusieurs fois, je me demandais si il était possible de faire une fonction générique qui ferait ceci :

With NomDeLObjet (car générique)

            'Se positionne à la position 0

            .SelStart = 0

            'sélectionne tout le texte

            .SelLength = Len(.Text)

            'remet le texte d'origine

            .Text = .Tag

'        End With

Merci encore pour ton aide.

beegees
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Continuons donc mes copier/coller de mes propres réponses (c'est vraiment ma journée !) :

Mais...


Je t'ai répondu, ami...


Ceci étant dit, tu n'as en outre, pour finalement ne faire que ceci, nul besoin d'une fonction (dont la vocation est de retourner une valeur), mais d'une procédure ... le principe restant à peu près le même que pour une fonction !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
Je vais condenser toutes ces bonne réponses de jmf0

Private Sub txtNomClient_LostFocus()
monTraitement txtNomClient
End Sub

Private sub monTraitement(ByRef voTxt As TextBox)
If Not Nothing Is voTxt Then
With voTxt
If Not (EstUneChaine(.Text)) Then
.Text = .Tag
End If
End With
End If
End Sub
Messages postés
152
Date d'inscription
mardi 4 novembre 2008
Statut
Membre
Dernière intervention
10 avril 2017
1
Bonjour Jmf0, Bonjour Rendfield,

Un tout grand merci pour vos réponses.

J'ai finalement suivi les conseils de Jmf0, j'ai mis dans un groupe de contrôle mes contrôles, c'est nettement plus efficace.

Je ne fais que passer mon contrôle et son index, cela me permet de n'écrire le code qu'une seule fois.

Voici mon nouveau code :

Private Sub txtNouveauClient_GotFocus(Index As Integer)
    'backup de la valeur existante au cas où l'utilisateur encoderait une valeur non acceptée
    With txtNouveauClient(Index)
        .Tag = .Text
        'MsgBox txtNouveauClient(Index).Tag
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub

Vous vouez apercevrez que j'ai gardé selstart et sellength, c'est juste pour que l'utilisateur retape une nouvelle donnée sans devoir sélectionner l'ancienne valeur.

Merci encore à vous deux.

beegees
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
plus simple que de jouer avec ces .Tag...

utilise la propriété Validate, qui sert précisément a ça.

Private Sub Text1_Validate(Cancel As Boolean)
Cancel = Not EstUneChaine(Text1.Text)
End Sub
Messages postés
152
Date d'inscription
mardi 4 novembre 2008
Statut
Membre
Dernière intervention
10 avril 2017
1
Re,

Merci pour l'information.

Je testerai Validate.

Encore merci à toi.

beegees