Lister les sub d'une form

Résolu
erefdatacomputing Messages postés 165 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 24 avril 2018 - 26 févr. 2012 à 16:15
erefdatacomputing Messages postés 165 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 24 avril 2018 - 2 mars 2012 à 22:29
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 mars 2012 à 14:02
voir
CallByName

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 févr. 2012 à 16:26
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
0
erefdatacomputing Messages postés 165 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 24 avril 2018
26 févr. 2012 à 21:16
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 !!!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 févr. 2012 à 21:23
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
26 févr. 2012 à 22:48
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 févr. 2012 à 06:48
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
0
erefdatacomputing Messages postés 165 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 24 avril 2018
27 févr. 2012 à 09:38
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 !!!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 févr. 2012 à 10:04
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
0
Utilisateur anonyme
27 févr. 2012 à 14:37
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
0
Utilisateur anonyme
27 févr. 2012 à 15:29
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
0
Utilisateur anonyme
27 févr. 2012 à 15:51
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 févr. 2012 à 05:39
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 févr. 2012 à 05:39
gaffe aux sub en commentaire, acive


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 08:34
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 08:43
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
0
Utilisateur anonyme
28 févr. 2012 à 23:37
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
0
Utilisateur anonyme
28 févr. 2012 à 23:50
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 08:05
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
0
erefdatacomputing Messages postés 165 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 24 avril 2018
29 févr. 2012 à 12:42
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 !!!
0
erefdatacomputing Messages postés 165 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 24 avril 2018
2 mars 2012 à 13:44
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 !!!
0
Rejoignez-nous