2010-09-01 31 views
17

Tengo dos programas Delphi7: un servidor de automatización COM (EXE) y el otro programa que está usando el servidor de automatización.Cómo usar matrices de variantes en Delphi

Necesito pasar una matriz de bytes de un programa a otro.

Después de algunas búsquedas, he encontrado que usar matrices de variantes es el camino a seguir (corrígeme por favor si conoce algún método mejor).

Mi pregunta es: ¿Cómo creo una matriz variante en un programa, y ​​luego cómo leo sus valores en el otro?

Conozco VarArrayCreate y VarArrayLowBound/VarArrayHighBound, pero no estoy seguro de cómo hacerlo correctamente.

Gracias!

Respuesta

25

lo crea así:

Declaraciones primera

var 
    VarArray: Variant; 
    Value: Variant; 

Entonces la creación:

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

o usted podría también tener

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

Depende de t el tipo de datos Luego itera así:

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

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

Finalmente borra la matriz cuando ya no la necesita. EDIT: (Esto es opcional, ver In Delphi 2009 do I need to free variant arrays?)

VarClear(VarArray); 

Eso es todo lo que hay que hacer. Para otro ejemplo mira el oficial Embracadero Help

EDIT:

La matriz debe crearse una sola vez. Entonces solo úsalo como se muestra en el ejemplo anterior.

+0

Gracias! ¿Podría dar también algún código de ejemplo sobre cómo leer la matriz en el lado del cliente? Digamos que un vararray se pasa al cliente en una variante, ¿cómo lo lees? ¿Llamas a VarArrayCreate o simplemente usas VarArrayLowBound, etc.? – Steve

+0

Simplemente use la matriz en el otro lado. Créelo solo una vez. Pero ten cuidado con quién es el responsable de limpiarlo. – Runner

7

Por el otro lado:

(Valor suponiendo es el parámetro de variante y el tipo de elemento es 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

¿Para qué sirve VarArrayLock? Estoy usando una matriz de bytes por cierto. ¿Dónde se define PWideStringArray? ¿Hay un PByteArray también? ¡Gracias! – Steve

+2

PWideStringArray es un tipo autodefinido, como su nombre lo indica, un puntero a una matriz de WideStrings. Puede encontrar PByteArray en SysUtils. VarArrayLock bloquea la matriz y devuelve un puntero a la memoria que contiene la matriz para un acceso más rápido. Como tiene diferentes procesos jugueteando con esta matriz, le sugiero que use esta funcionalidad. Puede buscar más información en la ayuda de D7. –

Cuestiones relacionadas