全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1753
推到 Plurk!
推到 Facebook!

case的使用?

答題得分者是:ha0009
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-28 10:08:41 IP:61.155.xxx.xxx 未訂閱
比如我定义了如下的纪录,请问我该怎么使用这些带case record type 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; 谢谢!!!
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-28 11:10:59 IP:61.30.xxx.xxx 未訂閱
你好:
   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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-28 11:42:50 IP:61.155.xxx.xxx 未訂閱
[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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-28 12:00:37 IP:61.30.xxx.xxx 未訂閱
你好: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-28 13:53:00 IP:61.155.xxx.xxx 未訂閱
那么,我想是否使用case ,只不过是公用记忆区域[节省记忆区域]而已;与一般的RECORD纪录作用是没什么区别的. ha0009 兄是不是这样的?
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-28 14:32:48 IP:61.30.xxx.xxx 未訂閱
你好: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-28 15:21:05 IP:61.155.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-28 16:11:03 IP:61.30.xxx.xxx 未訂閱
你好: 集合可視為一群旗標的組合。例如我的例子實際宣告排列如下 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-28 17:17:54 IP:61.155.xxx.xxx 未訂閱
ha0009 兄: 多谢了!!
系統時間:2024-05-10 14:46:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!