Module d'Objet Public [Résolu]

Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 21 janv. 2012 à 09:54 - Dernière réponse : Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention
- 21 janv. 2012 à 11:54
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é).

Merci d'avance pour vos réponses.

Calade
Afficher la suite 

14 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 11:05
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 11:32
+3
Utile
Tu as compris la nuance ?

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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 10:17
0
Utile
Bonjour, Calade,

Où as-tu déclaré ton tableau de structures ?


____________________
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
Commenter la réponse de ucfoutu
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 21 janv. 2012 à 10:21
0
Utile
Bonjour et merci de ta réponse,

En Private dans ma Classe
en Public dans mon module .BAS

(l'un ou l'autre bien sur puisque j'ai fait les deux essais infructueux).


Calade
Commenter la réponse de Calade
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 10:27
0
Utile
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
Commenter la réponse de ucfoutu
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 21 janv. 2012 à 10:52
0
Utile
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.

Calade
Commenter la réponse de Calade
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 10:58
0
Utile
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 11:16
0
Utile
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 11:20
0
Utile
____________________
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
Commenter la réponse de ucfoutu
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 21 janv. 2012 à 11:21
0
Utile
Salut ucFoutu,

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


Merci encore pour tout

Calade
Commenter la réponse de Calade
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 11:26
0
Utile
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
Commenter la réponse de ucfoutu
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 21 janv. 2012 à 11:40
0
Utile
A mon avis ce n'est pas du tout pareil.
Effectivement dans ma dernière mouture j'utilise une structure de tableaux, mais toi, dans ta définition:

Private Type machin
un As String * 10
deux As String * 10
End Type

chaque élément de la structure est limité à 10 caractères et on en revient à mon problème (j'ai essayé).

Bon mais ma solution en gérant un indice moi-même au lieu de le calculer (c'est l'objet de fonction X_UBound) fonctionne, je vais donc en rester là.

Merci encore pour ton aide


Calade
Commenter la réponse de Calade
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2012 à 11:47
0
Utile
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
Commenter la réponse de ucfoutu
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 21 janv. 2012 à 11:54
0
Utile
Non ce n'est pas la limitation à 10 caractères qui pose problème, c'est la définition.

Apparemment passer un tableau de structures en paramètres à une fonction ne lui plais pas. C'est ce que j'ai compris du message.

Ton code ne fait que confirmer (par une structure toute simple il est vrai) qu'il n'aime pas ça.


Calade
Commenter la réponse de Calade

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.