一,、變體類型常用的函數(shù)介紹:
Variant: 一種可以擁有各種數(shù)據(jù)類型; 也可以告訴目前存儲(chǔ)的數(shù)據(jù)是什么類型(通過使用VarType函數(shù)),; 可以給相同的Variant分配不同的數(shù)據(jù)類型,只要Variant包含數(shù)字值就可以執(zhí)行算法,; variant數(shù)組只不過是variant型的數(shù)組,,不必包含同類型的數(shù)據(jù);
1,、 VarArrayOf函數(shù):更快捷的創(chuàng)建一維變體數(shù)組,,可以創(chuàng)建全異的數(shù)值數(shù)組; function VarArrayOf(const Values: array of Variant): Variant;
VarArrayOf是一種快速(寫代碼快而不是運(yùn)行快)的方法生成一個(gè)一維Variant數(shù)據(jù)的方法,,它接受一個(gè)Variant類型的Open Array,,用這個(gè)數(shù)據(jù)生成一個(gè)一維的Variant Array of Variant(類型為Variant)。由于Delphi對Open Array類型參數(shù)的支持,,使你可以用一行語句生成一個(gè)數(shù)組,。不過它有兩個(gè)缺陷:只能生成一維數(shù)組;只能生成元素類型是Variant的數(shù)組,。使用Variant數(shù)組, 與使用標(biāo)準(zhǔn)Delphi數(shù)組類似,; 例如: MyArray := VarArrayOf(['李維',, 30, '60', 60.369, 'China']);
2,、 VarArrayCreate函數(shù): function VarArrayCreate(const Bounds: array of Integer; VarType: TVarType): Variant;
Bounds: 告訴數(shù)組的上下界,; VarType: 決定了數(shù)組的中存儲(chǔ)什么類型的數(shù)據(jù)。其它的數(shù)組(如二維,、或者其他類型等)只能用VarArrayCreate去創(chuàng)建,,并用循環(huán)給元素賦值。 例如:創(chuàng)建數(shù)組的數(shù)組, 可以模仿任何類型的數(shù)據(jù)結(jié)構(gòu)類型: VarArrayX := VarArrayCreate([1,10], varVariant); 數(shù)組的單個(gè)元素可以裝載一個(gè)數(shù)組: VarArrayX[1] := VarArrayCreate([1,5], varVariant);
3,、VarArrayHighBound,、VarArrayLowBound函數(shù):返回變體數(shù)組上/下限,從1開始(1:列,;2:行,;3:3維的最后一維)。 function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;
4,、VarArrayRedim函數(shù):修改variant數(shù)組的最高限,。 procedure VarArrayRedim(A: Variant; HighBound: Integer);
5、VarArrayDimCount函數(shù):返回variant數(shù)組維數(shù) unction VarArrayDimCount(const A: Variant): Integer;
6,、VarArrayLock,、VarArrayUnLock函數(shù):避免運(yùn)行時(shí)刻檢查。一般用于初始化一個(gè)大數(shù)組,。 function VarArrayLock(const A: Variant): Pointer; procedure VarArrayUnlock(var A: Variant);
在對Variant數(shù)組的每一個(gè)元素進(jìn)行賦值時(shí),,都要通過運(yùn)行時(shí)邏輯來檢查并判斷數(shù)據(jù)類型的兼容性、每個(gè)元素的位置等等,。為了避免運(yùn)行時(shí)檢查,,要用VarArrayLock()函數(shù)和VarArrayUnlock()過程。VarArrayLock()函數(shù)在內(nèi)存中鎖定數(shù)組,,使數(shù)組不再移動(dòng)和改變大小,,并能返回一個(gè)指向數(shù)組數(shù)據(jù)的指針。而VarArrayUnlock()過程用來對VarArrayLock()函數(shù)鎖定的數(shù)組進(jìn)行解鎖,,使數(shù)組能重新移動(dòng)或改變大小,。在鎖定數(shù)組后,能用更有效的方法對數(shù)組進(jìn)行初始化,。
7,、VarArrayRef函數(shù):獲得variant指向的數(shù)據(jù) function VarArrayRef(const A: Variant): Variant;
8、VarIsArray函數(shù):是一個(gè)簡單的布爾檢查函數(shù),,判斷是否是一個(gè) Variant數(shù)組,,是則返回True function VarIsArray(const A: Variant): Boolean; overload; function VarIsArray(const A: Variant; AResolveByRef: Boolean): Boolean; overload;
9、其他函數(shù)
1>,、VarClear()過程清除Variant變量并將VType域的值設(shè)為varEmpty. 2>,、VarCopy()將Source復(fù)制到Dest,。 3>、VarCast()將一個(gè)Variant轉(zhuǎn)換成指定的類型并存儲(chǔ)在另一個(gè)Variant變量中,。 4>,、VarType()返回指定Variant的varXXX類型代碼。 5>,、VarAsType()跟VarCast()的功能一樣,。 6>、VarIsEmpty()如果一個(gè)Variant變量的類型代碼是varEmpty則返回True,。 7>,、VarIsNull()判斷Variant變量是否包含null值。 8>,、VarToStr()將一個(gè)Variant變量轉(zhuǎn)換成字符串表達(dá)式(如果Variant為varEmpty或varNUll則為空字符串),。 9>、VarFromDateTime()返回一個(gè)Variant變量,,它存放著指定的TDateTime類型的值,。 10>、VarToDateTime()返回在Variant中的TDateTime類型的值,。
二、一個(gè)簡單實(shí)例代碼:
var
a, b: Variant;
I, J, K, M: Integer;
begin
//a是個(gè)一維Variant數(shù)組,,元素類型是Variant,,元素個(gè)數(shù)是3,上界是2,,下界是0,。
a := VarArrayOf([1234, 'abc ', Null]);
//b是一個(gè)16行4列的二維數(shù)組
b := VarArrayCreate[0, 3, 1, 16], varOleStr);
I := VarArrayHighBound(b, 1); // I是b的最大列號(hào):3;
J := VarArrayLowBound(b, 1); // J是b的最小列號(hào):0,;
K := VarArrayHighBound(b, 2); // K是b的最大行號(hào):16,;
M := VarArrayLowBound(b, 2); // M是b的最小行號(hào):1。
end;
注意,,Variant數(shù)組下標(biāo)是列在前,,行在后,元素類型是PWideChar,,最大列號(hào)是3,,最小列號(hào)是0,最大行號(hào)是16,,最小行號(hào)是1,。
三、變體類型和流的相互轉(zhuǎn)換
//1,、 變體類型轉(zhuǎn)成流
procedure VariantToStream(const Data: OleVariant; Stream: TStream);
var
p: Pointer;
begin
p := VarArrayLock(Data); // 加鎖,,并返回一個(gè)指針指向的數(shù)據(jù),。 避免運(yùn)行時(shí)時(shí)刻檢查
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1); // 返回最大的列號(hào)
finally
VarArrayUnlock(Data); // 解鎖,使數(shù)組能重新移動(dòng)或改變大小,。
end;
end;
// 2,、流轉(zhuǎn)成變體類型
function StreamToVariant(Stream: TStream): OleVariant;
var
p: Pointer;
begin
Result := VarArrayCreate([0, Stream.Size - 1], varByte);// 創(chuàng)建一個(gè)以為的數(shù)組。類型為varByte
p := VarArrayLock(Result);
try
Stream.Position := 0; // 設(shè)置流的位置
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;
|