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

record type 可以列舉嗎?

答題得分者是:jow
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-31 14:40:42 IP:61.219.xxx.xxx 訂閱


type
TNumber=record
R1:integr;
R2:integr;
R3:integr;
R4:integr;
R5:integr;
R6:integr;
end;


record type 可以列舉嗎? 用for loop 把資料dump 出來
目前只能乖乖的

N.R1;
N.R2;
.....
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-31 15:21:46 IP:210.66.xxx.xxx 訂閱
[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
type
PNumber = ^TNumber;
TNumber = record
case Integer of
0:(R: array[0..5] of Integer);
1:(R1: Integer;
R2: Integer;
R3: Integer;
R4: Integer;
R5: Integer;
R6: Integer);
end;
var
P: PInteger;
Q: Pointer; //untyped pointer
N: TNumber;
I, L: Integer;
A: array of Integer;
begin
//Assignment
for I := 0 to Length(N.R)-1 do
N.R[I] := I;
//Iteration(1)
ListBox1.Items.Text := '-----';
P := PInteger(@N);
L := SizeOf(N) div SizeOf(Integer);
for I := 0 to L-1 do
begin
ListBox1.Items.Add(IntToStr(P^));
Inc(P);
end;
//Iteration(2)
ListBox1.Items.Add('-----');
Q := @N;
while Integer(Q) < (Integer(@N) SizeOf(N)) do
begin
ListBox1.Items.Add(IntToStr(PInteger(Q)^));
Q := Pointer(Integer(Q) 4);
end;
//Iteration(3)
ListBox1.Items.Add('-----');
A := Pointer(@N);
L := SizeOf(N) div SizeOf(Integer);
for I := 0 to L-1 do
ListBox1.Items.Add(IntToStr(A[I]));
end;

[/code]
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-31 16:15:59 IP:61.219.xxx.xxx 訂閱
感謝回覆

我的Record define 很多因為電文Format 太多了無法一一去Copy( xxx,1,n)

如下為一Case

TInfo = record
F_1 : array[1..10] of char;
F_2 : array[1..20] of char;
F_3 :array[1..13] of char;
end;

定Record原因


將字串快速填入Array 中不用Copy ( Src,1,10)....

外部資料 SorceStr:='1234567890123456789012345678901234567890.....';


code:

var info:^TInfo;

begin

Info = @SorceStr[1];

用info.F1取值
用info.F2取值




jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-31 17:03:41 IP:210.66.xxx.xxx 訂閱
(1)封包的處理, 請參考:
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=90517

(2)我的經驗是最好用zero-base
TInfo = packed record
F_1 : array[1..10] of char;
F_2 : array[1..20] of char;
F_3 :array[1..13] of char;
end;
改為
TInfo = packed record
F_1 : array[0..10-1] of char;
F_2 : array[0..20-1] of char;
F_3 :array[0..13-1] of char;
end;
或是
TChar10=array[0..10-1] of Char;
TChar13=array[0..13-1] of Char;
TChar20=array[0..20-1] of Char;

PInfo = ^TInfo;
TInfo = packed record
F_1 : TChar10;
F_2 : TChar20;
F_3 : TChar13;
end;

如此就可以用

A, B: TInfo;

A.F_1 = B.F_1
A.F_2 = B.F_2

(3)將所有封包格式宣告成一個結構最大的Union.
配置一個這樣的Union空間為Buffer, 負責來解析
所有封包.

TUnion = packed record
case Integer of
0:(Info0: TInfo0);
1:(Info1: TInfo1);
2:(Info2: TInfo2);
end;

Buff: TUnion;

//S 為收到的封包字串

Move(PChar(S)^, Buff, Length(S));



以上純屬個人見解, 僅供參考..... ^_^


===================引 用 shunchia63 文 章===================
感謝回覆

我的Record define 很多因為電文Format 太多了無法一一去Copy( xxx,1,n)

如下為一Case

TInfo = record
F_1 : array[1..10] of char;
F_2 : array[1..20] of char;
F_3 :array[1..13] of char;
end;

定Record原因


將字串快速填入Array 中不用Copy ( Src,1,10)....

外部資料 SorceStr:='1234567890123456789012345678901234567890.....';


code:

var info:^TInfo;

begin

Info = @SorceStr[1];

用info.F1取值
用info.F2取值




shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-31 18:30:21 IP:61.62.xxx.xxx 訂閱
對了此Case 不定size 有辦法列舉嗎?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-31 19:30:39 IP:123.193.xxx.xxx 訂閱
前篇所提範例中, 就有對於不定長度的封包的做法,
最主要是程式初期對於封包的定義的考量....^_^


===================引 用 shunchia63 文 章===================
對了此Case 不定size 有辦法列舉嗎?
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-31 19:59:22 IP:61.64.xxx.xxx 訂閱
Thanks

Zero Base 問題比較少


系統時間:2017-12-14 23:03:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!