Delphi 變體類型(Variant)的介紹(流與變體類型的相互轉換、變體類型常用的函數)

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   

來源:http://blog.csdn.net/xiongmao000738/article/details/6863988  一、變體類型常用的函數介紹:

        Variant: 一種可以擁有各種資料類型; 也可以告訴目前儲存的資料是什麼類型(通過使用VarType函數); 可以給相同的Variant分配不同的資料類型,只要Variant包含數字值就可以執行演算法; variant數組只不過是variant型的數組,不必包含同類型的資料;

1、  VarArrayOf函數:更快捷的建立一維變體數組,可以建立全異的數值數組; function VarArrayOf(const Values: array of Variant): Variant;

        VarArrayOf是一種快速(寫代碼快而不是運行快)的方法產生一個一維Variant資料的方法,它接受一個Variant類型的Open Array,用這個資料產生一個一維的Variant Array of Variant(類型為Variant)。由於Delphi對Open Array型別參數的支援,使你可以用一行語句產生一個數組。不過它有兩個缺陷:只能產生一維數組;只能產生元素類型是Variant的數組。使用Variant數組, 與使用標準Delphi數組類似; 例如: MyArray := VarArrayOf([‘李維‘, 30, ‘60‘, 60.369, ‘China‘]);

2、  VarArrayCreate函數: function VarArrayCreate(const Bounds: array of Integer; VarType: TVarType): Variant;

        Bounds: 告訴數組的上下界; VarType: 決定了數組的中儲存什麼類型的資料。其它的數組(如二維、或者其他類型等)只能用VarArrayCreate去建立,並用迴圈給元素賦值。 例如:建立數組的數組, 可以模仿任何類型的資料結構類型:             VarArrayX := VarArrayCreate([1,10], varVariant); 數組的單個元素可以裝載一個數組: VarArrayX[1] := VarArrayCreate([1,5], varVariant);

3、VarArrayHighBound、VarArrayLowBound函數:返回變體數組上/下限,從1開始(1:列;2:行;3:3維的最後一維)。 function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;

4、VarArrayRedim函數:修改variant數組的最高限。 procedure VarArrayRedim(A: Variant; HighBound: Integer);

5、VarArrayDimCount函數:返回variant數組維數 unction VarArrayDimCount(const A: Variant): Integer;

6、VarArrayLock、VarArrayUnLock函數:避免運行時刻檢查。一般用於初始化一個大數組。 function VarArrayLock(const A: Variant): Pointer; procedure VarArrayUnlock(var A: Variant);

        在對Variant數組的每一個元素進行賦值時,都要通過運行時邏輯來檢查並判斷資料類型的相容性、每個元素的位置等等。為了避免運行時檢查,要用VarArrayLock()函數和VarArrayUnlock()過程。VarArrayLock()函數在記憶體中鎖定數組,使數組不再移動和改變大小,並能返回一個指向數組資料的指標。而VarArrayUnlock()過程用來對VarArrayLock()函數鎖定的數組進行解鎖,使數組能重新移動或改變大小。在鎖定數組後,能用更有效方法對數組進行初始化。

7、VarArrayRef函數:獲得variant指向的資料 function VarArrayRef(const A: Variant): Variant;

8、VarIsArray函數:是一個簡單的布爾檢查函數,判斷是否是一個 Variant數組,是則返回True function VarIsArray(const A: Variant): Boolean; overload; function VarIsArray(const A: Variant; AResolveByRef: Boolean): Boolean; overload;

9、其他函數

1>、VarClear()過程清除Variant變數並將VType域的值設為varEmpty. 2>、VarCopy()將Source複製到Dest。 3>、VarCast()將一個Variant轉換成指定的類型並儲存在另一個Variant變數中。 4>、VarType()返回指定Variant的varXXX類型代碼。 5>、VarAsType()跟VarCast()的功能一樣。 6>、VarIsEmpty()如果一個Variant變數的類型代碼是varEmpty則返回True。 7>、VarIsNull()判斷Variant變數是否包含null值。 8>、VarToStr()將一個Variant變數轉換成字串運算式(如果Variant為varEmpty或varNUll則為空白字串)。 9>、VarFromDateTime()返回一個Variant變數,它存放著指定的TDateTime類型的值。 10>、VarToDateTime()返回在Variant中的TDateTime類型的值。

二、一個簡單一實例代碼:

var

  a, b: Variant;

  I, J, K, M: Integer;

begin

  //a是個一維Variant數組,元素類型是Variant,元素個數是3,上界是2,下界是0。

  a := VarArrayOf([1234,   ‘abc ‘,   Null]);

  //b是一個16行4列的二維數組

  b := VarArrayCreate[0, 3, 1, 16],   varOleStr);

 I := VarArrayHighBound(b, 1); // I是b的最大列號:3;

  J := VarArrayLowBound(b, 1); // J是b的最小列號:0;

  K := VarArrayHighBound(b, 2); // K是b的最大行號:16;

  M := VarArrayLowBound(b, 2); // M是b的最小行號:1。

end;

注意,Variant數組下標是列在前,行在後,元素類型是PWideChar,最大列號是3,最小列號是0,最大行號是16,最小行號是1。

三、變體類型和流的相互轉換

//1、 變體類型轉成流

procedure VariantToStream(const Data: OleVariant; Stream: TStream);

var

  p: Pointer;

begin

  p := VarArrayLock(Data);  // 加鎖,並返回一個指標指向的資料。 避免運行時時刻檢查

  try

    Stream.Write(p^, VarArrayHighBound(Data,1) + 1);  // 返回最大的列號

  finally

    VarArrayUnlock(Data); // 解鎖,使數組能重新移動或改變大小。

  end;

end;

 

// 2、流轉成變體類型

function StreamToVariant(Stream: TStream): OleVariant;

var

  p: Pointer;

begin

  Result := VarArrayCreate([0, Stream.Size - 1], varByte);// 建立一個以為的數組。類型為varByte

  p := VarArrayLock(Result);

  try

    Stream.Position := 0;  // 設定流的位置

    Stream.Read(p^, Stream.Size);

  finally

    VarArrayUnlock(Result);

  end;

end;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.