Delphi筆記 整理 變體

2021-08-29 12:37:40 字數 3872 閱讀 5319

除結構型別和指標外,變體型別能儲存其它的任何型別;

變體型別能儲存介面,並能通過它使用介面的方法和屬性(參考object inte***ces);

變體型別能儲存動態陣列,也能儲存一種特殊的靜態陣列:變體陣列(variant array)。

變體型別能和其它變體型別、整數、實數、字串和布林值在表示式和賦值語句中混合使用,編譯器自動完成型別轉換。

可以通過自定義來擴充套件變體型別,從而能儲存任意值。比如,你可以定義乙個使用索引的變體字串

型別,或者讓它儲存特定的類引用、記錄或靜態陣列。自定義變體型別通過tcustomvarianttyp 的子類

來建立。

所有的變體型別在建立時被初始化為unassigned,null 表示未知或沒有資料。

標準函式vartype 返回變體型別的型別碼,常量vartypemask 是乙個位掩碼,用來從vartype 的返回值

中提取型別碼,所以,在下面的例子中

vartype(v) and vartypemask = vardouble

若v 包含double 或double 陣列,則它返回true

在system 單元定義的tvardata 記錄型別能被用來轉換變體型別,並且可以訪問它們的內部構造。

varastype 和varcast 標準例程能用來改變乙個variant 的內部表示。

除了^、is 和in,所有運算子都可以使用variant 作為運算數

對variant 的操作返回variant 值;若有乙個運算數是null 則結果為null;

若有乙個運算數為unassigned 則引發異常。

在二元運算中,若只有乙個運算數是variant,則另乙個被轉換為variant。

不能把乙個普通的靜態陣列賦給variant,取而代之的是,通過呼叫vararraycreate 或vararrayof 兩者

之一來建立variant 陣列。比如,

v: variant;

...

v := vararraycreate([0,9], varinteger);

要建立字串型別的variant 陣列,使用varolestr

使用vararrayredim 函式來更改variant 陣列的大小。其它用於variant 陣列的標準例程包括

vararraydimcount 、vararraylowbound 、vararrayhighbound 、vararrayref 、vararraylock 和vararrayunlock.

。variant 和olevariant 的主要區別是,variant 能包含只有當前程式才能理解的資料型別,

olevariant 只包含為ole 自動化相容而定義的資料型別,它說明,這些資料型別能在程式間或通過網路傳送,

而不必擔心另一端是否知道如何處理它們。

type

t1 = integer;

t2 = t1;

t3 = integer;

t4 = t2;

t1、t2、t3、t4 和integer 都是指的同一種型別。要宣告一種不同的型別,在宣告中重複type 關鍵字。

比如 type tmyinteger = type integer;

建立了一種新型別tmyinteger,它和integer 不同。

乙個型別宣告指定乙個標誌符,來表示一種資料型別。型別宣告的語法為

type newtypename = type

這裡,newtypename 是乙個有效的標誌符。比如,給定如下的型別宣告

type tmystring = string;

你就可以宣告變數

var s: tmystring;

同時宣告多個變數時不能包括初始化,variant 和檔案型別的變數宣告也不能初始化。

如果你沒有明確地初始化乙個全域性變數,編譯器把它初始化為0。相反,不能在宣告區域性變數時進行初

始化,它們的值是隨機的,直到賦給它們乙個值。

你可以建立乙個新變數,它和另乙個變數在記憶體的同乙個位置。要這樣做的話,宣告這個新變數時在類

型名的後面跟關鍵字absolute,後面再跟乙個已存在(先前宣告)的變數。比如,

var

str: string[32];

strlen: byte absolute str;

指定變數strlen 從str 的位址開始。因為短字串的第乙個位元組包含字串的長度,strlen 的值就是str

的長度。

使用absolute 宣告時不能初始化變數,也不能組合其它指示字(和absolute 一同使用)。

可以呼叫getmem 或new 過程來建立動態變數,這種變數在堆中分配記憶體,它們不能自動管理。

使用freemem 來釋放由getmem 建立的變數,使用dispose 釋放由new 建立的變數。

其它能作用於動態變數的標準例程包括reallocmem、initialize、stralloc 和strdispose。

宣告執行緒區域性變數時,使用threadvar,而不是var,比如,

threadvar x: integer;

執行緒變數宣告

• 不能出現在過程或函式中

• 不能包含初始化

• 不能指定absolute 指示字

不能建立指標或過程型別的執行緒變數,也不能在動態調入庫中使用執行緒變數(除了包)。

由編譯器管理的動態變數,即長字串、寬字串、動態陣列、variants 和介面,能被宣告為threadvar,

但編譯器不能自動釋放由每個執行緒建立的堆記憶體。若使用這些型別的執行緒變數,要負責釋放它們的記憶體。

資源字串的宣告像真常量,除了用resourcestring 代替const。表示式等號的右邊必須是常量表示式並

且返回乙個字串。

在預設的編譯狀態下,型別常量不能被賦予新值,實際上,它們是唯讀變數;但如果使用了

編譯器指示字,型別常量能被賦予新值,它們在本質上就像初始化的變數。

要宣告陣列常量,把陣列元素的值用括號括起來,值之間用逗號隔開,這些值必須是常量表示式。比如,

const digits: array[0..9] of char = (』0』, 』1』, 』2』, 』3』, 』4』, 』5』, 』6』, 』7』, 』8』, 』9』);

上面的宣告可以方便地表示為

const digits: array[0..9] of char = 』0123456789』;

要宣告乙個記錄常量,在括號中使用fieldname: value 的形式來指定每個欄位的值,每個欄位用分號隔開。

每個欄位的值必須是常量表示式。字段列出的順序必須和宣告的相同,若有tag 字段,則必須指定它的

值;若記錄有乙個variant 部分,只有tag 字段選定的variant 才能被賦值。

舉例如下:

type

tpoint = record

x, y: single;

end;

tvector = array[0..1] of tpoint;

tmonth = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);

tdate = record

d: 1..31;

m: tmonth;

y: 1900..1999;

end;

const

origin: tpoint = (x: 0.0; y: 0.0);

line: tvector = ((x: -3.1; y: 1.5), (x: 5.8; y: 3.0));

someday: tdate = (d: 2; m: dec; y: 1960);

記錄常量不能包含檔案型別的值。

Delphi中的變體Variant陣列相關函式

1.vararraycreate procedure tform1.button1click sender tobject varv,w variant i integer begin v vararraycreate 1,4 varvariant v 1 1 v 2 2 v 3 true v 4 ...

Delphi筆記 整理 堆和棧

在windows 下,乙個程式的堆疊由兩個值定義 堆疊的最小值和最大值。這兩個值受編譯器指示字 minstacksize 和 maxstacksize 所控制,它們的預設值分別是16,384 16k 和1,048,576 1m 在linux 下,堆疊大小只能由環境設定。在register 約定下,最...

Delphi整理四(程式控制結構)

三種流程控制結構 順序結構 分支結構 迴圈結構 複雜問題分 有限個順序 分支後迴圈結構 if語法 if 條件 then 語句序列1 else 語句序列2 if then else 是乙個語句 例,if then else 複雜點 if then begin end else begin end if...