[VB6] probleme d'appel de fonction

Résolu
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 - 15 nov. 2006 à 13:46
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 27 nov. 2006 à 17:54
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

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 nov. 2006 à 16:56
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
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
15 nov. 2006 à 17:36
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
3
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
15 nov. 2006 à 13:52
Salut tof008 !
C'est sur l'appel de cette fonction que tu butte?

Public Function nbAttributs(proc As Object)

 Drikce 06
0
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 33
15 nov. 2006 à 14:00
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 
0

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

Posez votre question
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
15 nov. 2006 à 14:04
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
0
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 33
15 nov. 2006 à 14:22
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 
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
15 nov. 2006 à 14:24
Huuuuuuuu! Désolé trop compliqué pour moi ton truc! Bon courage!

 Drikce 06
0
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 33
15 nov. 2006 à 14:30
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 
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
15 nov. 2006 à 14:39
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
0
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 33
15 nov. 2006 à 15:57
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 
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
15 nov. 2006 à 16:00
J'y suis encore....
Et j'avance...

@+: Ju£i?n
Pensez: Réponse acceptée
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
15 nov. 2006 à 17:16
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 nov. 2006 à 17:22
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 nov. 2006 à 17:26
ps : à noter que je trouve les explications/contexte de tof008 un peu légère pour répondre correctement
0
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 33
15 nov. 2006 à 17:40
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 
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 nov. 2006 à 17:47
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
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
15 nov. 2006 à 17:47
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
0
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 33
15 nov. 2006 à 17:50
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 
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 nov. 2006 à 18:05
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 nov. 2006 à 23:27
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
0
Rejoignez-nous