Delphi中如何定义相当于C语言Union结构的Record??(100分)

  • 主题发起人 主题发起人 Zyee
  • 开始时间 开始时间
packed record??
 
可以在record中加case, 如:

type
a = record
case integer of
0: ( i:integer;
j:integer
);
1: ( s:string
);
2: ( l:int64
);
end;

可以在case前面加一些record中不变的成员参数, 为保证边界一致,
case ... of中不用变量名, 并且使用packed record.
 
请查找中文书籍中的有关"变体记录"的章节
 
以下record定义为什么编译未能通过:Help!!!!
type rec= record
Int1 :integer


case Integer of
1 : (str1 :array[1..8] of char)

2 : (str2 :array[1..4] of char);

Int2 :Integer

end
 
怎么是同一个问题?
 
Not the same question!!
I want to create a record containing two Integer,a Union,with the Union is not at the bottom of Record type,and after the Union there are a Integer in the record.
such as:
rec =record
int1 :Integer;
Union{the CASE ..OF structure}
{NOTED..}
int2 :integer;
end;
 
不能这么写的,
把所有固定的域都写在前面,最后是变体,
case ... of 中的...可以不写,直接用,
看看帮助吧
 
曾有清华的一本讲Pascal的书中提到变体记录只能位于record的最后,如果Delphi
不在这方面有扩展的话,那只能定义一个中间类型作Union,然后再加入最后的record中
如下例:
type myunion=record
case Integer of
1 : (s: PChar);
2 : (i: Integer);
end;
rec= record
Int1 :integer;

Union: myunion;

Int2 :Integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
r:rec;
begin
r.Int1:=12;
r.Union.s:='this is a string';
r.Int2:=14;
Label1.Caption:=inttohex(r.Union.i,8);
end;
可编译通过,但如要对rec存入磁盘可能要花费一些功夫。
 
还可以用 absolute 关键字
 
I feel very happy that I have receied so much help from you.
thanks .

email Addr: zhangjifeng@sheca.com
 
为什么要这么做呢? 应该把不变的东西放在前面, 因为变体部分
可能不等长, 很可能会影响后面的变量的.

 
请教Energy:
如何使用absolute 关键字?
使用变体纪录有点滑稽 :-)
 
不知道absolute在delphi里面还能不能用,应该不能吧?
 
sorry ,没有直接的办法,只有变通的办法,
absolute只能在变量宣布是才能用在record时不可以用。但可以变通。

var
Str: string[32];
StrLen: Byte absolute Str;

var
a:TForm;
b:TForm1 absolute a;

变通一下,大致可以满足你要求。
长度应该自己求了,选最大的一个。
 
用变体记录是有些别扭,还是用absolute 方便一些;
type
rec1 =record
i:integer;
end;
rec2 =record
a,b,c,d:byte;
end;
var
v1:rec1;
v2: rec2 absolute v1;
以上代码再delphi4中编译通过.
 
接受答案了.
 
后退
顶部