[VB6] probleme d'appel de fonction [Résolu]

Signaler
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour,
J'ai une fonction :
Public Function nbAttributs(proc As Object)
Dim Contenu As String
Dim Fso As New FileSystemObject
Dim p As Procedure





Sc.Language = "VBScript"
Call Sc.AddCode(proc)





    MsgBox "Procédure " & p.Name & " possède " & p.NumArgs & " Parametre"

   
Set Sc = Nothing



End Function  '(Merci Julien)



Qui devrait me permettre de trouver le no,bre d'arguments qui sont passés à une fonction ou a une procedure.
Le problême; c'est que je n'arrive pas à appeler cette fonction.
Je fais de la maniere suivante :

Ecrit.nbAttributs test()
ou
Ecrit.nbAttributs test("arg1","arg2",false)

et je recois ce message d'erreur :
compile error: argument not optionnal avec test surligné. Quelqu'un pourrait il me débloquer?
Merci d avance!





         (Si la réponse vous convient, appuyez sur réponse acceptée...).




                           Noubliez pas de lire le REGLEMENT 

24 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
salut,

une piste?

'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

' poser une ListBox (très large) et un Bouton, enregistrer le
projet avant d'executer

'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Option Explicit

Private Sub Command1_Click()
    List1.Clear

'   ouverture du
fichier
    Dim sFile$
    sFile =  GetFile(App.Path & "\Form1.frm")

'   on vire les trucs inutiles
    sFile = Replace(sFile, "Private", vbNullString)
    sFile = Replace(sFile, "Public", vbNullString)
    sFile = Replace(sFile, "Friend", vbNullString)
    sFile = Replace(sFile, "Global", vbNullString)
    sFile = Replace(sFile, "ByVal ", vbNullString)
    sFile = Replace(sFile, "ByRef ", vbNullString)
    sFile = Replace(sFile, "Optional ", vbNullString)

'   tableau du
fichier
    Dim aFile$()
    aFile = Split(sFile, vbCrLf)
    
'   tri des
procédures et fonctions
    Dim i&, sBuffer$, aRes$()
    ReDim aRes(0)
    For i = 0 To UBound(aFile)
        aFile(i) = Trim$(aFile(i))
        sBuffer = MyLeft(aFile(i), "
")
        If sBuffer = "Sub" Or sBuffer = "Function" Then
            ReDim Preserve aRes(UBound(aRes) + 1)
            aRes(UBound(aRes)) = aFile(i)
        End If
    Next i

'   travail sur ces
résultats
    Dim sParams$, aParams$(), j%
    For i = 1 To UBound(aRes)
'       SAUVE sub ou fonction
        sBuffer = MyLeft(aRes(i), "
", True) & " -> "
'       params
        sParams = MyMid(aRes(i), "(", ")")
'       SAUVE nom
        sBuffer = sBuffer & MyLeft(aRes(i), "(") & "
["
        
'       params en
tableau
        Erase aParams
        aParams = Split(sParams, ",")

'       SAUVE
NbArgs
        sBuffer = sBuffer & CStr(UBound(aParams) + 1) & "]
"
        For j = 0 To UBound(aParams)
'           SAUVE
Args
            aParams(j) = Trim$(aParams(j)) & " "
            sBuffer = sBuffer & MyLeft(aParams(j), " ") & "~"
        Next j
        
'      
édite
        List1.AddItem LeftB$(sBuffer, LenB(sBuffer) - 2)
        List1.AddItem "----------------"
    Next i

'   destroy :p
    Erase aParams
    Erase aRes
    Erase aFile
End Sub

Private Function GetFile(ByVal sPath As String)
    Dim FF As Integer
    FF = FreeFile
    Open sPath For Input As #FF
        GetFile = Input(LOF(FF), #FF)
    Close #FF
End Function

Private Function MyLeft(ByRef sStr As String, sSepar As String, Optional sDelete As Boolean = False) As
String
    Dim lPos As Long
    lPos = InStr(1, sStr, sSepar)
    
    If lPos = 0 Then
        MyLeft = vbNullString
    Else
        MyLeft = LeftB$(sStr, (lPos * 2) - 2)
        If sDelete Then sStr = RightB$(sStr, LenB(sStr) - LenB(MyLeft) - LenB(sSepar))
    End If
End Function
'
Private Function MyMid(ByVal sStr As String, sSeparL As String, sSeparR As String) As String 'pas utilisée
    Dim lPosL As Long
    Dim lPosR As Long
    lPosL = InStr(1, sStr, sSeparL)
    lPosR = InStr(lPosL + 1, sStr, sSeparR)
    
    If lPosL = 0 Or lPosR = 1 Then
        MyMid = vbNullString
    Else
        sStr = LeftB$(sStr, (lPosR - 1) * 2)
        MyMid = RightB$(sStr, LenB(sStr) - lPosL * 2 - LenB(sSeparL) + 2)
    End If
End Function
'
Private Function MyRight(ByRef sStr As String, sSepar As String, Optional sDelete As Boolean = False) As
String
    Dim lPos As Long
    lPos = InStr(1, sStr, sSepar)
    
    If lPos = 0 Then
        MyRight = vbNullString
    Else
        MyRight = RightB$(sStr, LenB(sStr) - lPos * 2)
        If sDelete Then sStr = LeftB$(sStr, lPos * 2 - LenB(sSepar))
    End If
End Function

<small>Coloration
syntaxique automatique [AFCK] </small>
       

++
PCPT  [AFCK]
<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
56
Re,
D'apres ce que j'ai compris il souhaiterait faire comme un explorateur d'objet. mais il ne veux pas passer par un fichier.
C'etait ce que j'avais proposé avec un Script Control en récupant le code. mais il ne veux pas.

En revanche je viens de trouver un truc interressant en utilisant TypeLib Information
Et il semblerait à premiere vue que cela pourrait repondre à son problème.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
10
Salut tof008 !
C'est sur l'appel de cette fonction que tu butte?

Public Function nbAttributs(proc As Object)

 Drikce 06
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
27
Salut  786090 Drikce06 ca faisait un moment lol!
Non en fait c'est plutot ici : Ecrit.nbAttributs test("arg1","arg2",false)

Et je recois comme message "Object required". En fair le code de la fonction m'a était donné par jrivet, mais dans son code, il utilise un fichier text qui contient des procedures...

Contenu = Fso.OpenTextFile("C:\Test.txt", ForReading).ReadAll
Sc.Language = "VBScript"
Call Sc.AddCode(Contenu)
Seulement moi, ce que je veux, c'est trouver le no,bre d'arguments d'une proc ou d'une fonction et pour des raisons de gain de temps et de sécurité, je ne peux pas mettre toutes mes fonctions et proc dans un fichier ) disposition de l'utilisateur...
J'espere que tu pourra m'aider!

         (Si la réponse vous convient, appuyez sur réponse acceptée...).

                           Noubliez pas de lire le REGLEMENT 
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
10
lol! Oui ça faisait un moment!
Et si tu ouvre par exemple un .bas ou .frm avec notepas.exe, c'est comme si tu lisait un fichier texte non?

 Drikce 06
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
27
ben justement, mes fonctions ne sont pas au même endroit que mon logiciel.
Ce que je voudrais faire, c'est que lorsque qu'il y a appel de fonction par ex si le client click sur le bouton associé a getListeClient qui demande comme argument l'ID du client, ma fonction me retourne 1 (pour un argument...).
Par la suite je met tout ca dans un fichier xml qui va aller chercher sur le serveur la fonction et la lancer grace a l'argument...
Il me fau ce nombre d'argument pour que je puisse faire une boucle qui me comptera et me mettra chaque argument dans la balise xml correspondante. J'espere que c clair comme ca....!

         (Si la réponse vous convient, appuyez sur réponse acceptée...).

                           Noubliez pas de lire le REGLEMENT 
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
10
Huuuuuuuu! Désolé trop compliqué pour moi ton truc! Bon courage!

 Drikce 06
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
27
ouais ben c'es plus que du courage, c'est un miracle qu il va me falloir... ou quelqu'un qui a deja rencontré ce probleme...

         (Si la réponse vous convient, appuyez sur réponse acceptée...).

                           Noubliez pas de lire le REGLEMENT 
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
56
Salut, (re)
Que les experts me corrigent car je suis pas sûr de ce que je vais raconter.

Je suis en train de faire des recherches (problème tres interresant)
Je pense qu il faut essayer de regarder du côté de Microsoft Visual Basic For Applications Extensibility  5.3
Ca parait barbare comme nom... En tout cas cette référence te permet d'utiliser les Objet VBE (qui d'apres ce que j'ai compris represente l'environnement Visual BAsic)

Alors j'ai pas encore regarder en profondeur (mais ca a l'aor coton quand meme) en plus je suis même pas sur que cela t'aidera

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
27
Re julien...
Bon, cette fois je remet ca a demain, parce que la je suis sur une piste un peu moins propre que celle que j'avais envisagée, mais beaucoup plus longue! Alors je vais finir ca ce soir, et demain je me penche sur ta solution et j'essaie de voir si effectivement cette solution peut marcher!!!!
Mais la, trop de recherche tue la recherche, et j'en ai marre de lire des tutos ou des explications dans toutes les langues du monde (lol!) tout ca pour economiser une centaine de lignes de codes!!!


Par contre je te remercie de t'être penché sur mon problème si longuement!!!
C'est là qu'on voit les gens qui ont la soif de savoir!





         (Si la réponse vous convient, appuyez sur réponse acceptée...).




                           Noubliez pas de lire le REGLEMENT 
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
56
J'y suis encore....
Et j'avance...

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
56
SAlut 401740 PCPT
Qu est ce que tu pense de la maniere avec VBIDE.VBE (c'est coton a comprendre d'ailleurs)

Sinon j'explore aussi une autre possibilité qui est en essayant d'utiliser la TypeLib Information mais je sèche un peu... j ai trouve un exemple chez M$ mais cela marche sur des ocx, dll

Peu être en conjugant les deux...
Ou alors je vais tout à fait fausse route
@+: =89254 Ju£i?n
Pensez: Réponse acceptée
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
salut jrivet,
pour être honnête que je n'ai que survolé les topics (celui-ci et le précédent de tof008), et plus ou moins idem pour les réponses apportées.

VBIDE.VBE n'est une bonne piste que si le but est un AddIn (chose que je n'ai pas lu).
c'est un peu abusé de ma part (mille excuses) mais si tu veux bien me résumer (avec précision néanmoins) ce que tu veux, cad la piste que tu veux explorer, et les infos que tu as trouvé ou qui te posent problème, je chercherai avec toi

