PrinceSilk
Messages postés56Date d'inscriptionvendredi 31 janvier 2003StatutMembreDernière intervention26 mai 2013
-
11 mai 2008 à 17:25
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
17 mai 2008 à 01:03
Bonjour,
Je développe un logiciel capable d'ouvrir un type de document style tableau.
La fenetre principale peut ouvrir plusieur fichier en même temps (genre Dim FrmT as FrmTableau puis Set FrmT as FrmTableau et enfin FrmT.Show)
Chaque lecteur peut lui même ouvrir une fenetre d'édition pour éditer une cellule du tableau...
de nouveau, je crée "FrmE as FrmEditeur" ect ect...
Mon problème, c'est de permetre aux nouvelles fenetres (celles qui contiennent le contenu des cellules), de retrouver le lecteur qui les a créé, pour écrire la nouvelle cellule modifiée...
Je ne sais pas si je suis clair...
Mon problème, c'est qu'il n'existe pas d'index pour les Forms, donc pas de moyen de différencier les Forms contenant les tableaux ouverts...
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 11 mai 2008 à 20:21
bon, reprenons dans l'ordre
ton appli lance X instances de FrmTableau
ces instances peuvent toutes lancer UNE SEUL instance chacune, de FrmEditeur
ceci veut aussi dire qu'il peut y avoir simultanément plusieurs instances de chaque.
jusque là on est bon...
le but est qu'un instance de FrmTableau communique avec sa fille (modelée sur FrmEditeur) sans erreur
nouveau projet :
* 1 module standard nommé Module1
* 1 Form nommée FrmTableau
* 1 Form nommée FrmEditeur
mon projet va démarrer par une Sub Main
dans mon module1 je mets donc :
Option Explicit
Dim iID As Long
Public Sub Main()
CreateNewTableau
End Sub
Public Sub CreateNewTableau()
iID = iID + 1
Dim f As New FrmTableau
f.Tag = CStr(iID)
f.Show
Set f = Nothing
End Sub
ensuite sur FrmTableau , pose 4 boutons par défaut et :
Private Sub Form_Activate()
Me.Caption = "FrmTableau - ID =
" & Me.Tag
End Sub
Private Sub Form_Load()
Command1.Caption = "Nouvelle
FrmTableau"
Command2.Caption = "Nouvelle FrmEditeur"
Command3.Caption = "Modifier
FrmEditeur"
Command4.Caption = "Tout quitter"
End Sub
Private Sub Command1_Click()
Call CreateNewTableau
End Sub
Private Sub Command2_Click()
If Not CreateNewEditeur(Me) Then MsgBox "il y a déjà une FrmEditeur en
ID " & Me.Tag
End Sub
Private Sub Command3_Click()
Dim iRet As Integer
iRet = Val(InputBox("Saisissez l'ID", , Me.Tag))
If FrmEditeurExists(iRet) Then
Dim f As FrmEditeur
Set f = GetFrmEditeur(iRet)
f.BackColor = vbRed
Set f = Nothing
Else
MsgBox "il n'y a aucune FrmEditeur en ID " & CStr(iRet)
End If
End Sub
Private Sub Command4_Click()
Call SafeEnd
End Sub
(on reviendra sur les 4 boutons après)
et dans FrmEditeur , aucun contrôle :
Option Explicit
Private Sub Form_Activate()
Me.Caption = "FrmEditeur - ID =
" & Me.Tag
End Sub
voilà on a tout...
donc un compteur en module qui va identifier lors de la création de la form tableau
bouton 1 -> crée une instance de TABLEAU
bouton 2 -> crée une instance de EDITEUR, avec vérification qu'il n'y en a pas déjà une pour le même applant
bouton 3 -> crée une instance de EDITEUR (en l'occurence la couleur de fond), avec vérif de l'ID existant, avec la possibilité d'aller "causer" à uneautre que celle ouverte par l'appelant
bouton 4 -> tout quitter "proprement"
il ne te reste plus qu'à mettre les routines qui vont bien dans le Module1 :
Public Function CreateNewEditeur(ByRef fCaller As FrmTableau) As
Boolean
If Not FrmEditeurExists(Val(fCaller.Tag)) Then
Dim f As New FrmEditeur
f.Tag = fCaller.Tag
f.Show
Set f = Nothing
CreateNewEditeur = True
End If
End Function
Public Function GetFrmEditeur(ByVal ID As Long)
As FrmEditeur
Dim f As FrmEditeur
Set f = Nothing
Dim oFrm As Object
For Each oFrm In Forms
If oFrm.Name = "FrmEditeur" Then
If oFrm.Tag = CStr(ID) Then
Set f = oFrm
Exit For
End If
End If
Next oFrm
Set GetFrmEditeur = f
Set oFrm = Nothing
Set f = Nothing
End Function
Public Function FrmEditeurExists(ByVal ID As Long)
As Boolean
FrmEditeurExists = Not (GetFrmEditeur(ID) Is
Nothing)
End Function
Public Sub SafeEnd()
Dim oFrm As Object
For Each oFrm In Forms
Unload oFrm
Next oFrm
Set oFrm = Nothing
End Sub
voilà pour l'exemple
c'est assez aéré? c'est sensé être clair ^^
ps : çà serait plus pratique avec une jolie collection en class
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
PrinceSilk
Messages postés56Date d'inscriptionvendredi 31 janvier 2003StatutMembreDernière intervention26 mai 2013 11 mai 2008 à 18:39
Merci pour cette réponse, mais j'ai déjà créé une valeur unique dans chaque frmTableau, mais justement, c'est faire une routine dans la frmEditeur qui "scannerai" toutes les frmTableau pour trouver celle contenant la bonne valeur que je n'arrive pas a écrire :(
Je pensait a un truc du genre
For I= 0 to A
If frmTableau(A).labelID.caption= (ID recherché) then
frmTableau(A).Grid(LigneAécrir).Text= (text éditer)
enf if
Next I
sauf que ca marche pas vu qu'il ya pas d'index pour les form :(
PrinceSilk
Messages postés56Date d'inscriptionvendredi 31 janvier 2003StatutMembreDernière intervention26 mai 2013 11 mai 2008 à 20:44
MERCI !!
J'avais en fait juste besoin de ca
Dim oFrm As Object
For Each oFrm In Forms
If oFrm.Name = "FrmEditeur" Then
If oFrm.Tag = CStr(ID) Then
End If
End If
Next oFrm
Car chaque frmTableau peut ouvrir plusieurs frmEditeur, j'ai juste ajouter, en plus de l'ID du tableau, les coordonnées de la cellule éditée, et ca marche, au moment où je valide les modifications dans une frmEditeur, la frmEditeur scanne les feuilles, trouve la frmTableau avec l'ID correspondant, et modifie la valeur de la cellule cible !
Merci beaucoup, surtout que maintenant, je croit avoir enfin compris comme marche la fonction "For Each"...