delphi variant和stream相互轉換的函數

網上廣爲流傳的兩個函數,確實好用。記錄一下數組

procedure VariantToStream (const v : OleVariant; Stream : TMemoryStream); 
var 
  p : pointer; 
begin 
  Stream.Position := 0; 
  Stream.Size := VarArrayHighBound (v, 1) - VarArrayLowBound (v, 1) + 1;  //其實能夠直接取下維做爲流大小,由於通常狀況下變體數組上維爲0的
  p := VarArrayLock (v);   //我寫程序時,就是到此卡住了,由於變體數組是一種安全數組,它是有描述數據的數組,v[0]纔是它的真實起始地址,但就是很可貴到它的地址,而這個函數恰好處理了這個問題!
  Stream.Write (p^, Stream.Size);  //此句讓我這個初學者驚歎,也不是沒有這樣用過,只是沒有在數組中這樣結合用過,呵呵,學習學習!
  VarArrayUnlock (v);   //再使用了VarArratLock()函數之後,必定要用此函,否則會報錯的!
  Stream.Position := 0; 
end;
procedure StreamToVariant (Stream : TMemoryStream; var v : OleVariant); 
var 
  p : pointer; 
begin 
  v := VarArrayCreate ([0, Stream.Size - 1], varByte);   //也學習一下這個函數,它是用來創建一個變體數組
  p := VarArrayLock (v);   //其它就沒有什麼了,基本跟上面的是相反的!
  Stream.Position := 0; 
  Stream.Read (p^, Stream.Size);   //其實這兩個過程的妙處就在此了,指針的應用,棒極了
  VarArrayUnlock (v); 
end;
相關文章
相關標籤/搜索