La Magie des Formulaires MDI - L'Illusion est parfaite

Résolu
68manu Messages postés 43 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 1 octobre 2008 - 28 sept. 2008 à 22:57
68manu Messages postés 43 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 1 octobre 2008 - 29 sept. 2008 à 21:13
Bonsoir,

voici trois jours que je me prends la tete sur les formulaires MDI. Et malgre les bonnes sources et tutoriaux presents, je n'ai pas trouve chaussure a mon pied alors je soumets ma migraine a votre sagacité.

Je vous explique le plus clairement possible mon probleme :

J'ai un formulaire MDI  qui peut generer plusieurs formulaires enfants identiques dans leur apparence. Toutefois chaque formulaire enfant doit pouvoir gérer de facon indépendante les données recueillies, d'autant plus qu'il y a pas mal de controles différents (ca va du Timer, au DataGridView, Combobox, Boutons, et j'en passe et des meilleures). Mon idée est de gérer plusieurs tournois de ping-pong en même temps (ex : tournoi jeunes, tournoi adultes, tournoi Veterans...etc...). Bien sûr je souhaitais visualiser chaque tournoi dans un formulaire enfant MDI en meme temps, car il se peut qu'a un instant donne plusieurs tournois aient lieu en meme temps.

J'ai l'impression que d'avoir plusieurs fenetres MDI enfant ouvertes ayant le meme code de développement gène l'ordinateur, comme si du coup au premier changement de variable, il y a un confusion et qu'il ne sait pas apres sur quel formulaire il doit appliquer le changement de variable.
Je dois preciser que tout le code fonctionne parfaitement quand je n'utilise qu'un formulaire enfant a la fois.
Description du projet :

Issu Classe FormulaireMDI Parent :

' Gestion d'un nouveau tournoi

Private
Sub ShowNewForm(
ByVal sender
As
Object,
ByVal e
As EventArgs)
Handles NewToolStripMenuItem.Click, BtnAjouterTournoi.Click

' Creez une nouvelle instance du formulaire enfant.

Dim NouveauTournoi
As
New NewTournament
' Cree une nouvelle feuille de match (NewTournament, est une classe formulaire)NouveauTournoi.WindowState = FormWindowState.Maximized

m_ChildFormNumber += 1
NouveauTournoi.Text "Tournoi des " & Categorie(m_ChildFormNumber)' Categorie est une variable tableau de constantesNouveauTournoi.Name

"Tournoi" & m_ChildFormNumber

' Lancement de ma boite de parametrage du tournoi
' Elle a pour effet d'initialiser une astuce qui me permet de reconnaitre les differents formulaires enfants
' Est genere entre autre la variable tableau TYPETOURNOI()
' A chaque appel de DlgBox1, je REdim Preserve TYPETOURNOI en augmentant le tableau de 1 entree que j'initialise avec NouveauTournoi.text
DlgBox1.Name =

"DlgBoxP" & m_ChildFormNumber

If DlgBox1.ShowDialog = Windows.Forms.DialogResult.Cancel
Then

Exit
Sub

End
IfDlgBox1.Dispose()

NouveauTournoi.Show()

End
Sub
Extrait Classe Formulaire Enfant NewTournament (Appel par NouveauTournoi)

Private

Sub NewTournament_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load

' on recupere le numero du tournoi
' Celle valeur est toujours equivalente au m_ChildNumber d'au dessus et me permet de reconnaitre les parametres de TYPETOURNOI(), et SURTOUT le formulaire enfant correspondant
' Pour simplicite, je donne l'exmple du DatagridView, mais c'est la meme chose pour tous les controles :
' l'initialisation ne pose jamais de problemes, la modification en pose
' Donc ici j'ai un formulaire avec un DataGridView appele dgv
numerotournoi =
CInt(
Me.Name.Substring(7,
Me.Name.Length - 7))

' on initialise les controles
ForEach objet InMe.Controls
objet.visible =
False

Next

Select Case TYPETOURNOI(numerotournoi)
Case "Jeunes"
InitialiserDgv("Jeunes",150,400,Color.Blue,Color.Lavender,Color.LavenderBlush)  'on initialise le controle DataGRidview, pas de soucis les initialisations, ca marche pour tous les nouveaux formulaires
' Autres initialisations selon le cas du type de tournoi
Case "Adultes"
InitialiserDgv("Jeunes",150,400,Color.Salmon,Color.SandyBrown,Color.LightPink) 
...
End Select
End sub

