TRect 型態的宣告 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
這個問題是在 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 發送簡訊給我 |
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 發送簡訊給我 |
關於這個問題想再問一下
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 發送簡訊給我 |
大家好: 進來插個花! 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |