case的使用? |
答題得分者是:ha0009
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
myrecord=packed record name:string[20]; case is_a_gril:boolean of true: (fairy:boolean; liking:string[100]); false:(lustihood:boolean; old:integer; work:string[100] ); end;Record 的宣告是讓系統明瞭該如何配置你的記憶體,系統僅會對存取的型態作檢查,至於你要存放的資料所代表的意義 為何則是由你決定。 Case of 是宣告記憶體共用的方式,你的範例宣告應該改變一下會更好。看看下列說明或許你會了解。所以你應該再加一 個欄位讓你能夠確實判斷 Case of 中的宣告該如何使用。 [code] myrecord=packed record name:string[20]; is_gril:boolean; case is_a_gril:boolean of true: (fairy:boolean; liking:string[100]); false:(lustihood:boolean; work:string[100]; old:integer); end; var V : myrecord; begin if V.is_gril then begin // 存取 V.fairy 與 V.liking end else begin // 存取 V.lustihood 與 V.work 與 V.old end; end; F 表示 fairy 欄位,1 個 byte。 L 表示lustihood 欄位,因 100 長度太長,故以 10 個 L 代表 100 個 byte。 I liking 欄位,1 個 byte。 W work 欄位,因 100 長度太長,故以 10 個 W 代表 100 個 byte。 O old 欄位,1 個 byte。 FLLLLLLLLLL FLLLLLLLLLLOO [code] 我覺得這個案例不適用 Case of 宣告,在 Delphi 中的 VarType 函式所傳回的 TVarData 宣告是一個使用 Case of 最 佳的範例,如果你想對 Case of 做更深入的了解,建議你可以 Trace Source 研究。以上供參考 |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
[code]
myrecord=packed record
name:string[20];
is_gril:boolean;
case is_a_gril:boolean of
true: (fairy:boolean; liking:string[100]);
false:(lustihood:boolean; work:string[100]; old:integer);
end; var
V : myrecord;
begin
if V.is_gril then begin
// 存取 V.fairy 與 V.liking
end else begin
// 存取 V.lustihood 與 V.work 與 V.old
end;
end; 那么,请问一下!
1、is_a_gril 不是用不到了,我怎么才能使用?
2、上面 V.is_gril 值是不会改变的
3、那么您的列子我可以这样改吗?(不考虑宣告記憶體共用好处) [code]
myrecord=packed record
name:string[20];
is_gril:boolean; fairy:boolean;
liking:string[100] lustihood:boolean;
work:string[100];
old:integer;
end; var
V : myrecord;
begin
if V.is_gril then begin
// 存取 V.fairy 與 V.liking
end else begin
// 存取 V.lustihood 與 V.work 與 V.old
end;
end;
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
1、is_a_gril 不是用不到了,我怎么才能使用?
is_a_gril 名稱的宣告可有可無,這個 Tag 並不會使用到任何的記憶體空間。 2、上面 V.is_gril 值是不悝@的
is_gril 的內容與其他欄位的使用方式一樣呀,由程式寫入或讀出。 3、那么您的列子我可以犑滿H(不考邧襲i記憶體共用好z)
前文我以提及這個範例不需使用 Case of。你可以改成下列方式宣告。因為你
的資料結構中 fairy 和 liking 與 lustihood 和 work 是相同的,你並不需要重
複的宣告。頂多欄位名稱作一下修改,方便你日後維護。
myrecord=packed record name:string[20]; is_gril:boolean; fairy:boolean; // 與 lustihood 共用 liking:string[100] // 與 work 共用 old:integer; end; |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
Case of 的特性是共用記憶體,但有時並不一定是為了節省記憶體。
例如你可以使用 Case of 的特性轉換 Set of 的宣告為數值,範例如下
。
type TestSet = Set of (ts_aa, ts_bb, ts_cc); SetToNum = packed record case byte of 0 : (Num : byte); 1 : (SetValue : TestSet); end; var a : SetToNum; begin inherited; a.SetValue := [ts_aa, ts_cc]; Caption := format ('%x', [a.Num]) end;PS : 可查閱 Delphi 的 Variant parts in record 說明。 |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
ha0009 兄:
你的程式的值为5,而下面的却为1;我想这样做好像没什么意识吧!请问case还有什么用处,谢谢!!!
问个题外话,ha0009 兄哪儿的气温怎样?我这儿是挺高的!!! type
TestSet = Set of (ts_aa, ts_bb=10, ts_cc);
SetToNum = packed record
case byte of
0 : (Num : byte);
1 : (SetValue : TestSet);
end; var
a : SetToNum;
begin
a.SetValue := [ts_aa,ts_bb,ts_cc];
Caption := format ('%x', [a.Num])
end;
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
集合可視為一群旗標的組合。例如我的例子實際宣告排列如下 00000111 其中 0 表示未使用
,1 由右到左依序為 ts_aaa, ts_bbb, ts_ccc這三個元素。Delphi 也就是透過 bit map 來取的
對應的元素。 所以可以透過上例的方式將集合的值以整數取出。之所以如此應用是因為以前有需要將集合值
直接在資料庫內存取。 而您這樣的宣告我以為是無法使用的,因為除了第一個元素使用了第一個 bit 外,其餘元素都
是 0。 我住台中,今天天氣又悶又熱。 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |