Bonjour à tous et meilleurs vœux puisque c'est mon premier post pour 2012.
J'ai un problème avec la terminologie Krosoftienne et VB6.
Au départ j'ai une structure (Public Type) avec laquelle je remplis un tableau dynamique Public myArray() as MyType
J'avais prévu d'utiliser ma structure (au départ) dans une classe (donc les définitions ci-dessus sont Private). Mon tableau étant dynamique, à chaque utilisation, j'utilise le code suivant:
Private Sub AddReference()
ReDim Preserve p_aTVBPReference(X_UBound(p_aTVBPReference) + 1)
p_aTVBPReference(X_UBound(p_aTVBPReference)) = TVBPReference
End Sub
Private Function X_UBound(SArray As Variant) As Long
On Error GoTo EmptyArray
X_UBound = UBound(SArray)
Exit Function
EmptyArray:
X_UBound = -1
End Function
p_aTVBPReference étant mon tableau de structure
Le problème est sur la 1ère instruction (ReDim Preserve p_aTVBPReference(X_UBound(p_aTVBPReference) + 1) où j'obtiens l'erreur suivante (certifié sabir Krosoftien):
"Seuls les types publics définis par l›utilisateur dans les modules objet publics peuvent être utilisés comme paramètres ou types renvoyés pour les procédures publiques des modules de classe ou comme champs des types publics définis par l›utilisateur "
après plusieurs essais, j'ai converti ma classe en module (.BAS), les variables étant alors publiques.
Et là j'obtiens exactement la même erreur (ces fonctions étant de toutes façons à l'intérieur de ma classe/module).
Ce qui m'amène 2 questions:
- Quelqu'un voit-il où mon code pêche ?
- Et pour me coucher un tantinet moins bête ce soir, qu'appelle t'on exactement module d'objet public (pour moi c'est une classe) mais ce terme n'existe nulle pas dans l'aide VB6 (où je ne l'ai pas trouvé).
Bon...
On m'attend ailleurs.
Je vais donc de suite à l'essentiel,
On ne peut affecter au paramètre d'une fonction un tableau autre que Variant, ce qui n'est pas le cas d'un tableau d'éléments structuré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
Regarde, avec un tableau d'éléments structurés (différent d'une structure de tableaux) :
Private Type machin
un As String * 10
deux As String * 10
End Type
Dim toto() As machin
Private Sub Command1_Click()
'ReDim toto(3)
ReDim Preserve toto(titi() + 1)
toto(0).un = "a"
toto(0).deux = "b"
toto(1).un = "aa"
toto(1).deux = "bb"
For i = 0 To 1
MsgBox toto(i).un & vbCrLf & toto(i).deux
Next
End Sub
Private Function titi()
If Not (Not toto) Then
titi = UBound(toto)
Else
titi = 0
End If
End Function
Toujours avec un test simple.
____________________
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
____________________
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
fais-le dans un module normal (de formulaire), qu'on y voie clair pas à pas, dans un nouveau projet (et sans même réserver ton tableau à des structures). Le plus simple possible, quoi.
Et reprend ton exemple de code, avec appel de ta fonction.
Et dis-nous ce qui se passe.
Si marche pas : montre tout le code de ce nouveau minuscule projet, toutes déclarations incluses
____________________
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
Le code que je t'ai envoyé avec le tableau défini en As String fonctionne sans problème.
Par contre j'ai un autre problème avec ce que t'as demandé:
Option Explicit
Private Type VBPReference
Desc As String
GUID As String
Name As String
Path As String
Type As Integer
Version As String
End Type
Private TVBPReference As VBPReference
Public p_aTVBPReference() As VBPReference
Public Function GetVBPInfos() As VBPReference
Dim strLine As String, astrLine() As String, strKey As String, strVersion As String, X As Integer
TVBPInfos.Folder = BH_GetFolderName(P_strProjectName, True)
TVBPInfos.Version = BH_GetFileVersion(P_strProjectName)
Call p_oFSO.OpenFile("D:\Applications\ActiveX Controls\ADO Viewer\BH_ADOViewer.VBP", omcForReading, False, TristateUseDefault)
Do While Not p_oFSO.FileProperties().EndOfFile
strLine p_oFSO.ReadFile(rfcReadOneLine): astrLine Split(strLine, "=")
If BH_UBound(astrLine) >= 0 Then
Select Case UCase(astrLine(0))
Case "TYPE"
TVBPInfos.Type = P_oParams.GetInfoFromConstant("REFERENT_OLEDLL").SubKey
Case "REFERENCE"
TVBPReference = EmptyReference()
TVBPReference.Type = P_oParams.GetInfoFromConstant("REFERENT_OLEDLL").SubKey
TVBPReference.GUID = "{" & BH_DelimitedString(astrLine(1), "{}") & "}"
TVBPReference.Name = BH_GetFileName(BH_DelimitedString(astrLine(1), "#", 3), True)
TVBPReference.Desc = BH_GetRightString(astrLine(1), "#")
astrLine = Split(Trim(BH_GetFolderName(BH_DelimitedString(astrLine(1), "#", 3), True)), "")
TVBPReference.Path = BH_GetFolderName(Join(astrLine, ""), True)
TVBPReference.Version = BH_GetFileVersion(TVBPReference.Path & TVBPReference.Name)
' Call AddReference
Case "OBJECT"
TVBPReference = EmptyReference()
TVBPReference.GUID = "{" & BH_DelimitedString(astrLine(1), "{}") & "}"
TVBPReference.Name = Trim(BH_GetRightString(astrLine(1), ";"))
strKey = "TypeLib" & TVBPReference.GUID
strKey = strKey & "" & BH_RegEnumKey(HKEY_CLASSES_ROOT, strKey)(0)
Call BH_GetKeyValue(HKEY_CLASSES_ROOT, strKey, "", strVersion)
TVBPReference.Desc = strVersion
strKey = strKey & "" & BH_RegEnumKey(HKEY_CLASSES_ROOT, strKey)(0) 'strKey pas bon
strKey = strKey & "" & BH_RegEnumKey(HKEY_CLASSES_ROOT, strKey)(0)
Call BH_GetKeyValue(HKEY_CLASSES_ROOT, strKey, "", strVersion)
TVBPReference.Path = BH_GetFolderName(strVersion, True)
' Call AddReference(P_oParams.GetInfoFromConstant("REFERENT_OCX").SubKey)
TVBPReference.Version = BH_GetFileVersion(TVBPInfos.Path & TVBPInfos.Name)
Case "CLASS"
TVBPReference = EmptyReference()
TVBPReference.Name = BH_GetRightString(astrLine(1), "")
TVBPReference.GUID "": TVBPInfos.Desc ""
astrLine = Split(Trim(BH_GetRightString(astrLine(1), ";")), "")
For X = 0 To BH_UBound(astrLine)
If astrLine(X) = ".." Then
astrLine(X) = Split(p_oFSO.FileProperties.Folder, "")(X)
End If
Next
TVBPReference.Path = BH_GetFolderName(Join(astrLine, ""), True)
' Call AddReference(P_oParams.GetInfoFromConstant("REFERENT_CLS").SubKey)
End Select
End If
Loop
Call p_oFSO.CloseFile
End Function
Private Sub AddReference()
ReDim Preserve p_aTVBPReference(X_UBound(p_aTVBPReference) + 1)
p_aTVBPReference(X_UBound(p_aTVBPReference)) = TVBPReference
End Sub
Private Sub Form_Load()
TVBPReference = GetVBPInfos()
End Sub
Si je déclare mon tableau Public
Public p_aTVBPReference() As VBPReference
j'obtiens l'erreur suivante:
"Constantes, chaînes de longueur fixe, tableaux, types définis par l'utilisateur et instructions Declare non autorisés en tant que membres Public d'un module objet."
et si je le déclare Private
Private p_aTVBPReference() As VBPReference
j'obtiens une autre erreur
"Les types énumérés privés et les types définis par l›utilisateur ne peuvent pas être utilisés comme paramètres ou valeurs de retour pour les procédures publiques, comme données des membres publics ou comme champs des types publics définis par l›utilisateur".
On tourne en rond là. Il resterait les tableaux à X dimensions (très peu pratique ou un recordset déconnecté ce qui me parait un peu lourd mais aucune difficulté par contre.
Tu peux copier direct dans un formulaire d'un projet vierge.
Tu peux remplacer le VBP dans l'instruction
Call p_oFSO.OpenFile("D:\Applications\ActiveX Controls\ADO Viewer\BH_ADOViewer.VBP"
par n'importe quel VBP perso' que j’ouvre avec une classe perso utilisant FSO.
je t'ai dit pas à pas sur du très simple !
Si tu l'avais fait, comme je te l'ai demandé, tu saurais déjà (et ce n'est pas tout), que ta déclaration de structure est incomplète, tu aurais ouvert ton aide VB6, aurais lu et ... corrigé ce premier aspect, au lieu de nous inondé d'un code autre que test simple, comme demandé !
Veux-tu faire comme je te l'ai demandé, s'il te plait ? (je n'aime pas que l'on fonce la tête en avant sans faire d('abord ces petits tests salutaires).
____________________
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
Analyse et comprends cette voie de contournement :
Private Type machin
un As String * 10
deux As String * 10
End Type
Dim toto() As machin
Private Sub Command1_Click()
MsgBox titi()
ReDim Preserve toto(titi() + 1)
MsgBox titi()
End Sub
Private Function titi()
If Not (Not toto) Then
titi = UBound(toto)
Else
titi = 0
End If
End Function
Tu vois ? Rien de mieux qu'un petit test "séparé" (en dehors de ton appli), pour mieux cerner.
Bon week-end
____________________
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
____________________
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
Excuse je n'avais pas vraiment compris ce que tu m'avais demandé.
Néanmoins j'ai lu l'aide en ligne et corrigé comme suit et ça marche.
Private Type VBPReference
Desc() As String
GUID() As String
DLLName() As String
Path() As String
DLLType() As Integer
Version() As String
End Type
Private TVBPReference As VBPReference
Bien,
mais là, tu as fait autre chose : tu utilises cette-fois ci une structure de tableaux et non "un tableau d'éléments structurés selon une structure.
____________________
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
Ben...
10 ou ce que tu veux ... (pouvant être différent pour l'un et pour l'autre) et tu prends meilleur soin de ton outil
Private Type machin
un As String
deux As String
End Type
Et tu n'es plus limité (et tant pis pour ton outil).
Le reste identique
____________________
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