Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
6 déc. 2007 à 11:45
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
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. .
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 7 déc. 2007 à 01:09
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
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 6 déc. 2007 à 11:48
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
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 7 déc. 2007 à 01:14
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 7 déc. 2007 à 10:14
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)
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 7 déc. 2007 à 10:52
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"