Sous VB6 il est possible de définir un type de donnée Utilisateur (une
structure) à l'aide de "Type - End Type" et de le passer en paramètre d'une
procédure ou d'une fonction VB.
Est-il possible de sauvegarder l'adresse d'une telle structure dans un
pointeur de type Long comme on le fait avec les variables objet ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Patrice Henrio
Oui à la première question.
Type tPointPlan X As Single Y As Single End Type
Public Function CréerPointPlan(ByVal X As Single, ByVal Y As Single) As tPointPlan 'Transforme X et Y en un couple (X,Y) CréerPointPlan.X = X CréerPointPlan.Y = Y End Function
Private Type PointSphère X As Single Y As Single Z As Single End Type
Public Function PointLongLat(ByRef P As tPointPlan) As PointSphère 'Transforme les coordonnées terrestres (longitude,latitude) en coordonnées sphériques PointLongLat.X = Cos(Radian(P.Y)) * Cos(Radian(P.X)) PointLongLat.Y = Cos(Radian(P.Y)) * Sin(Radian(P.X)) PointLongLat.Z = Sin(Radian(P.Y)) End Function
Je ne sais pas à la deuxième. Il n'y a pas de handle pour les types utilisateurs, peut être un adresseOf ?
"jean saint jalmes" a écrit dans le message de news:
Bonjour,
Sous VB6 il est possible de définir un type de donnée Utilisateur (une structure) à l'aide de "Type - End Type" et de le passer en paramètre d'une procédure ou d'une fonction VB.
Est-il possible de sauvegarder l'adresse d'une telle structure dans un pointeur de type Long comme on le fait avec les variables objet ?
Merci d'avance, Jean
-------------------------------------------------------------------------------- J'utilise la version gratuite de SPAMfighter pour utilisateurs privés. 272 e-mails spam ont été bloqués jusqu'à maintenant. Les utilisateurs payant n'ont pas ce message dans leurs e-mails. Essayez SPAMfighter gratuitement maintenant!
Oui à la première question.
Type tPointPlan
X As Single
Y As Single
End Type
Public Function CréerPointPlan(ByVal X As Single, ByVal Y As Single) As
tPointPlan
'Transforme X et Y en un couple (X,Y)
CréerPointPlan.X = X
CréerPointPlan.Y = Y
End Function
Private Type PointSphère
X As Single
Y As Single
Z As Single
End Type
Public Function PointLongLat(ByRef P As tPointPlan) As PointSphère
'Transforme les coordonnées terrestres (longitude,latitude) en coordonnées
sphériques
PointLongLat.X = Cos(Radian(P.Y)) * Cos(Radian(P.X))
PointLongLat.Y = Cos(Radian(P.Y)) * Sin(Radian(P.X))
PointLongLat.Z = Sin(Radian(P.Y))
End Function
Je ne sais pas à la deuxième.
Il n'y a pas de handle pour les types utilisateurs, peut être un adresseOf ?
"jean saint jalmes" <jeansaintjalmes@discussions.microsoft.com> a écrit dans
le message de news: 478E4928-FF93-42A2-A306-2D66B50A9E54@microsoft.com...
Bonjour,
Sous VB6 il est possible de définir un type de donnée Utilisateur (une
structure) à l'aide de "Type - End Type" et de le passer en paramètre
d'une
procédure ou d'une fonction VB.
Est-il possible de sauvegarder l'adresse d'une telle structure dans un
pointeur de type Long comme on le fait avec les variables objet ?
Merci d'avance, Jean
--------------------------------------------------------------------------------
J'utilise la version gratuite de SPAMfighter pour utilisateurs privés.
272 e-mails spam ont été bloqués jusqu'à maintenant.
Les utilisateurs payant n'ont pas ce message dans leurs e-mails.
Essayez SPAMfighter gratuitement maintenant!
Public Function CréerPointPlan(ByVal X As Single, ByVal Y As Single) As tPointPlan 'Transforme X et Y en un couple (X,Y) CréerPointPlan.X = X CréerPointPlan.Y = Y End Function
Private Type PointSphère X As Single Y As Single Z As Single End Type
Public Function PointLongLat(ByRef P As tPointPlan) As PointSphère 'Transforme les coordonnées terrestres (longitude,latitude) en coordonnées sphériques PointLongLat.X = Cos(Radian(P.Y)) * Cos(Radian(P.X)) PointLongLat.Y = Cos(Radian(P.Y)) * Sin(Radian(P.X)) PointLongLat.Z = Sin(Radian(P.Y)) End Function
Je ne sais pas à la deuxième. Il n'y a pas de handle pour les types utilisateurs, peut être un adresseOf ?
"jean saint jalmes" a écrit dans le message de news:
Bonjour,
Sous VB6 il est possible de définir un type de donnée Utilisateur (une structure) à l'aide de "Type - End Type" et de le passer en paramètre d'une procédure ou d'une fonction VB.
Est-il possible de sauvegarder l'adresse d'une telle structure dans un pointeur de type Long comme on le fait avec les variables objet ?
Merci d'avance, Jean
-------------------------------------------------------------------------------- J'utilise la version gratuite de SPAMfighter pour utilisateurs privés. 272 e-mails spam ont été bloqués jusqu'à maintenant. Les utilisateurs payant n'ont pas ce message dans leurs e-mails. Essayez SPAMfighter gratuitement maintenant!
parci
On Sun, 25 Feb 2007 19:22:56 +0100, "Patrice Henrio" wrote:
Est-il possible de sauvegarder l'adresse d'une telle structure dans un pointeur de type Long comme on le fait avec les variables objet ?
Je ne sais pas à la deuxième. Il n'y a pas de handle pour les types utilisateurs, peut être un adresseOf ?
Non, VarPtr (AdresseOf retourne un pointeur de fonction).
Je ne sais pas quelle est l'idée de "jean saint jalmes", utiliser des références est bien plus pratique, mais bon, voilà un exemple d'utilisation :
' Déclarations Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Private Type Individu id As Long nom As String prenom As String age As Double End Type
Sub testPointers()
Dim lpIndividu As Long Dim monInd As Individu
' dans le même ordre que la déclaration (important pour le retour) With monInd .id = 4567 .nom = "coltrane" .prenom = "john" .age = 75.234 End With
' pointeur sur la structure lpIndividu = VarPtr(monInd)
' retour : pointeur -> structure ' copie du pointeur -> tableau d'octets puis chaque membre de la ' structure suivant sa taille (cas particulier pour les String de ' longueur variable -> on retrouve un pointeur puis les données)
Dim bBuffer() As Byte Dim iSizeByte As Long Dim lpString As Long Dim autreInd As Individu
iSizeByte = LenB(monInd)
ReDim bBuffer(0 To iSizeByte - 1) As Byte CopyMemory bBuffer(0), ByVal lpIndividu, iSizeByte
With autreInd CopyMemory .id, bBuffer(0), 4 CopyMemory lpString, bBuffer(4), 4 .nom = PointerToStringW(lpString) CopyMemory lpString, bBuffer(8), 4 .prenom = PointerToStringW(lpString) CopyMemory .age, bBuffer(12), 8 End With
End Sub
' retrouver une chaîne à partir d'un pointeur sur une chaîne unicode Private Function PointerToStringW(ByVal lpStringW As Long) As String
Dim Buffer() As Byte Dim nLen As Long
If lpStringW Then nLen = lstrlenW(lpStringW) * 2 If nLen Then ReDim Buffer(0 To (nLen - 1)) As Byte CopyMemory Buffer(0), ByVal lpStringW, nLen PointerToStringW = Buffer End If End If
End Function
On Sun, 25 Feb 2007 19:22:56 +0100, "Patrice Henrio"
<patrice.henrio@laposte.net> wrote:
Est-il possible de sauvegarder l'adresse d'une telle structure dans un
pointeur de type Long comme on le fait avec les variables objet ?
Je ne sais pas à la deuxième.
Il n'y a pas de handle pour les types utilisateurs, peut être un adresseOf ?
Non, VarPtr (AdresseOf retourne un pointeur de fonction).
Je ne sais pas quelle est l'idée de "jean saint jalmes", utiliser des
références est bien plus pratique, mais bon, voilà un exemple
d'utilisation :
' Déclarations
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As
Long) As Long
Private Type Individu
id As Long
nom As String
prenom As String
age As Double
End Type
Sub testPointers()
Dim lpIndividu As Long
Dim monInd As Individu
' dans le même ordre que la déclaration (important pour le retour)
With monInd
.id = 4567
.nom = "coltrane"
.prenom = "john"
.age = 75.234
End With
' pointeur sur la structure
lpIndividu = VarPtr(monInd)
' retour : pointeur -> structure
' copie du pointeur -> tableau d'octets puis chaque membre de la
' structure suivant sa taille (cas particulier pour les String de
' longueur variable -> on retrouve un pointeur puis les données)
Dim bBuffer() As Byte
Dim iSizeByte As Long
Dim lpString As Long
Dim autreInd As Individu
iSizeByte = LenB(monInd)
ReDim bBuffer(0 To iSizeByte - 1) As Byte
CopyMemory bBuffer(0), ByVal lpIndividu, iSizeByte
With autreInd
CopyMemory .id, bBuffer(0), 4
CopyMemory lpString, bBuffer(4), 4
.nom = PointerToStringW(lpString)
CopyMemory lpString, bBuffer(8), 4
.prenom = PointerToStringW(lpString)
CopyMemory .age, bBuffer(12), 8
End With
End Sub
' retrouver une chaîne à partir d'un pointeur sur une chaîne unicode
Private Function PointerToStringW(ByVal lpStringW As Long) As String
Dim Buffer() As Byte
Dim nLen As Long
If lpStringW Then
nLen = lstrlenW(lpStringW) * 2
If nLen Then
ReDim Buffer(0 To (nLen - 1)) As Byte
CopyMemory Buffer(0), ByVal lpStringW, nLen
PointerToStringW = Buffer
End If
End If
On Sun, 25 Feb 2007 19:22:56 +0100, "Patrice Henrio" wrote:
Est-il possible de sauvegarder l'adresse d'une telle structure dans un pointeur de type Long comme on le fait avec les variables objet ?
Je ne sais pas à la deuxième. Il n'y a pas de handle pour les types utilisateurs, peut être un adresseOf ?
Non, VarPtr (AdresseOf retourne un pointeur de fonction).
Je ne sais pas quelle est l'idée de "jean saint jalmes", utiliser des références est bien plus pratique, mais bon, voilà un exemple d'utilisation :
' Déclarations Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Private Type Individu id As Long nom As String prenom As String age As Double End Type
Sub testPointers()
Dim lpIndividu As Long Dim monInd As Individu
' dans le même ordre que la déclaration (important pour le retour) With monInd .id = 4567 .nom = "coltrane" .prenom = "john" .age = 75.234 End With
' pointeur sur la structure lpIndividu = VarPtr(monInd)
' retour : pointeur -> structure ' copie du pointeur -> tableau d'octets puis chaque membre de la ' structure suivant sa taille (cas particulier pour les String de ' longueur variable -> on retrouve un pointeur puis les données)
Dim bBuffer() As Byte Dim iSizeByte As Long Dim lpString As Long Dim autreInd As Individu
iSizeByte = LenB(monInd)
ReDim bBuffer(0 To iSizeByte - 1) As Byte CopyMemory bBuffer(0), ByVal lpIndividu, iSizeByte
With autreInd CopyMemory .id, bBuffer(0), 4 CopyMemory lpString, bBuffer(4), 4 .nom = PointerToStringW(lpString) CopyMemory lpString, bBuffer(8), 4 .prenom = PointerToStringW(lpString) CopyMemory .age, bBuffer(12), 8 End With
End Sub
' retrouver une chaîne à partir d'un pointeur sur une chaîne unicode Private Function PointerToStringW(ByVal lpStringW As Long) As String
Dim Buffer() As Byte Dim nLen As Long
If lpStringW Then nLen = lstrlenW(lpStringW) * 2 If nLen Then ReDim Buffer(0 To (nLen - 1)) As Byte CopyMemory Buffer(0), ByVal lpStringW, nLen PointerToStringW = Buffer End If End If