Index pour Form

Résolu
PrinceSilk Messages postés 56 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 26 mai 2013 - 11 mai 2008 à 17:25
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Derniè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...

Quelqu'un a t'il une solution ?
Merci d'avance

8 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
11 mai 2008 à 17:41
salut,
il faut que tu fasses une propriété dans tes forms FrmEditeur, qui contiendra une valeur unique, et une routine pour récupérer cet ID

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
PrinceSilk Messages postés 56 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 26 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 :(
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
11 mai 2008 à 18:50
çà serait plus....
for each obj in forms
if obj is taform then
if obj.labelID.caption= (ID recherché) then .....

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0

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

Posez votre question
PrinceSilk Messages postés 56 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 26 mai 2013
11 mai 2008 à 19:19
Pour l'instant, j'ai ça, grâce à vos conseil, mais ca ne marche pas :(

For Each fenetre In Forms

    If fenetre = frmViewer Then
   
        If Val(fenetre.LblNumViewer.Caption)=IDrecherche Then
        fenetre.Grid(Ligne).Text=Edition.Text
        End If
   
    End If

Next fenetre

"fenetre" est une variable que je n'ai pas définit, "frmViewer" le type de feuille que je cherche, et "LblNumViewer" le label contenant l'ID

Je n'ai jamais réussit à faire marcher la fonction "For Each ... In ..."

Merci beaucoup
0
PrinceSilk Messages postés 56 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 26 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"...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 mai 2008 à 18:25
possible aussi :

If TypeOf oFrm Is FrmEditeur Then
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 mai 2008 à 01:03
Rey
-> ne fonctionnera pas avec la demande d'authentification unique ;)
0
Rejoignez-nous