请问如何枚举一个集合里和每个元素(100分)

  • 主题发起人 主题发起人 wellyn
  • 开始时间 开始时间
W

wellyn

Unregistered / Unconfirmed
GUEST, unregistred user!
象VB里的FOR EACH ... NEXT一样枚举出集合里的每个元素~~
 
这是个好问题,上次在群里就有人讨论,本来以为很简单,结果搞不定,既然有人问,我要来学习一下。
 
TBtnType = (btOK, btCancel, btHelp);
var
i:TBtnType;
begin
for i:= low(TBtnType) to high(TBtnType) do
....
这样算吗?
 
是求集合的元素,你的是枚举。

ts:set of byte=[0..100];
tss:set of char=['+','-','*','/','^','(',')','#'];
 
最好是自己用数组来实现把,这样简单容易处理
 
procedure GetClassProperties(AClass: TObject
AStrings: TStrings);
var
PropList: PPropList;
ClassTypeInfo: PTypeInfo;
enumdata,ClassTypeData: PTypeData;
i,j,NumProps: integer;
tmpstr:string;
tmpobj:Tobject;
begin
ClassTypeInfo := AClass.ClassInfo;
ClassTypeData := GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount <> 0 then
begin
GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
try
GetPropInfos(AClass.ClassInfo, PropList);
for i := 0 to ClassTypeData.PropCount - 1 do
begin
tmpstr:='';
case PropList^.PropType^.Kind of
tkMethod:continue;
tkInteger,tkInt64:tmpstr:=inttostr(GetOrdProp(AClass,PropList^.Name));
tkEnumeration:begin
tmpstr:=GetEnumProp(AClass,PropList^.Name)+' {';
enumdata:=GetTypeData(PropList^.PropType^);
//下面两行可以进行非常大的优化
for j:=enumdata.MinValue to enumdata.MaxValue do
tmpstr:=tmpstr+GetEnumName(PropList^.PropType^,j)+',';
tmpstr[length(tmpstr)]:='}'
end;
tkFloat:tmpstr:=floattostr(GetFloatProp(AClass,PropList^.Name));
tkClass:begin
tmpobj:=GetObjectProp(AClass,PropList^.Name);
if (tmpobj<>nil) and (tmpobj is Tcomponent) then
tmpstr:=Tcomponent(tmpobj).Name;
end;
tkString,tkLString,tkWString:tmpstr:=#39+GetStrProp(AClass,PropList^.Name)+#39;
end;{case}
if tmpstr<>'' then
tmpstr:='='+tmpstr;
AStrings.Add(Format('%s: %s%s', [PropList^.Name, PropList^.PropType^.Name,tmpstr]));
end;
NumProps := GetPropList(AClass.ClassInfo, [tkMethod], PropList);
if NumProps <> 0 then
AStrings.Add('=========EVENTS================');
for i := 0 to NumProps - 1 do
begin
tmpstr:='';
if GetMethodProp(Aclass,PropList^.Name).data<>nil then
tmpstr:=' (have events)';
AStrings.Add(Format('%s: %s%s', [PropList^.Name, PropList^.PropType^.Name,tmpstr]));
end;
finally
FreeMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
end;
end;
end;






上面是我的程序,你自己看看核心,怎么处理集合的。
enumdata:=GetTypeData(PropList^.PropType^);
//下面两行可以进行非常大的优化
for j:=enumdata.MinValue to enumdata.MaxValue do
tmpstr:=tmpstr+GetEnumName(PropList^.PropType^,j)+',';
tmpstr[length(tmpstr)]:='}'

下面是调用函数
var
tmpform:Tform;
tmpmemo:Tmemo;
begin
tmpform:=Tform.Create(application);
tmpform.Width:=550;
tmpform.Height:=400;
tmpform.Font:=Font;
tmpform.Position:=PoDesktopCenter;
tmpmemo:=Tmemo.Create(tmpform);
tmpmemo.Parent:=tmpform;
tmpmemo.Align:=alclient;
tmpmemo.Font.Color:=clblue;
tmpmemo.ScrollBars:=ssVertical;
GetClassProperties(Tform1(self),tmpmemo.Lines);
tmpform.ShowModal;
tmpmemo.Free;
tmpform.Free;
end;
 
这是我写的delphi的界面部分!
 
先确定他在内存中的存储方式,然后就有办法遍历了
 
dcsdcs,代码看了,也是取枚举类型的,
tkEnumeration: //枚举类型
begin
tmpstr:=GetEnumProp(AClass,PropList^.Name)+' {';
enumdata:=GetTypeData(PropList^.PropType^);
//下面两行可以进行非常大的优化
for j:=enumdata.MinValue to enumdata.MaxValue do
tmpstr:=tmpstr+GetEnumName(PropList^.PropType^,j)+',';
tmpstr[length(tmpstr)]:='}'
end;

我运行了一下,集合还是无法取出值,我用XLGrid的Options(集合)做试验,只能取出类型名:
Scale: TXLScale=100
Options: TXLOptions //无法取出集合的值
Scrolls: TXLScrolls
HorzLink: TXLGrid
VertLink: TXLGrid
EnterDir: TXLDirection=dAuto {dNone,dRight,dDown,dLeft,dUp,dAuto}

这是TXLOptions的定义:
TXLOptions = set of (oTitleCols, oTitleRows,
oVertLines, oHorzLines,
oColSizing, oRowSizing,
oDrawFocus, oTitle3D,
oEdit3D, oPermEdit,
oPageBreak, oReadOnly,
oRowSelect, oRangeSelect,
oTabKeys, oWrapKeys,
oFixScale);
 
指针操作??
 
察看一下Typinfo单元里的api,里面有你要的东东
 
是的,在Typinfo单元有你要得,我找找,好象以前见过!
 
后退
顶部