++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
ps : à noter que je trouve les explications/contexte de tof008 un peu légère pour répondre correctement
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
27
Bon, alors je t'explique ce que je veux :
sur le fond c'est assez simple : je veux créer une fonction qui  lorsque je lui donne en parametre une fonction et ces attributs (ex : addCustomer(nom,prenom)) je veux qu'elle me compte le nombre de parametre de cette fonction, (dans ce cas précis 2) et qu'elle me les donne. Donc dans ce cas, je veux que ma fonction me retourne 2 et nom et prénom.
Le but de cette manoeuvre etant de pouvoir par la suite entrer tout ca dans un fichier xml qui comprendra, entres autres :
<fonction name "addCustomer" nbAtt "2">
   
   
<fonction\>

Ce fichier sera par la suite transmis au serveur qui va extraire les infos pour aller chercher dans un fichier WSDL la fonction correspondante puis renverra par xml aussi les resultats qui s afficheront chez le client...

Voila, j'espere avoir été clair, et j'espere surtout que vous pourrez me filer un coup de main ( à ce propos encore merci jrivet pour ton obstination. et merci PCPT pour ton interet!)

Juste pour précision, c'est essentiellement le fait de reussir a recuperer le nombre et la valeur des attributs qui me pose probleme Pour l'envoi ainsi que la presentation dans le fichier xml, les gros prob sont deja reglés.

Pour le moment, en attendant une solution, j'ai entré en dur le nombre d attributs de chaque fonction. Je pourrai rester sur cette idée, mais cette fonction me tient à coeur, c'est presque devenu un défi lol!
         (Si la réponse vous convient, appuyez sur réponse acceptée...).
                           Noubliez pas de lire le REGLEMENT 
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
tof008
-> avec le code que je t'ai fourni, çà devrait te convenir. reste plus qu'à faire çà sous forme de 2 classes ou un module et c'est tout bon...

jrivet -> je regarde ton lien et te donne suite

<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
56
Salut,
je crois que la piste du TypeLib Information n'est pas mauvaise. Voici le lien de l'aide de M$
Dans la section Code Samples il y une section Custom Object Browser Basics :=> Pas le temps de lire mais je pense que cela devrait être utilie
@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
27
Ce qu'il y a c'est que mon but est d'enlever le fichier WSDL du coté client. Alors si à la place je lui met un fichier text qui contient toutes mes methodes, ca ne sert à rien, c'est pour ca que je ne voulais pas passer par un fichier. Par contre j'ai survolé le lien que tu as envoyé et ca ressemble effectivement a ce que je veux... Je regarderais ca ce soir ou demain.... et je vous tiens au courant!


Merci beaucoup





         (Si la réponse vous convient, appuyez sur réponse acceptée...).




                           Noubliez pas de lire le REGLEMENT 
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
jrivet
-> tlbinf32, je l'avais (sans doute fournie avec SP6 de VB)
lien wiki, déjà j'apprend qu'il y a des sources, c'est très bon à savoir.
et pour le projet en particulier, extrêmement intéressant !
par contre dans l'optique (mal définie, ou mal comprise pour ma part en tout cas) voulue, çà me semble "trop" pour "peu" !
le but est l'accès aux fonctions après compilation? simple listage il me semble, ce qui n'est pas le cas dans l'exemple fourni (wiki)

j'vais faire un exemple plus propre et héberger...

nb : ce qui me choque avec cette tlb : çà laisse une énorme porte ouverte pour l'accès (source) d'un exe compilé
++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
désolé mais là j'ai plus le courage....
j'avais terminé, réussi tout comme il faut, avec accès par objet (3 classes), affichage RTB, treeview, WebBrowser, sauf que j'ai oublié de renommer le fichier de sortie (exemple : Frm_Main.frm en Frm_Main.frm.XML)

résultat, comme je testais avec les fichiers code, beh écrasement !
c'est faisable et pas très compliqué mais là je passe la main
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp