record type 可以列舉嗎? |
答題得分者是:jow
|
shunchia63
高階會員 發表:26 回覆:141 積分:198 註冊:2007-05-22 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
[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 發送簡訊給我 |
感謝回覆
我的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 發送簡訊給我 |
(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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
前篇所提範例中, 就有對於不定長度的封包的做法,
最主要是程式初期對於封包的定義的考量....^_^ ===================引 用 shunchia63 文 章=================== 對了此Case 不定size 有辦法列舉嗎? |
shunchia63
高階會員 發表:26 回覆:141 積分:198 註冊:2007-05-22 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |