Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
1 oct. 2007 à 12:40
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
6 déc. 2007 à 15:41
Bonjour
J'ai un 'petit' problème :
Je reçois (par WinSock) des demandes d'autre application.
Une de ces demandes est d'ouvrir le formulaire d'ont le nom (propriété 'Name') m'es
passé. Pour cela je pensais tester le nom de tous les formulaires existant de
mon application dans un 'foreach' (pour m'éviter un 'select' énorme).
Sauf que je ne trouve pas la syntaxe (je la trouve pour tous
les formulaires ouverts de mon application mais pas pour tous les formulaires existants/déclaré,
or très peut de formulaire doive être ouvert simultanément).
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 5 oct. 2007 à 12:02
On m'à répondu sur le forum MSDN (je commencés à ne plus y
croire)
Bon, ça demande à être modifier un poile (un quart de poile) mais ça m'ouvre la voie.
La solution (Merci à Henri d Orgeval ) :
----------------------------------------------------------------------------------------
Public Sub startForm()
' on récupère l'assembly qui est en cours d'éxécution
' dans cet exemple il s'agit de votre application windows
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
If myType.IsClass Then
' On récupère le nom de la classe
Dim myTypeName As String = myType.Name
' On utilise une expression régulière
' pour vérifier que le nom est conforme à ce qu'on attend
' dans cet exemple, tous les formulaires qui s'appelle
' Form1, Form2, Form3, etc... seront traités
Dim myPattern As String = "Form\d"
Dim myRegex As New System.Text.RegularExpressions.Regex(myPattern)
If myRegex.IsMatch(myTypeName) Then
' on vérifie que la classe hérite bien de System.windows.Forms.Form
If myType.BaseType.Name = "Form" Then
' on instancie le formulaire
Dim myInstance As System.Object
myInstance = Activator.CreateInstance(myType)
Dim myForm As System.Windows.Forms.Form
myForm = CType(myInstance, System.Windows.Forms.Form)
' on affiche le formulaire à l'écran
myForm.Show()
End If
End If
End If
Next
End Sub
----------------------------------------------------------------------------------------
Le lient vers le topique MSDN : ici
capuccino_fr
Messages postés113Date d'inscriptionvendredi 5 mars 2004StatutMembreDernière intervention11 février 2008 1 oct. 2007 à 14:07
C'est effectivement un souci que j'ai eue dans une de mes appli, possédant un formulaire MdiParent
Voici le code, qui active la form si elle a deja été instanciée
'Verifie si la form est ouverte ou non, dans ce cas il faudra l'initialiser
Public Function VerifSiFormOuverte(ByVal formAppelante As Form, ByVal nomForm As String) As Boolean
For Each f As Form In formAppelante.MdiChildren
If f.Name = nomForm Then
f.Activate()
Return True 'on ne fait qu'activer la form et renvoyer oui
End If
Next
Return False 'la form n'est pas activee: il faut l'ouvrir
End Function
Si ce n'est pas le cas, on 'lactivera :
'Ouverture de formulaire dans la fenetre parent
Public Sub OuvreForm(ByVal QuelForm As Form, ByVal FormParent As Form)
Try
QuelForm.MdiParent = FormParent
QuelForm.Show()
Catch ex As Exception
MsgBox("Impossible d'ouvrir la Form: " & QuelForm.ToString & vbCrLf & ex.Message)
End Try
End Sub
En gros, on aura ce lancement :
Private Sub MenuItem11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem11.Click
'ouverture la form si elle n'etait pas ouverte
If VerifSiFormOuverte(Me, "Recherche") Then Exit Sub Else OuvreForm(New Recherche, Me)
End Sub
Vaut mieux etre bourré que con: ca dure moins longtemps...
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 1 oct. 2007 à 15:16
Heeee, non ???
Je crois que ma question n'a pas été comprise...
Je reformule.
J'ai une application (VB.NET) possédant un nombre important de formulaire
différant (à la louche 50).
Je reçois (par WinSock) un Nom de formulaire à ouvrir (que celui-ci soit déjà ouvert
ou non ne me regarde pas, s’il est déjà ouvert j'en ouvre une nouvelle
instance).
Problème je ne sais pas sur quelle classe (oui en VB.NET les form sont des
classes) va être basé cette form. Je veux donc tester le nom de toutes les
forms (ou toute les classe étant des forms, dans ce cas j'ajoute le teste "If (TypeOf Item Is Form) Then") de mon application pour trouver celle que je dois ouvrir.
Un truc du genre:
For Each Item As Form In TouteLesFormsDeMonAppli
if (Item.Name = NomFormAOuvrir) then
.......
endif
Next
La seul donnée que je possède est 'NomFormAOuvrir' de type string donc le code
suivant ne peut pas marché (à moins que je ne raconte n’importe quoi)
Public Sub OuvreForm(ByVal QuelForm As Form, ByVal FormParent As Form)
capuccino_fr
Messages postés113Date d'inscriptionvendredi 5 mars 2004StatutMembreDernière intervention11 février 2008 2 oct. 2007 à 10:13
C'est pourquoi il te faut une application utilisant MdiChild et MdiParent, afin de connaitre toutes les form lancées dans l'application, car la fenetre MdiParent recense toutes ses form filles.
J'ai déja cherché, on ne peut pas faire autrement... (enfin je pense )
Vaut mieux etre bourré que con: ca dure moins longtemps...
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 2 oct. 2007 à 10:22
Merci quand même, je cherche toujours mais je commence
à croire aussi que ce n’est pas possible autrement (pourquoi quelque chose qui fonctionnais
sous VB6 ne fonction plus sous VB.NET, non je ne vais pas me re-mettre à
insulté Microplof)
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 2 oct. 2007 à 11:14
Je viens de lire (de nouveau) une rubrique d'aide (MSDN) intitulé
"Forms collection changes".
Je vais quand même insulté Microplof (bande de trollosses!!!
) qui note dans
ça rubrique d'aide, je site :
"A Visual Basic 6.0 Forms collection is
a collection whose elements represented each loaded form in an
application."
Forms en VB6 retourne l'ensemble des form de l'application et non pas
uniquement celle chargé.
Bande de %ùµ¤¨^% et encor je suis calme...
capuccino_fr
Messages postés113Date d'inscriptionvendredi 5 mars 2004StatutMembreDernière intervention11 février 2008 2 oct. 2007 à 11:22
En effet, mais la c'est du .Net 2, que je ne connais pas
Si cela existe, ca pourrait etre la solution.
Dans tous les cas, tu peux ouvrir la form et tester , et la refermer quand tu as fini, ainsi tu ne pourras surcharger la mémoire
Cela dépend bien entendu du fonctionnement
Vaut mieux etre bourré que con: ca dure moins longtemps...
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 2 oct. 2007 à 11:41
C'est exactement ce que j'ai en tête.
Au lancement de mon application je fais une boucle qui charge tous les form,
sauvegarde leur propriété 'Name' dans un tableau de string puis les ferme. Ainsi
je teste mon tableau, trouve l'index de 'forms' (en VB6) dont j'ai besoin,
j'ouvre une nouvelle instance et je travail dessus.
Mais cette put£¤$ de
collection n'existe plus...
capuccino_fr
Messages postés113Date d'inscriptionvendredi 5 mars 2004StatutMembreDernière intervention11 février 2008 2 oct. 2007 à 13:01
"Au lancement de mon application je fais une boucle qui charge
tous les form, sauvegarde leur propriété 'Name' dans un tableau de
string puis les ferme"
Pourquoi ne pas ajouter un booléen qui indique s'ils sont deja ouverts dans ton tableau ??
Vaut mieux etre bourré que con: ca dure moins longtemps...
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 6 déc. 2007 à 15:41
Bon je suis là pour m'excuser au prés de Microplof (bà oui ça leur arrive d'avoir bon...)
J'avais posté le 02/10/2007 à 11:14:26 une connerie (qui m'a fais cassé du sucre sur le dos de Microplof)
Forms retourne bien la liste des form en mémoire (chargé) et non pas tout les form de l'appli (dommage pour moi en ce moment)...
Désolé
</gras></gras>Bon bà ... désolé Microplof .</gras>Dur à dire quand même
(je ferais plus attention avent de vous accusé de désinformation ...)
Par contre maintenant je cherche à faire la même chose mais en VB6
( Ras le bol qu'on change mon cahier des charge d'un développement au bout de 2/3 mois, alors qu'en plus il est fini )
Et donc pour faire ça en VB6 ([auteur/CAPUCCINOFR/241059.aspx capuccino_fr] tu semblais savoir) il faut forcément passé par un MDI parent ? Soit un MDIParent contenant toute les form du projet ? Bon ce serais une solution mais qui ne m'arrange VRAIMENTpas.