刚才看别人的帖子,突然有了下面的问题:
定义一个集合类型
MM=SET 1..10;
var
ss:MM;
begin
ss:=[2,3];
这里定义了ss变量,假如这里ss已经赋值,但是又看不到(假如,封装在另外单元),看不到的含义这里是,不知道这个变量的里的个数,内容,现在怎么把这个变量里的值显示出来?
定义一个集合类型
MM=SET 1..10;
var
ss:MM;
begin
ss:=[2,3];
这里定义了ss变量,假如这里ss已经赋值,但是又看不到(假如,封装在另外单元),看不到的含义这里是,不知道这个变量的里的个数,内容,现在怎么把这个变量里的值显示出来?
解决方案 »
- OleVariant类型问题
- 一个简单的问题?
- 急待解决的dbgrid的问题
- 怎样使一个窗口在初始最大化后只能最小化和最大化?可以象vc的窗口那样使得最大化和最小中间的那个钮灰掉吗
- Invalid BLOB handle in record buffer.
- 我想给button或者BitBtn放上不同的颜色,(顶有分)
- 各位大虾,小弟请教一问题,关于delphi的文件操作的。
- 请问怎样在应用程序中取控件的安装路径
- 怎么把buff的数据显示成图片啊?
- @@@@@@@@一个超难的问题 动态改变报表字体 QuickRep@@@@@@@@@@@
- 一个表的记录写到另一个表中的问题??UP有分
- 求救!!如何把dbgrid中的数据导入到excel中?
TTest = (a, b, c, d, e ,f);
.
.
.
procedure TForm1.Button1Click(Sender: TObject);
var
tinfo: PTypeInfo;
tdata: PTypeData;
i: Integer;
begin
tinfo := TypeInfo(TTest);
tdata := GetTypeData(tinfo);
for i := tdata^.MinValue to tdata^.MaxValue do
ListBox1.Items.Add(GetEnumName(tinfo, i));
end;
....
tkSet: (
CompType: PPTypeInfo));
....
所以,你的思路很好(偶是没有想到,HOHO!),8过这种思路没有办法得到这个楼主想要的东西!你上面使用的是枚举类型,而枚举类型的RTTI信息要比集合多!
type
TSomeSet=Set of 1..255; //这里定义了一个基本类型
....
var
SA,SB:TSomeSet; //这里定义两个以TSomeSet为基本类型的集合变量SA和SB,对于这两个变量,虽然都可以共享上面假设存在的MaxValue和MinValue这些信息,但这些信息对于SA和SB这两个量没有什么实际意义,尤其对付楼主这种问题!更何况这些信息是根本就没有的!
TTest = (a, b, c, d, e ,f);
.
.
.
procedure TForm1.Button1Click(Sender: TObject);
var
TTests=set of TTest;
tinfo: PTypeInfo;
tdata: PTypeData;
i: Integer;
begin
tinfo := TypeInfo(TTest);
tdata := GetTypeData(tinfo);
for i := tdata^.MinValue to tdata^.MaxValue do
ListBox1.Items.Add(GetEnumName(tinfo, i));
end;
var
TTests:set of TTest;
tinfo: PTypeInfo;
tdata: PTypeData;
i: Integer;
begin
tinfo := TypeInfo(TTest); //返回一个RTTI指针,这个指针的内容指向TTest,而不是TTests,这点一定要看清楚,所以从这里开始你实际上还是在取枚举的RTTI信息,根本没有对集合的内容进行任何操作!
tdata := GetTypeData(tinfo); //根据RTTI指针,重新定位到TypeData结构,开始获取类型信息
for i := tdata^.MinValue to tdata^.MaxValue do
ListBox1.Items.Add(GetEnumName(tinfo, i)); //这里只是简单的把你定义的枚举类型的值进行罗列,而楼主要的是一个集合变量里面的数量不确定的元素内容!
end;----------------------------------------------------------------------还是认为RTTI解决不了这种问题!
既然有Crack色彩,为什么不Crack一下?
用Hview就能查看到。
通过编程方法,我还没有办法,呵呵。
var
S:Set of 1..5;
begin
S:=[2,4];
//如何显示这个集合S里面的内容?另外这里有个问题,请教伴水,假设上面这个赋值没有的情况下直接使用语句if 4 in S then ShowMessage('E');也将显示对话框,为什么?
end;
begin
if i in ss then memo1.Lines.add(inttostr(i));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: set of 1..16;
T: TIntegerSet;
I: Integer;
Str: string;
begin
S := [1, 3, 5, 7]; FillChar(T, SizeOf(T), 0);
Move(S, T, SizeOf(S)); Str := '';
for I := 0 to SizeOf(Integer) * 8 - 1 do
if I in T then
Str := Str + ',' + IntToStr(I); (* TypInfo.GetEnumName(TypeInfo, I) *)
Delete(Str, 1, 1);
ShowMessage(Str);
end;//如何显示这个集合S里面的内容?另外这里有个问题,请教伴水,假设上面这个赋值没有的情况下直接使用语句if 4 in S then ShowMessage('E');也将显示对话框,为什么?
---------------
晕,局部变量声明又没有初始化,值是不确定的~~
这个命题属于哲学范畴
这只是一种世界观
如果你不能彻底的证明这是一个错误的命题
那么请你不要对此发表任何反对意见
强调的是:
如果你能证明一切都是物质
我也可以证明一切都是数据
另外随便证明一切都是灵魂延伸命题及相关命题如下:
只因为一切都是“0”和“1”
所以处理数据的方法也是数据函数:对数据处理的描述
类型(普通类型):对数据存储方式的描述 //一种特殊的类--没有关系的类
指针:数据在内存中存储的位置
值:数据具体存储的内容
变量:对实际存储概括(所有的变量都可以看成指针变量)
类:对数据存储方式及关系的描述(关系包括:元素关系、存取关系及父子关系)
属性:类中对该元素数据存取关系的描述
字段:类中声明的变量
方法:类中声明的函数
事件:类型为方法的属性
对象:类的实例
对于“元素关系”、“存取关系”及“父子关系”
我就不多说
请你在实际编程中慢慢独自品味
过程是特殊的函数
返回值为空的函数
很多编程语言都没有过程这个概念
这个概念对了解C的人不值一提
因为C中只有函数
注意:运算符号、语法结构可以看成更特殊的函数(但愿你了解汇编)类型是特殊的类
没有关系描述的类
这个概念对了解JAVA的人不值一提
因为JAVA中只有类不难想象:
把函数看成数据,就当出现“DLL”
把关系看成数据,就当出现“OOP”
把元件看成数据,就当出现“COM”
把类型看成数据,就当出现“XML”//不要为如下比喻感到陌生
类就想一个模具(比如:做饼的模具)
只要有足够的资料(比如:面团)
就可以生产出一个个相同的物品出来(比如:月饼)//不要为以下语句感到吃惊
{ 类也是数据 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := Format('Self:%p, TForm1:%p', [Pointer(Self), Pointer(TForm1)]);
end;{ 示例对变量的内存地址直接操作 }
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
P: Pointer;
begin
I := 0;
P := Addr(I);
PInteger(P)^ := 123;
Caption := IntToStr(I);
end;{ 类型也是数据 }
uses TypInfo;procedure TForm1.FormCreate(Sender: TObject);
var
vTypeInfo: PTypeInfo;
begin
vTypeInfo := TypeInfo(Integer);
Caption := vTypeInfo.Name;
end;