2010-09-01 17 views
17

Ho due programmi Delphi7: un server di automazione COM (EXE) e l'altro programma che utilizza il server di automazione.Come utilizzare gli array di varianti in Delphi

Ho bisogno di passare una serie di byte da un programma all'altro.

Dopo alcune ricerche, ho trovato che usare gli array varianti è la strada da percorrere (correggimi per favore se conosci metodi migliori).

La mia domanda è: Come si crea un array variante in un programma, e come faccio a leggerne i valori nell'altro?

Conosco VarArrayCreate e VarArrayLowBound/VarArrayHighBound, ma non sono sicuro su come farlo correttamente.

Grazie!

risposta

25

si crea così:

Dichiarazioni primo

var 
    VarArray: Variant; 
    Value: Variant; 

Poi la creazione:

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

o si potrebbe anche avere

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

Dipende t lui digita i dati. Quindi si itera in questo modo:

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

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

Infine si cancella l'array quando non ce n'è più bisogno. EDIT: (Questo è opzionale, vedi In Delphi 2009 do I need to free variant arrays?)

VarClear(VarArray); 

Questo è tutto ciò che devi fare. Per un altro esempio guardare il funzionario Embracadero Help

EDIT:

L'array deve essere creato solo una volta. Quindi basta usarlo come mostrato nell'esempio sopra.

+0

Grazie! Potresti anche dare qualche codice di esempio su come leggere l'array sul lato del client? Diciamo che un vararray è passato al client in una variante, come lo leggi? Chiami VarArrayCreate o usi solo VarArrayLowBound ecc.? – Steve

+0

Basta usare l'array sull'altro lato. Crealo solo una volta. Ma fai attenzione a chi è responsabile della sua eliminazione. – Runner

7

Per l'altro lato:

(valore supponendo che è il parametro Variante e il tipo di elemento è 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

Per cosa è VarArrayLock? Sto usando un array di byte btw. Dove è definito PWideStringArray? Esiste anche un PByteArray? Grazie! – Steve

+2

PWideStringArray è un tipo definito dall'utente, come suggerisce il nome, un puntatore a un array di WideStrings. Puoi trovare PByteArray in SysUtils. VarArrayLock blocca la matrice e restituisce un puntatore alla memoria contenente l'array per un accesso più rapido. Dato che hai diversi processi con questo array, ti suggerisco di utilizzare questa funzionalità. Puoi cercare maggiori informazioni nella guida di D7. –

Problemi correlati