Lister les sub d'une form [Résolu]

Signaler
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018
-
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018
-
Bonjour

j'ai besoin d'obtenir la liste (les noms plus exactement) des Private Sub, Public Sub, Function, et Sub présentes dans une Form
exemple avec le code suivant, je voudrais que cela me ressorte
- Cherche_Click
- Afficher_Click
- Calcule

**************************************************************
Option Explicit
Public c As Control
__________________________________________________________
Private Sub Cherche_Click()
MsgBox t & " Pas Trouvé", vbOKOnly, "Dommage !!"
End Sub
__________________________________________________________
Private Sub Afficher_Click()
MsgBox "C'est pas Cela !!"P, vbOKOnly, "Recommence !!"
End Sub
__________________________________________________________
Sub Calcule()
t = val(t) +5
End Sub
**************************************************************

D'avance merci ...

Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!

21 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
voir
CallByName

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
- ou tu fais ton propre code pour "parser" les fichiers de ton projet (réalisable)
- ou tu utilises un outil ad-hoc, tel MZ TOOLS ===>>
Tapez le texte de l'url ici.
qui fait cela et bien plus encore

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018

Bonjour ucfoutu ... et merci de ta réponse ...
mais ce n'est pas exactement ce que je recherche ...

je t'explique un peu plus en détails ...
Voilà .. J'aimerai utiliser un fichier JSON pour faire passer des données et des instructions d'une tablette sous Android, à un ordi ayant un programme que j'ai fait en VB6.
Je génère mon JSON, et je l'interprète sans soucis ... sauf qu'une partie de mes instructions sont en "dur", ce qui limite les possibilités, et m'oblige à de nombreuses modifications à chaque fois
... exemple de fichier JS


******************** Fichier JSON ********************
[
{'call':
{
'Forme':'Form1','fonction':'affiche'
}},
{'alert':
{
'message':'voilà !!','title':'Test JSON'
}}
]
******************************************************


dans le cas présent, coté interpréteur (VB6), j'ai pu "retrouver" le nom de la form grâce à ces lignes de code:


******************** Module VB6 ********************** Case "call":
Dim frm As Form

For Each frm In Forms
If frm.Name = ExecCommand(this.Item("Forme")) Then Exit For
Next
Call frm.affiche
******************************************************

Mais dans le call, le "affiche" est une procédure Sub existante ...et je voudrais faire une sorte de boucle comme pour trouver la Form style:

******* For Each procédure In Forms.procédure ********

De cette manière, je pourrai faire passer en argument n'importe quel nom de form, et n'importe quel nom de Sub (se trouvant sur cette même form), et la lancer !

J'espère ne pas être trop confus dans mes explications .. !! lol !

Merci à celui ou celle qui se penchera sur mon problème ...

Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Plus rien à voir avec la demande exprimée dans ton premier message (facilement traitée, elle, par un outil tel que MZ TOOLS) !
Bonne chance. Je te laisse pile là.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
14772
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 mars 2021
151
Bonjour,

Ce que tu demande est, je pense, impossible si tu cherches à lister les membres des forms.
En VB6, il n'y a pas de système qui fait cela.
Par contre en .NET, il y a Reflection.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
tu peux te faire un addon a l'IDE, ou te brancher a la compil, lorsque ton code appelle Link

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018

il n'y aurait aucune "collection" (accessible par code) qui contiendrait le nom des membres des forms, comme il y en existe pour les contrôles ?
une sorte de squelette, de map, ou de schéma un peu comme pour une base de données ? ... VB ce la crée bien, puisqu'il rajoute les membres et objets nouveaux dans la liste déroulante du projet ... on ne peux pas y faire référence ?

j'ai bien pensé à faire un "annuaire" ... mais c'est un peu lourd pour l'usage qui m'intéresse !


Renfield> "tu peux te faire un addon a l'IDE, ou te brancher a la compil, lorsque ton code appelle Link "

Je suis un peu NewBeez dans ce type d'utilisation de VB ... peux tu détailler un peu s'il te plait ... ou si quelqu'un à une idée plus à ma portée....

Merci d'avance ..

Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Tu as toutes les Forms d'un projet dans son fichier VBP, sous VB6 (qu'il te suffit donc de parser)
Cela est facilement réalisable par code. Il est clair que ce code ne saurait être celui du projet concerné lui-même, sauf à ouvrir d'emblée tous les Forms, puisque, en mode exécution, la collection Forms ne contient que les Forms chargés.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

