L'emplacement mémoire n'est pas valide

drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 - 31 mai 2006 à 16:45
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 6 juin 2006 à 11:29
Bonjour;

je suis en train de créer (ou d'essayer de créer) une macro afin de récupérer des informations depuis un logiciel de CAO (TopSolid) pour les envoyer vers Excel.

Dans ce cas je veux récupérer la chaine de caractère d'un texte (label de cotation) que je retrouve dans le dessin grace au nom de cet élément. J'obtient alors toutes les informations sur l'éléments : hauteur du texte, nom, désignation... Mais quand je veux obtenir la string (valeur du texte) j'ai l'erreur suivante: "L'accès à cette emplacement de mémoire n'est pas valide (Exception from HRESULT: 0x800703E6)" et du coup ma variable cc=nothing.



si quelqu'un pouvait éclairer ma lanterne ce serai super sympa. Merci






dim doc AsTopSolid.Document
Dim cc AsString
Dim tt As TopSolid.IText

EltNam = Doc.Elements.Item(i).Name




If  EltNam =
"totonom"
Then




tt = Doc.Elements.Item(i)


cc = tt.String


Doc.Elements.Item(i).String =




"lateteatoto"



'change le texte






r = MsgBox(cc, MsgBoxStyle.OkOnly)


End



If




 Drikce 06

4 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
31 mai 2006 à 20:50
Je dirais à priori 2 solutions :
 soit tu vire la variable tt qui sert pas à grand chose, et tu fais directement cc = Doc.Elements.Item(i).String

soit tu conserve la variable tt, mais il faut l'initialiser. Dans ton cas elle ne l'est pas. La variable tt telle que déclarée répresente un objet (ou une référence à l'objet). Mais cet objet n'est pas créer en mémoire.
Pour cela il faut utiliser l'instruction Set.
Comme toi tu veux une référence sur un objet déjà existant, il n'est pas necessaire de creer un nouvel objet, il suffit juste d'associer la référence à l'objet existant. Il faut donc que tu fasse Set tt = Doc.Elements.Items(i).

0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
1 juin 2006 à 08:58
Bonjour

En .NET, pas besoin de SET.
tt = Doc.Elements.Items(i)
c'est mieux.
Doc, tu l'initalise où .?

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
6 juin 2006 à 08:41
Bonjour, merci pour vos réponses et excuser moi du temps de réaction mais je n'était pas la.
Voici la procédure complète pour que vous ayez toutes les informations. L'application reconnait bien la variable tt comme un objet TopSolid mais a la fin quand je demande les valeurs des variables bb et cc (hauteur de texte et texte) dans la msgbox j'ai bien la hauteur du texte (bb) mais le texte (cc) est égale à nothing et quand on regarde l'objet tt dans le détails dans la partie string on retrouve le problème du à la mémoire.


Private






Sub
Button1_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
Button1.Click


Dim
Doc

As
TopSolid.Document


Dim
NbElt, Nbtext, i

As



Integer

Dim
m1, m2, m3, m4, m5, texteltdes1

As



String

Dim
texteltdes2

As



String

Dim
nameused, r, legende

As



String

Dim
EltNam

As



String

Dim
cc, bb

As



String






On



Error



Resume



Next

Nbtext = 0


TopDoc = TopApp.Documents.Open(




"S:\TOPSOLID\Group\Template\PRO_Filiere_A4V_assemblage_test.dft"
)m1 = Chr(13)

m2 = Nbtext &


"texte(s)"

Doc = TopApp.CurrentDocument


Nbtext = Doc.Texts.Count


NbElt = Doc.Elements.Count


m1 = Chr(13)


m2 = Nbtext &




" texte(s)"

r = MsgBox(m2 & m1 &




" Détails ?"
, MsgBoxStyle.OkCancel, Doc.Name)


If
r = 1

Then






For
i = 1

To
NbEltEltNam = Doc.Elements.Item(i).Name


If
EltNam =

"totonom"



Then

texteltdes2 = Doc.Elements.Item(i).Name


Doc.Elements.Item(i).Name =




"totonom"



'change le nom






Dim
tt

As
TopSolid.ITexttt =


Nothing

tt = Doc.Elements.Item(i)


bb = tt.Height


cc = tt.String







'Doc.Elements.Item(i).String = "lateteatoto" 'change le texte






'Doc.Elements.Item(i).Name = "totonom" 'change le nom

r = MsgBox(cc &




" "
& bb, MsgBoxStyle.OkOnly)


End



If






If
EltNam =

"$TITLE1"



Then

texteltdes1 = Doc.Title1


r = MsgBox(texteltdes1, MsgBoxStyle.OkOnly)







End



If






If
r = 2

Then
i = NbElt


Next
i


End



If

TopApp =




Nothing

TopDoc =




Nothing

Doc =




Nothing

r = MsgBox(




"Fermer le fichier?"
, MsgBoxStyle.YesNo)


If
r = 1

Then

TopApp.CurrentDocument.Close(




True
,

True
)


End



If






End



Sub




 Drikce 06
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
6 juin 2006 à 11:29
Bonjour

quand tu fais :
Doc.Elements.Item(i)

Es-tu sur que Item est de base 1 ?

Tu peux essayer de traiter l'erreur avec un Try/catch.

Je n'y connais rien en TopSolid.

Il est plus facile de batiser quelqu'un que de la convertir. (surtout en programmation)
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)

<fon></fon>
0
Rejoignez-nous