Je pense que tu as compris le principe, mais ça me paraît diablement
compliqué. Alors que le seul problème à résoudre, c'est la portée de
la variable Modif.... D'après la doc, j'avais compris que si toutes mes
déclarations de classe étaient dans le même fichier, cet ensemble
constituait ce qu'ils appellent un "Assembly", et que la déclaration
"Friend" donnait à la variable la portée de l'Assembly. C'est pas ça ?
AMIcalement.
"Patrice" a écrit dans le message de news:Dans ton cas, je pense comprendre finalement qu'il te manque dans la
classe Sections, le moyen d'accéder à l'objet parent de type Ini qui la
possède.
Cela pourrait donner par exemple quelque chose comme (attention
simplification, il faudrait par exemple que l'on puisse pas affecter un
object sections d'un objet ini à l'autre car ce n'est plus alors le bon
parent qui serait modifié).
Class Ini
Friend Updated As Boolean
Friend Sections As New Sections(Me) ' Créer l'objet en lui passant son
parent
End Class
Class Sections
Private _Parent As Ini
Friend Sub New(ByVal Parent As Ini)
' Mémoriser le parent
_Parent = Parent
End Sub
Sub Touch()
' Mettre à jour l'indicateur du parent
_Parent.Updated = True
End Sub
End Class
Public Class App
Shared Sub Main()
Dim ini As New Ini
MsgBox(ini.Updated)
ini.sections.Touch()
MsgBox(ini.Updated)
End Sub
End Class
--
"L'AMI Yves" a écrit dans le message de
news: 455c96cf$0$2282$J'ai dit que je programmais depuis 20 ans, et c'est vrai, et même plus,
mais c'est la première fois que je m'essaie à programmer des objets (non
pas à programmer _avec_ des objets), et je ne maîtrise sans doute pas
encore tous les concepts. Mon objet "Ini" contient un sous-objet
"Sections", tout comme en excell un objet "Row" contient un sous-objet
"Cells". Cette situation se produit dans "la vie réelle", c'est à dire
quand
on utilise une instance de la classe Ini dans un programme. Pour la
classe Ini, il y a un module de classe qui contient des déclarations
"Public", comme les Properties, accessibles depuis les autres classes ou
depuis "la vie réelle", et aussi des déclarations "Private", qui
protègent
les objets concernés de toute modification venue de l'extérieur. Ce que
j'ai compris de la déclaration "Friend", c'est que l'objet concerné (ici
une variable booléenne) était accessible de tout "l'assembly", c'est à
dire que les programmes de "Property" de la classe "Sections"
pouvaient le modifier. A mon sens, ce n'est pas un problème
d'instanciation, dans la mesure où deux objets Ini1 et Ini2 pourraient
être modifiés indépendamment l'un de l'autre, donc ils possèdent bien
chacun sa propriété "Modified". D'après ce que j'ai compris de "Shared",
ce serait utile par exemple pour attribuer un numéro d'employé
incrémenté à chaque création d'un nouvel objet Employé : rien à voir
ici : je veux que la visibilité de ma variable s'étende à toutes les
classes
de mon projet, et pas au dehors. Il me semblait que c'était là le
concept
d'Assembly, et que Friend faisait justement ça, mais je n'ai rien trouvé
qui m'aide dans la doc sur Assembly ou Assemblys : comment déclarer
explicitement quelles classes en font partie, et tout ça. Comment aussi
déclarer qu'une classe ("Sections") n'a d'existence que comme propriété
d'un "Parent ("Ini").
Je ne sais pas si je vous ai compris, ni si vous m'avez compris, mais je
ne
me trouve pas éclairé par vos deux réponses.
Merci quand même, et, si possible, essayez encore....
AMIcalement.
"Patrice" a écrit dans le message de news:Public Class Ini déclare une classe mais ne crée pas un objet. L'objet
Ini que tu utilises plus loin n'existe donc pas et l'erreur parait tout
à fait normale.
- Soit il faut voir quel est ce fameux objet Ini que tu utilises mais
qui n'est pas déclaré.
- Soit tu veux que ce soit un membre de classe et tu as oublié le mot
clé "Shared".
Je peux difficilement en dire plus car je ne vois pas le rapport exact
entre la classe Ini et la classe Sections...
--
Patrice
"L'AMI Yves" a écrit dans le message de
news: 455c71f3$0$20555$Tu sais, il y a vingt ans que je fais du développement, alors des
erreurs, j'en
ai vu, et même dans les compilateurs...
Mais voici des extraits de mon code, tu comprendras peut-être mieux :
Public Class Ini ' Création de l'objet Ini
Private nameValue As String
...
Friend Modif As Boolean
...
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
Modif = True
End Set
End Property
...
Public ReadOnly Property Modified() As Boolean
Get
Modified = Modif
End Get
End Property
...
End Class
Public Class Sections ' Création de la collection de sous-objets
Sections
Implements System.Collections.IEnumerable
Private colSections As New Collection
Public Function Add(ByVal Name As String) As Section
Dim nouveau As New Section
nouveau.Name = Name
colSections.Add(nouveau, name)
Add = nouveau
Ini.Modif = True
^^^^^^^
...
Si je mets "Ini.", il me dit qu'il faut une référence d'objet
pour une référence à un membre non partagé.
Si je ne le mets pas, il me dit que le nom n'est pas déclaré.
Peut-être faut-il quelque chose de plus dans les déclarations des
classes,
ou même avant la première, mais justement, c'est ça ma question.
Merci.
Si le compilateur te dit que ta variable n'est pas déclarée, c'est
qu'il y a un problème de visibilité.
Comment tu essaye d'avoir accès à ta variable ? Tu dois faire
référence à la classe où elle a été déclarée :
ClassDéclarante.Variable = Valeur
Est ce que la classe dans laquelle tu déclare ta variable n'est pas
plus restrictive que friend ?
Est-ce un bug du compilateur, ou est-ce moi qui n'ai pas compris
l'instruction Friend (ou le concept d'assembly) ?
C'est marrant, très souvent, les gens qui rencontrent un problème
avec de programmation, pense tout de suite qu'il s'agit d'un bug du
compilateur ou du langage. Alors que 99 fois sur 100 cela vient
d'eux.
Merci si vous voulez bien m'aider...
Dis moi si ça marche.
A plus.
Je pense que tu as compris le principe, mais ça me paraît diablement
compliqué. Alors que le seul problème à résoudre, c'est la portée de
la variable Modif.... D'après la doc, j'avais compris que si toutes mes
déclarations de classe étaient dans le même fichier, cet ensemble
constituait ce qu'ils appellent un "Assembly", et que la déclaration
"Friend" donnait à la variable la portée de l'Assembly. C'est pas ça ?
AMIcalement.
"Patrice" <scribe@chez.com> a écrit dans le message de news:
eJQKRnaCHHA.3600@TK2MSFTNGP06.phx.gbl...
Dans ton cas, je pense comprendre finalement qu'il te manque dans la
classe Sections, le moyen d'accéder à l'objet parent de type Ini qui la
possède.
Cela pourrait donner par exemple quelque chose comme (attention
simplification, il faudrait par exemple que l'on puisse pas affecter un
object sections d'un objet ini à l'autre car ce n'est plus alors le bon
parent qui serait modifié).
Class Ini
Friend Updated As Boolean
Friend Sections As New Sections(Me) ' Créer l'objet en lui passant son
parent
End Class
Class Sections
Private _Parent As Ini
Friend Sub New(ByVal Parent As Ini)
' Mémoriser le parent
_Parent = Parent
End Sub
Sub Touch()
' Mettre à jour l'indicateur du parent
_Parent.Updated = True
End Sub
End Class
Public Class App
Shared Sub Main()
Dim ini As New Ini
MsgBox(ini.Updated)
ini.sections.Touch()
MsgBox(ini.Updated)
End Sub
End Class
--
"L'AMI Yves" <yves.matringe@fri.fr.invalide> a écrit dans le message de
news: 455c96cf$0$2282$426a34cc@news.free.fr...
J'ai dit que je programmais depuis 20 ans, et c'est vrai, et même plus,
mais c'est la première fois que je m'essaie à programmer des objets (non
pas à programmer _avec_ des objets), et je ne maîtrise sans doute pas
encore tous les concepts. Mon objet "Ini" contient un sous-objet
"Sections", tout comme en excell un objet "Row" contient un sous-objet
"Cells". Cette situation se produit dans "la vie réelle", c'est à dire
quand
on utilise une instance de la classe Ini dans un programme. Pour la
classe Ini, il y a un module de classe qui contient des déclarations
"Public", comme les Properties, accessibles depuis les autres classes ou
depuis "la vie réelle", et aussi des déclarations "Private", qui
protègent
les objets concernés de toute modification venue de l'extérieur. Ce que
j'ai compris de la déclaration "Friend", c'est que l'objet concerné (ici
une variable booléenne) était accessible de tout "l'assembly", c'est à
dire que les programmes de "Property" de la classe "Sections"
pouvaient le modifier. A mon sens, ce n'est pas un problème
d'instanciation, dans la mesure où deux objets Ini1 et Ini2 pourraient
être modifiés indépendamment l'un de l'autre, donc ils possèdent bien
chacun sa propriété "Modified". D'après ce que j'ai compris de "Shared",
ce serait utile par exemple pour attribuer un numéro d'employé
incrémenté à chaque création d'un nouvel objet Employé : rien à voir
ici : je veux que la visibilité de ma variable s'étende à toutes les
classes
de mon projet, et pas au dehors. Il me semblait que c'était là le
concept
d'Assembly, et que Friend faisait justement ça, mais je n'ai rien trouvé
qui m'aide dans la doc sur Assembly ou Assemblys : comment déclarer
explicitement quelles classes en font partie, et tout ça. Comment aussi
déclarer qu'une classe ("Sections") n'a d'existence que comme propriété
d'un "Parent ("Ini").
Je ne sais pas si je vous ai compris, ni si vous m'avez compris, mais je
ne
me trouve pas éclairé par vos deux réponses.
Merci quand même, et, si possible, essayez encore....
AMIcalement.
"Patrice" <scribe@chez.com> a écrit dans le message de news:
O5QkFkZCHHA.3396@TK2MSFTNGP02.phx.gbl...
Public Class Ini déclare une classe mais ne crée pas un objet. L'objet
Ini que tu utilises plus loin n'existe donc pas et l'erreur parait tout
à fait normale.
- Soit il faut voir quel est ce fameux objet Ini que tu utilises mais
qui n'est pas déclaré.
- Soit tu veux que ce soit un membre de classe et tu as oublié le mot
clé "Shared".
Je peux difficilement en dire plus car je ne vois pas le rapport exact
entre la classe Ini et la classe Sections...
--
Patrice
"L'AMI Yves" <yves.matringe@fri.fr.invalide> a écrit dans le message de
news: 455c71f3$0$20555$426a34cc@news.free.fr...
Tu sais, il y a vingt ans que je fais du développement, alors des
erreurs, j'en
ai vu, et même dans les compilateurs...
Mais voici des extraits de mon code, tu comprendras peut-être mieux :
Public Class Ini ' Création de l'objet Ini
Private nameValue As String
...
Friend Modif As Boolean
...
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
Modif = True
End Set
End Property
...
Public ReadOnly Property Modified() As Boolean
Get
Modified = Modif
End Get
End Property
...
End Class
Public Class Sections ' Création de la collection de sous-objets
Sections
Implements System.Collections.IEnumerable
Private colSections As New Collection
Public Function Add(ByVal Name As String) As Section
Dim nouveau As New Section
nouveau.Name = Name
colSections.Add(nouveau, name)
Add = nouveau
Ini.Modif = True
^^^^^^^
...
Si je mets "Ini.", il me dit qu'il faut une référence d'objet
pour une référence à un membre non partagé.
Si je ne le mets pas, il me dit que le nom n'est pas déclaré.
Peut-être faut-il quelque chose de plus dans les déclarations des
classes,
ou même avant la première, mais justement, c'est ça ma question.
Merci.
Si le compilateur te dit que ta variable n'est pas déclarée, c'est
qu'il y a un problème de visibilité.
Comment tu essaye d'avoir accès à ta variable ? Tu dois faire
référence à la classe où elle a été déclarée :
ClassDéclarante.Variable = Valeur
Est ce que la classe dans laquelle tu déclare ta variable n'est pas
plus restrictive que friend ?
Est-ce un bug du compilateur, ou est-ce moi qui n'ai pas compris
l'instruction Friend (ou le concept d'assembly) ?
C'est marrant, très souvent, les gens qui rencontrent un problème
avec de programmation, pense tout de suite qu'il s'agit d'un bug du
compilateur ou du langage. Alors que 99 fois sur 100 cela vient
d'eux.
Merci si vous voulez bien m'aider...
Dis moi si ça marche.
A plus.
Je pense que tu as compris le principe, mais ça me paraît diablement
compliqué. Alors que le seul problème à résoudre, c'est la portée de
la variable Modif.... D'après la doc, j'avais compris que si toutes mes
déclarations de classe étaient dans le même fichier, cet ensemble
constituait ce qu'ils appellent un "Assembly", et que la déclaration
"Friend" donnait à la variable la portée de l'Assembly. C'est pas ça ?
AMIcalement.
"Patrice" a écrit dans le message de news:Dans ton cas, je pense comprendre finalement qu'il te manque dans la
classe Sections, le moyen d'accéder à l'objet parent de type Ini qui la
possède.
Cela pourrait donner par exemple quelque chose comme (attention
simplification, il faudrait par exemple que l'on puisse pas affecter un
object sections d'un objet ini à l'autre car ce n'est plus alors le bon
parent qui serait modifié).
Class Ini
Friend Updated As Boolean
Friend Sections As New Sections(Me) ' Créer l'objet en lui passant son
parent
End Class
Class Sections
Private _Parent As Ini
Friend Sub New(ByVal Parent As Ini)
' Mémoriser le parent
_Parent = Parent
End Sub
Sub Touch()
' Mettre à jour l'indicateur du parent
_Parent.Updated = True
End Sub
End Class
Public Class App
Shared Sub Main()
Dim ini As New Ini
MsgBox(ini.Updated)
ini.sections.Touch()
MsgBox(ini.Updated)
End Sub
End Class
--
"L'AMI Yves" a écrit dans le message de
news: 455c96cf$0$2282$J'ai dit que je programmais depuis 20 ans, et c'est vrai, et même plus,
mais c'est la première fois que je m'essaie à programmer des objets (non
pas à programmer _avec_ des objets), et je ne maîtrise sans doute pas
encore tous les concepts. Mon objet "Ini" contient un sous-objet
"Sections", tout comme en excell un objet "Row" contient un sous-objet
"Cells". Cette situation se produit dans "la vie réelle", c'est à dire
quand
on utilise une instance de la classe Ini dans un programme. Pour la
classe Ini, il y a un module de classe qui contient des déclarations
"Public", comme les Properties, accessibles depuis les autres classes ou
depuis "la vie réelle", et aussi des déclarations "Private", qui
protègent
les objets concernés de toute modification venue de l'extérieur. Ce que
j'ai compris de la déclaration "Friend", c'est que l'objet concerné (ici
une variable booléenne) était accessible de tout "l'assembly", c'est à
dire que les programmes de "Property" de la classe "Sections"
pouvaient le modifier. A mon sens, ce n'est pas un problème
d'instanciation, dans la mesure où deux objets Ini1 et Ini2 pourraient
être modifiés indépendamment l'un de l'autre, donc ils possèdent bien
chacun sa propriété "Modified". D'après ce que j'ai compris de "Shared",
ce serait utile par exemple pour attribuer un numéro d'employé
incrémenté à chaque création d'un nouvel objet Employé : rien à voir
ici : je veux que la visibilité de ma variable s'étende à toutes les
classes
de mon projet, et pas au dehors. Il me semblait que c'était là le
concept
d'Assembly, et que Friend faisait justement ça, mais je n'ai rien trouvé
qui m'aide dans la doc sur Assembly ou Assemblys : comment déclarer
explicitement quelles classes en font partie, et tout ça. Comment aussi
déclarer qu'une classe ("Sections") n'a d'existence que comme propriété
d'un "Parent ("Ini").
Je ne sais pas si je vous ai compris, ni si vous m'avez compris, mais je
ne
me trouve pas éclairé par vos deux réponses.
Merci quand même, et, si possible, essayez encore....
AMIcalement.
"Patrice" a écrit dans le message de news:Public Class Ini déclare une classe mais ne crée pas un objet. L'objet
Ini que tu utilises plus loin n'existe donc pas et l'erreur parait tout
à fait normale.
- Soit il faut voir quel est ce fameux objet Ini que tu utilises mais
qui n'est pas déclaré.
- Soit tu veux que ce soit un membre de classe et tu as oublié le mot
clé "Shared".
Je peux difficilement en dire plus car je ne vois pas le rapport exact
entre la classe Ini et la classe Sections...
--
Patrice
"L'AMI Yves" a écrit dans le message de
news: 455c71f3$0$20555$Tu sais, il y a vingt ans que je fais du développement, alors des
erreurs, j'en
ai vu, et même dans les compilateurs...
Mais voici des extraits de mon code, tu comprendras peut-être mieux :
Public Class Ini ' Création de l'objet Ini
Private nameValue As String
...
Friend Modif As Boolean
...
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
Modif = True
End Set
End Property
...
Public ReadOnly Property Modified() As Boolean
Get
Modified = Modif
End Get
End Property
...
End Class
Public Class Sections ' Création de la collection de sous-objets
Sections
Implements System.Collections.IEnumerable
Private colSections As New Collection
Public Function Add(ByVal Name As String) As Section
Dim nouveau As New Section
nouveau.Name = Name
colSections.Add(nouveau, name)
Add = nouveau
Ini.Modif = True
^^^^^^^
...
Si je mets "Ini.", il me dit qu'il faut une référence d'objet
pour une référence à un membre non partagé.
Si je ne le mets pas, il me dit que le nom n'est pas déclaré.
Peut-être faut-il quelque chose de plus dans les déclarations des
classes,
ou même avant la première, mais justement, c'est ça ma question.
Merci.
Si le compilateur te dit que ta variable n'est pas déclarée, c'est
qu'il y a un problème de visibilité.
Comment tu essaye d'avoir accès à ta variable ? Tu dois faire
référence à la classe où elle a été déclarée :
ClassDéclarante.Variable = Valeur
Est ce que la classe dans laquelle tu déclare ta variable n'est pas
plus restrictive que friend ?
Est-ce un bug du compilateur, ou est-ce moi qui n'ai pas compris
l'instruction Friend (ou le concept d'assembly) ?
C'est marrant, très souvent, les gens qui rencontrent un problème
avec de programmation, pense tout de suite qu'il s'agit d'un bug du
compilateur ou du langage. Alors que 99 fois sur 100 cela vient
d'eux.
Merci si vous voulez bien m'aider...
Dis moi si ça marche.
A plus.