標籤: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;