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