線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2775
推到 Plurk!
推到 Facebook!

TRect 型態的宣告

 
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-05-20 17:28:48 IP:211.22.xxx.xxx 未訂閱
這個問題是在 programmer 2000 的 delphi 版有位仁兄問的 同時也是小弟的疑問, 所以貼在請教大家: type TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end; 在 Delphi 的 Help 檔看到的 有一點不懂 在宣告 record 時裡面不是都放 Data 嗎? 1.這裡用 case 的原因是什麼? 2.什麼情況 integer 會是 0, 或 1?
linkolong
一般會員


發表:4
回覆:35
積分:12
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-05-27 21:10:18 IP:61.70.xxx.xxx 未訂閱
TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint; 其實是代表紀錄中的變動參數,在此我先講一下一般參數,如下: Type Test1 = record Test1a1 , Test1a2 , Test1b1 , Test1b2 : Longint; Test1Axy , Test1Bxy: TPoint; 此時我們共設定了6個參數,其中兩個參數為Point型態,記憶體中共撥了6個區塊給參數存放; 讓我們在看下面變動參數的紀錄型態 Type Test2 = record case Integer of 0:(Test2a1 , Test2a2 , Test2b1 , Test2b2 : Longint); 1:(Test2Axy , Test2Bxy: TPoint); 此時我們共設定了6個參數卻只撥了4個區塊給參數存放; 首先程式會將讀取0;設定4個參數四個區塊給參數存放值 再來會讀取1:將四個區塊,前兩個指派給Test2Axy ,後兩個指派給Test2Bxy 也就是說 begin Test2 .Test2a1:=1; Test2 .Test2a2:=2; Test2 .Test2b1:=3; Test2 .Test2b2:=4; end; 當你查詢Test2Axy 其中值已經指派好了為(1,2) 而Test2Bxy 其中值已經指派好了為(3,4) 當然你也可以設定值給Test2Axy或Test2Bxy 一樣會指派值給對應的 Test2a1 , Test2a2 , Test2b1 , Test2b2 注意當你Record中有參數和共用區塊參數,需先宣告參數,而共用區塊參數永遠是放在Record的最後面
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-23 18:57:11 IP:203.204.xxx.xxx 未訂閱
關於這個問題想再問一下  
  TMessage = packed record
    Msg: Cardinal;
    case Integer of
      0: (
        WParam: Longint;
        LParam: Longint;
        Result: Longint);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
  end;     
像message這個record怎麼解釋比較好呢,謝謝
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-23 21:18:42 IP:211.76.xxx.xxx 未訂閱
大家好:    進來插個花!    Delphi Pascal這部分就相當於是C/C++語言中的union。  
引言: TMessage = packed record Msg: Cardinal; case Integer of 0: ( WParam: Longint; LParam: Longint; Result: Longint); 1: ( WParamLo: Word; WParamHi: Word; LParamLo: Word; LParamHi: Word; ResultLo: Word; ResultHi: Word); end;
所以上述的TMessage可以看成是下列兩種宣告結果:
1. Msg, WParam,             LParam,             Result             => 四個變數
2. Msg, WParamLo, WParamHi, LParamLo, LParamHi, ResultLo, ResultHi => 六個變數
這兩種宣告其實是佔用相同的記憶體區塊,但可容許你以不同的方式存取該記憶體區塊的內容。 上述看似不規則的排列,其實是在說明各個變數之間在記憶體中的相對位址。 當你改變WParam的值時,同時也就連帶影響到WParamLo及WParamHi的值,因為WParam跟WParamLo及WParamHi其實是存在相同的記憶體中。 由於Intel的資料儲存規則是:低位元組的資料放低位址,高位元組的資料放高位址;才會有上述的變數排列結果。 其次,case integer of 中的integer,只是讓我們在要用不同的方式去存取相同記憶體區塊時,所做的資料分群方式。因此其他的型態亦可用。 底下提供簡單程式碼供大家參考:
type
TUnionRecord1 = record
  x,y : integer;
  case char of
  'a': ( al,ah,bl,bh : byte);
  'b': ( ax,   bx    : word);
end;    TUnionRecord2 = record
  x,y : integer;
  case integer of
  2: ( al,ah,bl,bh : byte);
  1: ( ax,   bx    : word);
end;    TUnionRecord3 = record
  x,y : integer;
  case boolean of
  false: ( al,ah,bl,bh : byte);
  true : ( ax,   bx    : word);
end;    procedure TForm1.Button1Click(Sender: TObject);
var
   uRecord : TUnionRecord3;
begin
  uRecord.al := $12; // 16進位數值。
  uRecord.ah := $34;
  ShowMessage( IntToHex(uRecord.ax,4) ); // output=> 3412
  uRecord.ax := $ABCD; // al = $CD,  ah = $AB;
  ShowMessage( IntToHex(uRecord.al,2) );
  ShowMessage( IntToHex(uRecord.ah,2) );
end;
 
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/07/23 21:23:08 發表人 - richtop 於 2004/07/23 21:27:31
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-25 01:33:23 IP:203.204.xxx.xxx 未訂閱
看了richtop 大大的詳細說明,似乎更懂了一些,真是太感謝了,3q
系統時間:2024-05-18 12:05:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!