' Admettons que lors de l'utilisation du formulaire gerant le tournoi Jeunes, vous voulez Checker le gagnant
' Et la bonne blague ...vous gerez aussi un tournoi Adultes.
Private sub Dgv_Cellcontentclick(Byval sender asSystem.Object,
ByVale
AsSystem.Windows.Forms.DataGridViewCEllEventArgs)
HandlesdgvRencontre.CellContentClick

Dim ligne
As Integer=e.RowIndex

' C'est cette modification qui ne s'opere pas, et sur aucun des formulaires a partir du moment
'   ou il y en a au moins deux en meme temps.
' Ceci est valable pour n'importe quel controle
dgv.Rows(ligne).cells("Vainqueur").Value= True
End sub

1. Merci de votre courage pour avoir lu jusque la !

Voici les solutions auquelles j'ai pense et qui sont "triviales"

a. Mon formulaire est precréé avec le Concepteur -> Dois je faire toute la creation via le code ?
A vrai dire j'aimerais une autre solution

b. J'utilise une astuce similaire a celle qui me permet de reconnaitre mes formulaires, pour rappel le variable numerotournoi
Mais cela veut dire qu'il me faut des Arrays de formulaires, cela est il possible ?

c. Demander humblement de l'aide sur ce point. Je sais qu'il existe une solution, sinon aucune application ne pourrait utiliser deux fenetres enfants en meme temps.

Merci de votre aide
Emmanuel

_____________________
No problems, only soluces

5 réponses

gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
29 sept. 2008 à 20:15
heu quand je disais form fallait lire classe ...

Bonjour chez vous !
3
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
29 sept. 2008 à 00:22
pourquoi ne pas faire le design tes forms à l'avance, chacune ayant ses spécificités et simplement les appeler au moment ou tu en as besoin


exemple


1 form parent


1 form tournoi enfants
1form tournoi adultes
1 form tou......
1 .....
1.....
dans le menu de form_parent tu mets le code qui te permet d'appeler chacun de ses enfants










Bonjour chez vous !
0
68manu Messages postés 43 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 1 octobre 2008
29 sept. 2008 à 08:54
Bonjour gillardg,
merci de ta reponse, c'est en effet la solution qui parait la plus simple par rapport a ce que j'ai expose.
Mais en me relisant apres, j'ai remarque que j'avais oublie de preciser quelque chose :

Chaque type de tournoi peut etre categorise encore selon le classement ou encore selon le sexe, etc...
.
Ce qui fait que j'ai par exemple que je peux avoir deux tournois jeunes, l'un pour les debutants, l'autre pour des plus forts, etc...ou un tournoi adulte feminin et masculin ou mixte...

Etant donne la multiplicite > 50 possibilites, je ne peux bien evidemment pas faire un formulaire par tournoi. L'application deviendrait vite tres "lourde". Sans compter, pour corser le truc, que l'utilisateur ne pourrait pas gerer un tournoi A ou B ayant les memes specificites (ex : un tournoi adulte feminin a 8 joueuses et un autre tournoi adulte feminin a 14 joueuses), ca ne fait que repousser le probleme plus loin.

J'aimerais quelque chose de plus dynamique si possible.
J'espere vraiment qu'il y a une solution autre.

cordialement,
Emmanuel
_____________________
No problems, only soluces
0
68manu Messages postés 43 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 1 octobre 2008
29 sept. 2008 à 20:36
Je suis pas sur de bien comprendre...


Je crois que c'est ce que je fais non ? :


j'instance du formulaire parent le Formulaire NouveauTournoi (defini par la classe NewTournament, qui est un formulaire predefini)

Dans la classe NouveauTournoi, je gere les evenements de ce formulaire.

Si je me viande, il me faudrait un exemple d'utilisation, parce que la, je suis bouche bee.
Merci d'avance






_____________________
No problems, only soluces
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
68manu Messages postés 43 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 1 octobre 2008
29 sept. 2008 à 21:13
Je crois qu'a defaut d'etre bouche bee... Je suis fondamentalement c...
comment modifiez vous un dgv qui a la propriete EditModeProgramatically a l'instant ou l'utilisateur veut cliquer dessus ? Et quand les autres controles sont en mode enabled=false.

Comme je le dis si bien il n'y a pas de problemes que des solutions:::
Ce qu'il faut c'est savoir regarder la solution pour comprendre le probleme.

Desole gillardg pour le derangement. Vivement que ce projet se termine, que je puisse enfin prendre quelques jours de vacances... J'en ai besoin !

En tout cas j'accepte la solution proposee, car finalement au probleme expose c'est la bonne solution :-)

___
No problems, only soluces
0
Rejoignez-nous