OVH Cloud OVH Cloud

Structures sous VB6

2 réponses
Avatar
jean saint jalmes
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

2 réponses

Avatar
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!
Avatar
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