Gestion de Form Parents et Enfants [Résolu]

Messages postés
25
Date d'inscription
vendredi 2 août 2002
Dernière intervention
3 juillet 2008
- - Dernière réponse : PCPT
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
- 14 oct. 2008 à 18:41
Salut,

je rencontre un problème avec mon appli.

mon appli est une FAQ. elle contient de nombreuses form dont une FormMDI qui contient toutes les autres.

j'ai deux types de form :
 
1- des formes contenant des listView qui m'affiche une vue de ma base de données MySql et contenant des boutons permettant l'ajout, la modification etc ...

2- des formes de saisie qui permettent d'ajouter ou de modifier des enregistrement de la bdd.

Ce que je souhaite c'est écrire une procédure gérant l'appartenance des formes à leur form parents. je m'explique.

J'ouvre grace au menu la Form1 qui m'affiche la liste des questions réponses déja saisie. lorsque je clique sur le bouton
ajouter, Form2 s'ouvre. Il faut à cette instant que form1 soit Disabled car une fenetre fille de Form1 a été ouverte.
Il faut également que lorsque je ferme Form2, Form1 soit Enabled car toutes les fenetres filles de Form1 sont fermé.

j'ai déja réaliser sur une appli une gestion des fenetres de ce genre mais c'est hyper galère. surtout que je peux avoir jusqu'a 6 niveaux de fenetre les unes au dessus des autres. du coup si l'utilisateur clique a coté de la bonne form il met en premier plan une form qui n'a rien a voir avec ce qu'il recherche et il est perdu.

je voulais en faite savoir si une propriété éxiste permettant de savoir a partir de quel form l'utilisateur a appuyer sur un bouton pour ouvrir la form actuelle. cela me permettrait simplement de mettre dans le Form Unload d'activer la Form parent.

je sais pas si je suis claire mais n'hésiter pas à poser vos questions.
Afficher la suite 

Votre réponse

9 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,