Bonjour,
Tu peux également lire tous les fichiers .frm correspondants à tes Forms.
A ne pas oublier de les enregistrer à chaque fois que tu fais un essai.
Private Sub Command1_Click()
'A ne pas oublier le: text1.MultiLine = True
Text1.Text = ""
Dim St As String
Dim i As Long
Open App.Path & "\Form1.frm" For Input As #1
Do While Not EOF(1)
   Line Input #1, St
   i = InStr(1, St, "Sub")
   If i > 0 And InStr(1, Left(St, i), "'") 0 Then 'InStr(1, Left(St, i), "'") 0 ==>> on ne prend pas en compte les commentaires
      If (InStr(1, St, "Private Sub") > 0 And i = 9) Or _
         (InStr(1, St, "Public Sub") > 0 And i = 8) Or _
         (InStr(1, St, "Friend Sub") > 0 And i = 8) Or _
         (InStr(1, St, "Static Sub") > 0 And i = 8) Or _
         i = 1 Then AfficheLeNom St, i + 4, "[Sub] "
   End If
   i = InStr(1, St, "Function")
   If i > 0 And InStr(1, Left(St, i), "'") 0 Then 'InStr(1, Left(St, i), "'") 0 ==>> on ne prend pas en compte les commentaires
      If (InStr(1, St, "Private Function") And i = 9) > 0 Or _
         (InStr(1, St, "Public Function") > 0 And i = 8) Or _
         (InStr(1, St, "Friend Function") > 0 And i = 8) Or _
         (InStr(1, St, "Static Function") > 0 And i = 8) Or _
         i = 1 Then AfficheLeNom St, i + 9, "[Fonction] "
   End If
Loop
Close
End Sub

Private Sub AfficheLeNom(Phrase As String, Debut As Integer, Genre As String)
   Text1.Text = Text1.Text & Genre & Mid(Phrase, Debut, (InStr(Debut, Phrase, "(") - Debut)) & vbCrLf
End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Pour lire tous les fichiers avec un FileListBox (sans oublier les module *.bas):

Private Sub Command1_Click()
'A ne pas oublier le: text1.MultiLine = True
Text1.Text = ""
Dim St As String
Dim i As Long
Dim FichIndex As Integer
File1.Path = App.Path
File1.Pattern = "*.frm;*.bas"

For FichIndex = 0 To File1.ListCount - 1
Open File1.Path & "" & File1.List(FichIndex) For Input As #1
Do While Not EOF(1)
   Line Input #1, St
   i = InStr(1, St, "Sub")
   If i > 0 And InStr(1, Left(St, i), "'") 0 Then  'InStr(1, Left(St, i), "'") 0 ==>> on ne prend pas en compte les commentaires
      If (InStr(1, St, "Private Sub") > 0 And i = 9) Or _
         (InStr(1, St, "Public Sub") > 0 And i = 8) Or _
         (InStr(1, St, "Friend Sub") > 0 And i = 8) Or _
         (InStr(1, St, "Static Sub") > 0 And i = 8) Or _
         i = 1 Then AfficheLeNom St, i + 4, "[Sub] "
   End If
   i = InStr(1, St, "Function")
   If i > 0 And InStr(1, Left(St, i), "'") 0 Then 'InStr(1, Left(St, i), "'") 0 ==>> on ne prend pas en compte les commentaires
      If (InStr(1, St, "Private Function") And i = 9) > 0 Or _
         (InStr(1, St, "Public Function") > 0 And i = 8) Or _
         (InStr(1, St, "Friend Function") > 0 And i = 8) Or _
         (InStr(1, St, "Static Function") > 0 And i = 8) Or _
         i = 1 Then AfficheLeNom St, i + 9, "[Fonction] "
   End If
Loop
Close
Next
End Sub
Private Sub AfficheLeNom(Phrase As String, Debut As Integer, Genre As String)
   Text1.Text = Text1.Text & Genre & Mid(Phrase, Debut, (InStr(Debut, Phrase, "(") - Debut)) & vbCrLf
End Sub

Sub Test1()
Exit Sub
End Sub
Function Test2()
Exit Function
End Function

Private Sub Command2_Click()
Test1
End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

