如何取得一个集合的所有内容?(100分)

  • 主题发起人 主题发起人 真.浪人西林
  • 开始时间 开始时间

真.浪人西林

Unregistered / Unconfirmed
GUEST, unregistred user!
如TControls中的Anchors属性为TAnchors,而TAnchors是一个集合,我如何取得这个集合
中的所有内容?这里应返回akLeft, akTop, akRight, akBottom的列表。[:)]
 
集合本身就可以看作一个列表,

你可以用集合运算来判断,

akLeft in Anchors
或者 >= > <= < 来判断包含关系
 
谢谢!
您误解了我的意思,我只是举了个例子,假设我并不知道集合的类名,也不知道集合内包
含哪些信息,只是动态取出了集合的类,或者说是一个TypeInfo,我该如何取得它们的内容呢?
对于枚举型,我可以用GetEnumName(selTypeInfo, 1)来取得,那么集合呢?
 
RTI运行时。。。。接口
你找一个控件打开看看就知道了
 
也是用GetEnumName
参见
Delphi 5开发人员指南
第20章 VCL元素和运行期类型信息
太复杂了!
 
你是不是要根据集合类型的名字得到其中的元素的名字??
比如TColor,你要得到其中的所有定义的颜色的值,还是'clred'等这些字符串?
 
先取得字符串,再分别取得他们的值
 
不可以!Delphi 仅根据每个位的状态判断集合是否包含了某元素,但并不表示:一个集合
的所有位必须全部使用 ====> 这就是为什么。
 
那Delphi自己是怎么判断的?
 
笨方法,对所有元素穷举判断是否在集合里。
 
Sorry,我说错了,是可以的。下面是示例:


{注:代码来源于 macro cantu 的 《Delphi 3 高级开发指南》 第4章 运行时类型消息,略有更改}


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1 : TForm1;

implementation

uses
TypInfo;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
pProps : PPropList;
nTotalProps, nProps, I : Longint;
begin
nTotalProps := GetTypeData(ClassInfo).PropCount; //读取 VMT 中的类型消息
GetMem(pProps, SizeOf(PPropInfo) * nTotalProps); //分配类型接收缓冲
try
nProps := GetPropList(ClassInfo,
[tkEnumeration], pProps); //获取 VMT 中枚举型属性表, 第二个参数是一个 TTypeKind,Pascal 类型表

for I := 0 to nProps - 1 do
ComboBox1.Items.Add(pProps.Name); //获取每个枚举型类型名
finally
FreeMem(pProps, SizeOf(PPropInfo) * nTotalProps);
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
PropName : string;
PropInfo : PPropInfo;
ptd : PTypeData;
I : Longint;
PropValue : Longint;
begin
if Combobox1.Text <> '' then
PropName := ComboBox1.Text else Exit;

ListBox1.Items.Clear;
PropInfo := GetPropInfo(ClassInfo, PropName);
ptd := GetTypeData(PropInfo.PropType^); //获取选取项的类型消息
for I := ptd.MinValue to ptd.MaxValue do
ListBox1.Items.Add(GetEnumName(PropInfo.PropType^, I));
//上面这一段获取类型名:在结构 TTypeData 中,对于枚举项,保存了一个
//NameList: ShortStringBase 表,看来是保存枚举项的名称的。
PropValue := GetOrdProp(Self, PropInfo);
ListBox1.ItemIndex := ptd.MinValue + PropValue;
end;

end.

结束。
 
另外,对于集合型的类型表中是定义了一个 CompType : PPTypeInfo ,即
指向一个枚举类型表,集合的源枚举表 ============> 太复杂了... halt -p!
 
你们想的太复杂了, 集合其实就是一组整数, 取了此名字而已,
用Lower(TsetX) 到 High(TsetX) 就是所有内容了.
 
多谢黑天兄,但我用MinValue与MaxValue取不出它们的序号,但对枚举可以,我想知道枚举
和集合究竟有什么区别?
 
它们两个的类型不同啊,当然可以对它们的操作也不同了,

枚举的话只能是其中的一个值,而集合的话可以是其中的几个值,作判断比较方面
 
to 真.浪人西林:
好惭愧,你只有比我懂得多!我只把我的想法说一下,你看可不可参考,呵呵====>
1、在调试中,可能你也发现了,如果GetPropList(ClassInfo, [tkSet], pProps);
转转之后,是可以看到这个枚举量的,比如你的:Anchors => TAnchorKind。
但重新套入那个函数去查 TAnchorKind 时,却发现:Form 没有 TAnchorKind 这个
枚举特性,真是怪事。因此,我想问题可能是在 ClassInfo 这个参数上;
2、集合首先必须有枚举项 ==> 但这话可能有些勉强,因为集合可以是不连续的!
所以对于这个 CompType,系统可能还有另一层处理,不过我看不出...
3、但有一点可以肯定:集合必定有它的枚举源!VMT 怎么处理这些不相关的枚举源,
可能是问题的关键。

我是无能为力了,上面所说,仅供参考。希望你能够发现其中的奥妙(如果能解,可否
告诉我一下:mailto: ccdev@163.com,先说声谢谢)。
 
黑天兄,几天没来了,这个问题也一直放着没去管它,待会我把代码发给你,可以帮我
研究一下吗?感激不尽!
 
多人接受答案了。
 
后退
顶部