Kepone
Messages postés25Date d'inscriptionvendredi 2 août 2002StatutMembreDernière intervention 3 juillet 2008
-
2 juil. 2008 à 16:10
PCPT
Messages postés13278Date d'inscriptionlundi 13 décembre 2004StatutMembreDerniè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.
PCPT
Messages postés13278Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 3 juil. 2008 à 12:50
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
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
PCPT
Messages postés13278Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 2 juil. 2008 à 20:18
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
Kepone
Messages postés25Date d'inscriptionvendredi 2 août 2002StatutMembreDernière intervention 3 juillet 2008 3 juil. 2008 à 09:28
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.
cs_jamesan
Messages postés5Date d'inscriptionlundi 13 novembre 2006StatutMembreDernière intervention14 octobre 2008 14 oct. 2008 à 16:24
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
PCPT
Messages postés13278Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 14 oct. 2008 à 16:50
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
cs_jamesan
Messages postés5Date d'inscriptionlundi 13 novembre 2006StatutMembreDernière intervention14 octobre 2008 14 oct. 2008 à 17:22
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