Toute les form d'un projet (VB6) [Résolu]

Messages postés
1100
Date d'inscription
mercredi 22 mars 2006
Dernière intervention
15 avril 2018
- - Dernière réponse : Polack77
Messages postés
1100
Date d'inscription
mercredi 22 mars 2006
Dernière intervention
15 avril 2018
- 7 déc. 2007 à 10:52
Bonjour ,

Je développe actuellement une fonction (en VB6) qui reçois le nom d'un form en string et qui dois : charger + afficher + retourné le handle de la form portant ce nom.

Problème cette fonction vas être utilisé dans plusieurs projets et ces dit projets doivent évoluer (relativement rapidement) par la suite. Je ne veut pas avoir à adapté cette fonction pour chaque projet et à l'ajout de chaque Form (donc pas possible de crée une variable par form existant dans le projet).

Une solution à ces différentes options me permettrais de réalisé mon objectif :
1) Je sait que 'Forms' me permet d'accèder à tout les form chargé d'un projet. Est-il possible de chargé, grâce à une boucle (ou autre 'truc' du genre), tout les form d'un projet ?

2) En VB.NET il existe la réflection (ce qui permet de faire ça ). L'équivalent existe t'il en VB6 ?
Code VB.Net :
   
Dim MyAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetCallingAssembly()
        ' On itère sur tous les types présents dans l'assembly
        For Each MyType As System.Type In MyAssembly.GetTypes
            'Si le type est bien une class (en dot.net les form sont des class)
            If MyType.IsClass Then
                ' On teste le nom du type

                Try

               
   
If MyType.Name = NomForm Then

                   
    Try

   
                   
   
Dim myForm As System.Windows.Forms.Form

   
   
                   
[........]

                   
    Catch 'Gestion d'erreur d'ouverture du form (évite simplement en cas d'erreur de croire que la class n'a pas de nom ;) )

                   
    End Try

                Catch 'Si on arrive ici c'est que la calss n'a pas de nom, donc ce n'est pas une form (en faite je ne sait pas si c'est possible mais bon ça coute rien ;) )

                End Try


3) Est-il possible de crée un 'truc' en VB.NET (un peut du genre d'un ocx ou d'un dll) utilisable en VB6. Dans ce cas j'utiliserais le code du dessus mais j'ai tester avec un 'ClassLibrary' (qui sort un '.dll') et le compilo (VB6) me renvoie une erreur :
- Soit "Can't find DLL entry point ..." (avec "Private Declare Function OuvreFormRetHandle Lib "ChemainComplet\AppForms New.dll" (ByVal NomForm As String) As Long" )
- Soit "Can't add a reference to the specified file." quand je passe par 'Project'/'Références'
De plus le type Form n'existe pas avec un 'ClassLibrary' ("Error 1 Type  'System.Windows.Forms.Form' is not defined.") Donc convertie en 'Object'

Je ne sait plus quoi tester "HELP ME" !!!
S.V.P. .

Amicalement
Pensez "Réponse acceptée"
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
3
Merci
salut à tous,

euh non, il n'y a pas (à ma connaissance) de possibilité de lister les fenêtres non-chargées
par contre à défaut d'ajouter un variable par fenêtre, tu peux centraliser leur nom dans un tableau...