bon, çà me semble pas mal
le fonctionnement est le suivant :
toutes tes forms sont ajoutées dans une collection. pas directement, on passe par une structure (FrmCollectorType)
le projet démarre non pas avec ta form MDI mais avec la procédure MAIN (menu projet > propriétés de prohet // objet de démarrage).
cette MAIN va ajouter ta MDI à la classe/collection (Cls_FrmCollector) pour qu'elle ne la désactive pas par la suite.
pourquoi? si tu désactives la mère, les filles le sont aussi

ensuite la MDImain est chargée et tu vois le principe : dès que tu vas afficher une nouvelle fenêtre fille, tu l'ajoutes d'abord.
dès qu'elle se ferme, tu la supprimes de la collection


'----------------------------------------------------
'MODULE CLASSIQUE, LE PROJET DéMARRE AVEC LA SUB
MAIN
'----------------------------------------------------
'
Option Explicit
Public Frms As New Cls_FrmCollector

Sub Main()
    Set Frms.FrmMDI = MDIForm1
    MDIForm1.Show
End Sub



'-----------------------
'CLASSE
FrmCollectorType
'-----------------------
'
Option Explicit

Public Parent   As Form
Public Child    As Form
Public Position As Integer



'-----------------------
'CLASSE
Cls_FrmCollector
'-----------------------
'
'
Option Explicit
Public FrmMDI As Form

Dim oColl As New Collection

Public Sub AddForm(ByRef oParent As Form, ByRef oChild As Form)
    Dim oFrm As New FrmCollectorType
    Set oFrm.Parent = oParent
    Set oFrm.Child = oChild
    oFrm.Position = oColl.Count + 1

'   ajoute la
form
    oColl.Add oFrm

'   désactive
    If Not (oParent Is Me.FrmMDI) Then oParent.Enabled = False

    Set oFrm = Nothing
End Sub

Public Sub RemoveForm(ByRef oChild As Form)
'   on cherche la
form
    Dim i As Integer
    Dim oParent As Form
    For i = 1 To oColl.Count
        If oColl.Item(i).Child Is oChild Then
'           on a le bon
            Set oParent = oColl.Item(i).Parent
            If Not (oParent Is Me.FrmMDI) Then oParent.Enabled = True
            oColl.Remove (i)
            Exit For
        End If
    Next i

    Set oParent = Nothing
End Sub

Private Sub Class_Terminate()
    Dim i As Integer
    For i = oColl.Count To 1 Step -1
        oColl.Remove i
    Next i
    Set oColl = Nothing
    Set Me.FrmMDI = Nothing
End Sub



'-------------------
'FORM MDI
PRINCIPALE
'-------------------
'
Option Explicit

Private Sub mnu_1_Click()
    Frms.AddForm Me, Form1
    Form1.Show
End Sub

Private Sub mnu_2_Click()
    Frms.AddForm Me, Form2
    Form2.Show
End Sub

Private Sub mnu_3n_Click()
    Frms.AddForm Me, Form2
    Form3.Show
End Sub

Private Sub MDIForm_Unload(Cancel As Integer)
    Set Frms = Nothing
End Sub



'-----
'FORM1
'-----
'
Option Explicit

Private Sub Command1_Click()
    Frms.AddForm Me, Form2
    Form2.Show
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Frms.RemoveForm Me
End Sub



'-----
'FORM2
'-----
'
Option Explicit

Private Sub Command1_Click()
    Frms.AddForm Me, Form3
    Form3.Show
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Frms.RemoveForm Me
End Sub



'-----
'FORM3
'-----
'
Option Explicit

Private Sub Form_Unload(Cancel As Integer)
    Frms.RemoveForm Me
End Sub



si tu as des questions, n'hésite pas
++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  

Dire « Merci » 3

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

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de PCPT
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
salut,

umm.. à moitié
tu parles de 6 niveaux...
tu veux JUSTE que Form1 (la mère) soit disabled après l'ouverture d'un de ses enfants, ou que chaque fenêtre se désactive dès qu'elle en ouvre une autre (et donc se réactive quand sa "fille" se ferme) ?

parce qu'à la limite dans ce 2e cas de figure, tu n'as alors jamais vraiment 6 niveaux, si on n'a accès qu'à une fenêtre à la fois. il te suffit juste d'ouvrir les enfants par un FormX.Show VbModal

??
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
Commenter la réponse de PCPT
Messages postés
25
Date d'inscription
vendredi 2 août 2002
Dernière intervention
3 juillet 2008
0
Merci
Salut

merci pour ta réponse

je suis dans le deuxième cas c'est a dire que je veux que chaque fenetre se désactive dés qu'elle en ouvre une autre et donc se réactive quand sa fille se ferme.

j'ai donc testé ta solutions avec Form.Show VbModal mais cela ne fonctionne pas car ma form est une MdiChild et on me dit qu'elle ne peut pas etre affichées modalement.

je continue a chercher.

merci
Commenter la réponse de Kepone
Messages postés
25
Date d'inscription
vendredi 2 août 2002
Dernière intervention
3 juillet 2008
0
Merci
Salut,

merci pour cette réponse ultra complète.

je vais la tester le plus vite possible te je te tiendrais au courant.

Merci Beaucoup

Kepone
Commenter la réponse de Kepone
Messages postés
25
Date d'inscription
vendredi 2 août 2002
Dernière intervention
3 juillet 2008
0
Merci
Sa marche niquel.

Sa fait plaisir.

Merci pour ce code très pratique

@+

Kepone
Commenter la réponse de Kepone
Messages postés
5
Date d'inscription
lundi 13 novembre 2006
Dernière intervention
14 octobre 2008
0
Merci
Bonjour PCPT,
Première remarque importante : je suis novice dans la programmation VB6, et essentiellement dans la gestion des classes et des objets.
Effectivement, ton code marche nickel.
Je cherche actuellement à faire fonctionner une interface tel que celle de VB6.
Je m'explique. J'aimerai pouvoir utiliser des formulaires tel que le formulaire "Projet" ou le formulaire "Propriétés" qui peuvent apparaitre et disparaitre à volonté en fonction de leur utilisation.
Je présume qu'il faut utiliser la propriété BorderStyle=5 (Sizable ToolWindow).
Ce que je n'arrive pas à réaliser actuellement est :
- l'accrochage sur le bord du MDIChild (ou alors du frmMain)
- la mise à dimension (soit hauteur, soit largeur
- la disparition de la bordure bleue.

Je ne demande pas que l'on m'écrive le code nécessaire, mais simplement des pistes qui me permettrait de pouvoir réaliser mon interface.

D'avance un grand merci de ta réponse, quelle qu'elle soit.
JAMESAN
Commenter la réponse de cs_jamesan
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
salut

[../auteur/JAMESAN/907416.aspx jamesan]

,

tu auras plus de chances de trouver une solution en posant ta question dans un nouveau topic

en attendant :
interface "comme VB".....
mais j'suis pas devant ton PC, et VB a 2 interfaces, la classique (MDI en effet), et la SDI (menu Outils > Options... > étendues > [v] Environnemennt SDI)

dans le premier cas (apparemment), le principe est en fait de jouer dans un container

pour çà regarde les sources parlant de DOCK ou ANCHOR
tu peux également regarder dans mes sources ("bouton fermer at runtime" je crois), une classe qui te donnera accès à pas mal de propriétés comme la barre de titre, le bouton dans la barre des tâches, les boutons min max etc..., en cours d'execution ("at runtime")

enfin pour les placements, tes premières recherches devraient déjà t'apporter la solution, en attendant le principe est simple : calculer la taille de la form (me.top, me.left, me.width, me.height) en fonction de l'écran (screen.width, screen.height), et voir si dans cette ZONE tu es proche ou non d'une autre fenêtre (X.top, X.height, pareil..., pour X faisant partie de la collection me.Forms)

bon courage


Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
Messages postés
5
Date d'inscription
lundi 13 novembre 2006
Dernière intervention
14 octobre 2008
0
Merci
Re bonjour,
Un grand merci pour la rapidité de ta réponse. Je vais explorer les pistes que tu m'as donnée et te tiendrais au courant.
Juste une petite reamrque, si j'arrive à réaliser cette petite interface, je pourrais éventuellement la placer sur le site en faisant référence à ton code de départ. Est-ce OK ? Fais moi signe pour confirmation.
JAMESAN
Commenter la réponse de cs_jamesan
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
sans problème bien sûr
Commenter la réponse de PCPT

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.