Delphi--Stream和Variant的轉化

網上廣爲流傳的兩個函數,確實好用。記錄一下
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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章