pour ta demande il n'y aura pas de solution miracle.....
à la limite, si le problème est de maintenir selon le nombre de forms (on peut supposer qu'il y en a beaucoup) tu peux faire une classe qui ne va lister en qu'en IDE... et enregistrer sous forme de fichier texte pour la version EXE

çà donnerait à peu près çà :

'   PCPT AFCK // 06 dec 2007
Option Explicit
Public FormsPath As String
Public SavePath As String
Dim oColl As New Collection
Private Const INVALID_FILE_ATTRIBUTES As Long
= &HFFFFFFFF
Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
'
'
'   *- MAIN -*
Public Function ListForms() As Boolean
    Dim aRes() As String, lRet As Long
    Dim i As Long
    
    If IsInIDE Then
        lRet = GetFilesPathFromDirectory(FormsPath, aRes(), "*.frm")
        If lRet = -1 Then
            ListForms = False
        Else
            For i = 0 To lRet
                oColl.Add CVar(LeftToChar(GetFileNameFromPath(aRes(i)), ".", True))
            Next i
            Call SetCollectionFile(SavePath,
oColl)
            ListForms = True
        End If
    Else
        If LenB(GetArrayFile(SavePath, aRes)) =
0 Then
            ListForms = False
        Else
            For i = 0 To UBound(aRes)
                oColl.Add aRes
            Next i
            ListForms = True
        End If
    End If
End Function
'
'
'   *- NOMBRE FORMS CHARGéES
-*
Public Function CountFormsLoaded() As Integer
    CountFormsLoaded = Forms.Count
End Function
'
'
'   *- NOMBRE FORMS TOTAL
-*
Public Function CountAllForms() As Integer
    CountAllForms = oColl.Count
End Function
'
'
'   *- FORM CHARGéE
-*
Public Function IsLoaded(oForm As Form) As Boolean
    Dim Frm As Object, bFound As Boolean
    IsLoaded = False

    For Each Frm In Forms
        If Frm Is oForm Then IsLoaded = True: Exit For
    Next Frm

    Set Frm = Nothing
End Function
'
'
'   *- FERME TOUTES LES FORMS -*
Public Sub CloseAllForms()
    Dim Frm As Form
    For Each Frm In Forms
        Unload Frm
    Next Frm
    Set Frm = Nothing
End Sub

'
'
'   *- PROJET COMPILé
-*
Private Function IsInIDE() As Boolean
    IsInIDE = (App.LogMode = 0)
End Function
'
'
'   *- LISTER DES FICHIERS DANS UN RéPERTOIRE -*
Private Function GetFilesPathFromDirectory(ByVal
sDir As String, ByRef aRet() As String, Optional ByVal sFilter As String = "*.txt") As Long
'   GetFilesPathFromDirectory retourne -1 si aucun fichier
trouvé
'   sinon retourne la dimension du tableau,
donc NB fichiers -1 (tableau commence à l'indice 0)

'   init les résultats
    GetFilesPathFromDirectory = -1
    Erase aRet
    If RightB$(sDir, 2) <> "" Then sDir = sDir & ""

'   formate le
chemin
    Dim sFile As String, lIndex As Long
    sFile = Dir(sDir & sFilter, vbHidden Or
vbSystem)

'  
redimentionne après vérif premier fichier
    If sFile <> vbNullString Then
        lIndex = 0
        ReDim aRet(lIndex)
        aRet(lIndex) = sDir & sFile
        sFile = Dir

'       boucle sur tous les fichiers
        Do While sFile <> vbNullString
            lIndex = UBound(aRet) + 1
            ReDim Preserve aRet(lIndex)
            aRet(lIndex) = sDir & sFile
            sFile = Dir
        Loop

'      
retour
        GetFilesPathFromDirectory = lIndex
    End If
End Function

'
'
'   *- FICHIER DEPUIS CHEMIN
-*
Private Function GetFileNameFromPath(ByVal sPath As String)
    GetFileNameFromPath = Right$(sPath, Len(sPath) - InStrRev(sPath, ""))
End Function
'
'
'   *- GAUCHE JUSQU'à UN CARACTèRE (EXCLUS) -*
Private Function LeftToChar(ByVal sStr As String, ByVal sSepar As String, Optional bLast As Boolean = False)
As String
    Dim iPos As Integer
    If bLast Then iPos = InStrRev(sStr, sSepar) * 2 - 1 Else
iPos = InStrB(1, sStr,
sSepar)
    
    If iPos <= 0 Then
        LeftToChar = vbNullString
    Else
        LeftToChar = LeftB$(sStr, iPos - 1)
    End If
End Function
'
'
'   *- SAUVE UNE COLLECTION DANS
UN FICHIER CACHé -*
Private Sub SetCollectionFile(ByVal sPath As String, ByRef Col
As Collection,
Optional sRowsSepar
As String =
vbCrLf)
    Dim FF As Integer, sBuffer As String, i As Integer
    sBuffer = vbNullString
    For i = 1 To Col.Count
        sBuffer = sBuffer & Col.Item(i) &
sRowsSepar
    Next i
    sBuffer = LeftToChar(sBuffer, sRowsSepar, True)
    
    Call DeleteFile(sPath)
    FF = FreeFile
    Open sPath For Output As #FF
        Print #FF, sBuffer;
    Close #FF
    
    Call SetAttr(sPath, vbSystem Or vbHidden)
End Sub
'
'
'   *- RETOURNE LE CONTENU D'UN FICHIER, COMPLET ET SOUS FORME DE
TABLEAU -*
Private Function GetArrayFile(ByVal sPath As String, Optional ByRef aLines As Variant, Optional ByVal sRowsSepar As String = vbCrLf) As String
    Dim FF As Integer
    If FileFolderExists(sPath) Then
        FF = FreeFile
        Open sPath For Input As #FF
            GetArrayFile = Input(LOF(FF),
#FF)
        Close #FF
        aLines = Split(GetArrayFile, sRowsSepar)
    End If
End Function
'
'
'   *- EXISTANCE FICHIER/DOSSIER -*
Private Function FileFolderExists(ByRef vsPath As String) As Boolean
    FileFolderExists = (GetFileAttributes(vsPath) <>
INVALID_FILE_ATTRIBUTES)
End Function

allez, c'est toujours plus pratique avec un zip ;)

si le côté "fichier texte" est gênant (çà peut se comprendre), à toi d'adapter....
nommer le fichier en .dll, le placer ailleurs que dans ton appli, utiliser plutôt le registre... les choix sont nombreux

mais quoi qu'il en soit tu ne pourras pas ouvrir une fenêtre qui ne sera pas un OBJET FORM, donc pas possible d'ouvrir dynamiquement (voir bouton 5 ^^)

++
PCPT  [AFCK]
<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp

Merci PCPT 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de PCPT
Messages postés
1100
Date d'inscription
mercredi 22 mars 2006
Dernière intervention
15 avril 2018
0
Merci
Pardon une phrases n'est pas claire  :
Une solution à UNE de
ces différentes options
me permettrais de réalisé mon objectif :
Un seul point résolut et mon problème est résolut

MERCI
Amicalement
Pensez "Réponse acceptée"
Commenter la réponse de Polack77
Messages postés
113
Date d'inscription
vendredi 5 mars 2004
Dernière intervention
11 février 2008
0
Merci
désolé, mais je connais pas VB6 et les OCX ou DLL, je ne fais que les utiliser ..

Vaut mieux etre bourré que con: ca dure moins longtemps...
Commenter la réponse de capuccino_fr
Messages postés
500
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
2 juillet 2012
0
Merci
Bonsoir,


Tes questions sont assez difficile a interprèté, il y a les fonctions basique de VB pour


Le nombre de form dans le projet Form.Count


Dim i As Integer
    For i = 0 To Forms.Count - 1
        'pour l'ouvrir visible
        'Form(i).Show
        'Pour la mettre en mémoire
        'Form(i).load
        'pour connaître sont nom
        'a$ = Form(i).Name
        'etc..
    Next i


Si c'est pas ça c'est que je n'ai pas compris la question.
Bonne soirée
Commenter la réponse de cs_lermite222
Messages postés
1100
Date d'inscription
mercredi 22 mars 2006
Dernière intervention
15 avril 2018
0
Merci
Bonjour lermite222, tu à bien compris mon problème (tout du moins j'en est l'impression) sauf que 'forms' retourne l'ensemble des formulaires chargés et non pas l'ensemble des formulaires tout cours, et c'est là qu'es mon problème. Il semble qu'en VB6 il soit impossible de connaitre l'ensemble des formulaires existant une fois la compilation effectué.

Bonjour PCPT, je commence à penser que la méthode que tu m'apporte est la bonne. Je copie le code, j'essaie de le comprendre dans sa totalité (j'aime pas ne pas comprendre ce que font mes développement) je  test et répond (à savoir si ça à résout mon problème ou si il me reste un/des problème/s)

MERCI à tout de vous occupé de mon problème

Amicalement
Pensez "Réponse acceptée"
Commenter la réponse de Polack77
Messages postés
1100
Date d'inscription
mercredi 22 mars 2006
Dernière intervention
15 avril 2018
0
Merci
Ma hiérarchie vient de me dire "Non on fait pas comme ça." que se soit par fichier texte, base de registre, ou autre ( font chi__ ). J'avais lut qu'une autre méthode serais de déclarer un form MDI parent, tout les autres form enfant de celle ci. Pour finir 'scanné' tout les enfant de cette dites MDI parent. Solution non acceptable par ma hiérarchie ( décidément rien ne leur vas , si ils ne veulent pas que ça se fasse il faut simplement le dire ). Par contre je me met sous le coude ce que tu m'a données PCPT (ça m'a l'aire d'être la seul solution, surtout si quel qu'un connais une autre méthode qu'il n'hésite pas).

Pour comprendre l'intérêt de la solution qui vas être utilisé (qui reste très... Non, EXTRÊMEMENT limité) il faut connaitre la finalité du projet et ça serais trop long à expliquer.

La solution de ma hiérarchie :
Un nouveau form = un nouveau projet ( Ils trouvent ça plus simple ?!?!?!?! ). On vas se retrouvez avec une application composé de 50 exécutables.... Simple pour la gestion d'erreur.... Sans plus de commentaire je serais péjoratif....

Encore MERCIpour le temps consacré à mon problème
Amicalement
Pensez "Réponse acceptée"
Commenter la réponse de Polack77

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.