2010-09-01 39 views
17

J'ai deux programmes Delphi7: un serveur d'automatisation COM (EXE) et l'autre programme qui utilise le serveur d'automatisation.Comment utiliser des tableaux de variantes dans Delphi

J'ai besoin de passer un tableau d'octets d'un programme à l'autre.

Après quelques recherches que j'ai trouvé que l'utilisation des réseaux de variantes est la voie à suivre (corrigez-moi s'il vous plaît si vous connaissez des meilleures méthodes).

Ma question est: Comment créer un tableau de variantes dans un programme, puis comment lire ses valeurs dans l'autre?

Je sais à propos VarArrayCreate et VarArrayLowBound/VarArrayHighBound, mais je ne suis pas sûr sur la façon de le faire correctement.

Merci!

Répondre

25

Vous créez comme ça:

Déclarations premier

var 
    VarArray: Variant; 
    Value: Variant; 

Puis la création:

VarArray := VarArrayCreate([0, Length - 1], varVariant); 

ou vous pourriez aussi avoir

VarArray := VarArrayCreate([0, Length - 1], varInteger); 

Dépend t Le type de données Ensuite, vous itérer comme ceci:

i := VarArrayLowBound(VarArray, 1); 
HighBound := VarArrayHighBound(VarArray, 1); 

while i <= HighBound do 
begin 
    Value := VarArray[i]; 
    ... do something ... 
    Inc(i); 
end; 

Enfin, vous désactivez le tableau lorsque vous n'avez plus besoin. EDIT: (Cette option est facultative, voir In Delphi 2009 do I need to free variant arrays?)

VarClear(VarArray); 

C'est tout ce qu'il ya à faire. Pour un autre exemple regarder le fonctionnaire Embracadero Help

EDIT:

Le tableau doit être créé qu'une seule fois. Ensuite, utilisez-le comme indiqué dans l'exemple ci-dessus.

+0

Merci! Pourriez-vous également donner un exemple de code sur la façon de lire le tableau sur le côté du client? Disons qu'un vararray est passé au client dans un variant, comment le lisez-vous? Appelez-vous VarArrayCreate ou utilisez-vous simplement VarArrayLowBound, etc.? – Steve

+0

Utilisez simplement le tableau de l'autre côté. Créez-le une seule fois. Mais attention à qui est responsable de l'éclaircir. – Runner

7

Pour l'autre côté:

(en supposant la valeur est le paramètre Variant et le type d'élément est WideString)

var 
    Source: PWideStringArray; 

if VarIsArray(Value) then begin 
    Source:= VarArrayLock(Value); 
    try 
    for i:= 0 to TVarData(Value).VArray^.Bounds[0].ElementCount - 1 do 
     DoWhatEverYouWantWith(Source^[i]); 
    end; 
    finally 
    VarArrayUnlock(Value); 
    end; 
end; 
+0

Qu'est-ce que VarArrayLock? J'utilise un tableau d'octets btw. Où est défini PWideStringArray? Y a-t-il aussi un PByteArray? Merci! – Steve

+2

PWideStringArray est un type auto-défini, comme son nom l'indique, un pointeur vers un tableau de WideStrings. Vous pouvez trouver PByteArray dans SysUtils. VarArrayLock verrouille le tableau et renvoie un pointeur vers la mémoire contenant le tableau pour un accès plus rapide. Comme vous avez différents processus de bidouillage avec ce tableau, je suggère d'utiliser cette fonctionnalité. Vous pouvez rechercher plus d'informations dans l'aide D7. –