If i > 0 And InStr(1, Left(St, i), "'") = 0 Then


Au fait on a pas besoin de ça...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
une regexp et c'est parti :

^(Private |Public |Global |Friend )? *\bSub +([A-Z][\w_@&$]+)

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
gaffe aux sub en commentaire, acive


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
gaffe aux sub en commentaire, acive


Bonjour, Renfield.
Pas uniquement !
J'en connais plus d'un (dont moi, hélàs) qui n'hésitent pas, en mode création et d'évolution ou tests du projet, à :
- pour les procédures évènementielles : ajouter un "anc" devant le nom de la procédure pour la garder (au cas où) et à la remplacer par le vrai nom pour le test. C'est une sorte d'inhibition puisqu'elle ne sera pas exécutée avec ce nom-là.
- à créer des procédures qui ne sont pas finalement toutes utilisées (des tests)

Le nettoyage, une fois le projet définitivement "arrêté" demande alors beaucoup de soins. Il est généralement facilité par l'ajout de commentaires signalant les "endroits", genre '<<<<<<<<==============================

Hé oui !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Je me rappelle, dans le genre, le travail considérable qu'il a fallu faire pour procéder à un certain nettoyage (sous l'OS Pick Ultimate) : des pointeurs PQ créés en tests par divers utilisateurs un peu partout dans des comptes (problème : certains restaient nécessaires et d'autres ne faisaient que polluer inutilement). Existence de programmes et de PROCs qu'aucun programme autre n'utilisait, etc ...
J'avais à l'époque fait une "moulinette" capable de les repérer et de les lister, en vue de leur suppression. Pour y parvenir, cette moulinette a "travaillé" pendant deux nuits entières. Pardi : pour chaque "élément" à vérifier, il fallait analyser chacun de tous les autres "éléments" présents
Tu vois le genre ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

Salut Renfield et Ucfoutu,

gaffe aux sub en commentaire, acive

If (InStr(1, St, "Private Sub") > 0 And i = 9) Or _
         (InStr(1, St, "Public Sub") > 0 And i = 8) Or _
         (InStr(1, St, "Friend Sub") > 0 And i = 8) Or _
         (InStr(1, St, "Static Sub") > 0 And i = 8) Or _
         i = 1 Then AfficheLeNom St, i + 4, "[Sub] "

Un commentaire ne sera jamais affecté par les conditions ci-dessus, au pire i sera égal à 2.
(pour un 'Sub i sera égal à 2, ainsi que pour les Exit Sub qui sont aussi gérés)

J'avais pensé à ça en mettant:
If i > 0 And InStr(1, Left(St, i), "'") = 0 Then

Mais en réfléchissant bien on en a pas besoin du 'InStr(1, Left(St, i), "'") = 0'


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Après si nous avons d'autres types de Subs comme
^(Private |Public |Global |Friend )? *\bSub +([A-Z][\w_@&$]+)

C'est à lui de l'ajouter dans la liste, et s'il y en a beaucoup il faudrait faire la "moulinette" à UCfoutu.

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
MZ Tools (gratuit) sait faire beaucoup de ces choses là (et plus encore).
Il suffit de l'appliquer à tous les fichiers du projet.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018

Bonjour e merci beaucoup pour tout cela ...

je le testerai et je vous tiendrai au courant ..

encore merci !!


Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018

Bonjour

j'ai un peu regardé ce que vous m'avez passé comme code ... je peux donc "parser" la form et retrouver le nom du "Sub" qui m'intéresse, mais je ne peux toujours pas "lancer" le "call" ...

rappel du post precedent
******************* Module VB6 **********************
Case "call":
Dim frm As Form

For Each frm In Forms
If frm.Name = ExecCommand(this.Item("Forme")) Then Exit For
Next
Call frm.affiche
******************************************************

içi frm est le nom de ma form, et "affiche" est le nom du "Sub", mais en "dur ...
j'aimerai arriver à le lancer via une variable ex TOTO ... dans laquelle je mettrai le nom du sub ... içi "affiche" ... comme ça, je n'ai qu'à changer la valeur de TOTO pour que ma moulinette lance n'importe quel sub voulu !

*******************************
ex:
TOTO = "affiche"
call frm.TOTO
*******************************

y a t'il une solution ? ... un peu comme avec les bases de données et les [ ] ... ?
Merci de votre aide ...

Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!