怎样由一对象和其属性名,获得此属性的所有枚举值
例如TButton的ModalResult属性的枚举值有mrNone, mrOk, mrCancel... 问题点数:33、回复次数:33Top
1 楼3fly(三飞)回复于 2001-11-28 18:15:01 得分 0
我吃饭先,晚上再来,各位大虾帮忙Top
2 楼ChipHead(满脑袋芯片和程序的人)回复于 2001-11-28 18:27:19 得分 0
type
TModalResult = (mrNone, mrOK, mrCancel, ……);
TMyButton = class(TButton)
private
FMyModalResult: TModalResult;
published
MyModalResult: TModalResult read FMyModalResult write FMyModalResult;
end;
这样写了之后,属性窗口中就会自动列出这些枚举值供你选择。Top
3 楼cczdp(星河)回复于 2001-11-28 18:55:49 得分 0
楼上的,好象回答的不对吧。人家问的不是这个意思吧。(虽然我不会这个问题。)
Top
4 楼3fly(三飞)回复于 2001-11-28 21:15:16 得分 0
是关于 DsgnIntf 和 TypInfo 两单元中的类(TPropertyEditor & TComponentEditor)和其方法的问题,请大家解决Top
5 楼mengbo(心有独钟)回复于 2001-11-28 21:55:33 得分 0
写上你要知道的对象,然后选中后F1 就OK了,Top
6 楼3fly(三飞)回复于 2001-11-28 22:19:31 得分 0
我是要在运行时获得啦Top
7 楼3fly(三飞)回复于 2001-11-28 22:24:59 得分 0
我要的功能是:大概写一函数,传入一类(如TButton)及其一属性字符串(如'ModalResult'),就返回一TStringList('mrNone'#$D#$A'mrOk'#$D#$A'mrCancel'...)Top
8 楼3fly(三飞)回复于 2001-11-28 22:32:12 得分 0
高手在哪?Top
9 楼agui(阿贵: 高级图形用户界面)回复于 2001-11-29 00:29:14 得分 2
《Delphi高级开发指南》讲得最清楚了,关于RTTI部分。
不过现在,看着TypInfo.pas头疼!Top
10 楼passos(古月春秋)回复于 2001-11-29 04:30:55 得分 8
引用 TypInfo 单元
var
I: Integer;
P: PTypeInfo;
begin
P := TypeInfo(TPosition); //测试 TPosition 类型
with GetTypeData(P)^ do
for I := MinValue to MaxValue do
Memo1.Lines.Add(Format('%d: %s', [I, GetEnumName(P , I)]));
end;Top
11 楼3fly(三飞)回复于 2001-11-29 08:31:42 得分 0
to passos(古月春秋)为何TModalResult就不行(MinValue: MaxValue | -2147483648: 2147483647)Top
12 楼w8u(晌马)回复于 2001-11-29 08:35:59 得分 8
procedure GetClassProp(aClass:TObject;aProp:String;List:TStrings);
var
ClassTypeInfo:pTypeInfo;
ClassTypeData:PTypeData;
PropInfo:PPropInfo;
// i:integer;
// Numprops:integer;
begin
ClassTypeInfo:=aClass.ClassInfo;
ClassTypeData:=GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount<>0 then begin
PropInfo:=GetPropInfo(ClassTypeInfo,aProp);
if propInfo<>nil then begin
List.Add(Format('%s ,%s',[propInfo^.Name,propinfo^.proptype^.name]));
if propinfo^.proptype^.Kind=tkEnumeration then begin
List.Add('it is a enum');
end;
end
else
List.Add('no this prop..');
end;
end;
要uses typinfo
没时间了。老板来了。还没达到要求,自己看者办吧。Top
13 楼Snakeguo(Guoguo)回复于 2001-11-29 08:43:11 得分 0
^Top
14 楼szchengyu(happy.net)回复于 2001-11-29 09:14:03 得分 0
9494,
TModalResult怎么不一样呢?
TModalResult = Low(Integer)..High(Integer);
只能关注Top
15 楼V_Lucky(最优解)回复于 2001-11-29 09:29:22 得分 0
~关注 Top
16 楼blackfiles(一个和尚挑水喝)回复于 2001-11-29 09:39:53 得分 0
关~注Top
17 楼3fly(三飞)回复于 2001-11-29 09:44:18 得分 0
to w8u(晌马) 剩余步骤同 passos(古月春秋) 的程序段如下
if propinfo^.proptype^.Kind=tkEnumeration then begin
// List.Add('it is a enum');
with GetTypeData(Propinfo^.proptype^)^ do
for i := MinValue to MaxValue do
List.Add(Format('%d: %s', [i, GetEnumName(Propinfo^.Proptype^ , i)]));
end;
对TModalResult无效,咋办?Top
18 楼3fly(三飞)回复于 2001-11-29 09:46:10 得分 0
解答出 TModalResult 的问题后立刻给分Top
19 楼xzgyb(老达摩)回复于 2001-11-29 12:24:29 得分 0
正因为TModalResult是子界类型,所以他没有相应的名称信息
TModalResult = Low(Integer)..High(Integer);
看一看TCursor,跟这差不多
TCursor = -32768..32767;
Delphi也提供了相应的CursorToString来转换为相应的string;
也就是从一个Cursors的名称映射表,转换
Top
20 楼3fly(三飞)回复于 2001-11-29 16:54:07 得分 0
子界类型?如果我要获得这种“子界类型”的所有值,应该怎么办?Top
21 楼xzgyb(老达摩)回复于 2001-11-29 17:37:50 得分 5
可能是叫子界类型吧,我忘了,呵呵
我不知道
但delphi都做了个Cursors的映射表,我想也只能这么做
仿照ColorToString弄个函数
function ModalResultToStr(AValue: TModalResult): string;
const
ModalResults : array[0..10] of TIdentMapEntry = (
(Value: mrNone; Name: 'mrNone'),
(Value: mrOk; Name: 'mrOk'),
(Value: mrCancel; Name: 'mrCancel'),
(Value: mrAbort; Name: 'mrAbort'),
(Value: mrRetry; Name: 'mrRetry'),
(Value: mrIgnore; Name: 'mrIgnore'),
(Value: mrYes; Name: 'mrYes'),
(Value: mrNo; Name: 'mrNo'),
(Value: mrAll; Name: 'mrAll'),
(Value: mrNoToAll; Name: 'mrNoToAll'),
(Value: mrYesToAll; Name: 'mrYesToAll'));
begin
if Not IntToIdent(AValue, Result, ModalResults) then
FmtStr(Result, '%s%.8x', [HexDisplayPrefix, AValue]);
end;
很累阿
Top
22 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-29 17:41:49 得分 10
uses
TypeInfo;
function IntegerSet(const mValue; mSize: Word): TIntegerSet;
var
I: Integer;
begin
Result := [];
for I := 0 to mSize - 1 do
Integer(Result) := Integer(Result) + TByteArray(mValue)[I]
end; { IntegerSet }
function GetSetStr(mTypeInfo: PTypeInfo; const mValue; mSize: Word;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
S: TIntegerSet;
begin
Result := '';
S := IntegerSet(mValue, mSize);
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
if I in S then
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetStr }
function GetSetAll(mTypeInfo: PTypeInfo;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
S: TIntegerSet;
begin
Result := '';
S := IntegerSet(mValue, mSize);
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetStr }
Top
23 楼xzgyb(老达摩)回复于 2001-11-29 18:04:08 得分 0
zswang老大,我的头发晕Top
24 楼agui(阿贵: 高级图形用户界面)回复于 2001-11-30 18:04:25 得分 0
ModalResult不是枚举类型,所以得不了名称。
你只有判断其属性名是'ModalResult'后,再进行翻译。这就是只能比较土了,用case或子域判断(in)(在定义的范围之内)Top
25 楼3fly(三飞)回复于 2001-11-30 21:25:37 得分 0
to zswang(伴水)(伤心中) 上面三个function我不会调用啊!不知传什么值过去,老在function GetSetStr(...)的vCompType := GetTypeData(mTypeInfo)^.CompType^;语句处报错,请给一例子Top
26 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 21:34:12 得分 0
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, FuncUnit, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
TypInfo;
function IntegerSet(const mValue; mSize: Word): TIntegerSet;
var
I: Integer;
begin
Result := [];
for I := 0 to mSize - 1 do
Integer(Result) := Integer(Result) + TByteArray(mValue)[I]
end; { IntegerSet }
function GetSetStr(mTypeInfo: PTypeInfo; const mValue; mSize: Word;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
S: TIntegerSet;
begin
Result := '';
S := IntegerSet(mValue, mSize);
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
if I in S then
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetStr }
function GetSetAll(mTypeInfo: PTypeInfo;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
begin
Result := '';
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetAll }
type
TMyType = set of (MyType1, MyType2, MyType3, MyType4, MyType5, MyType6);
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(GetSetStr(TypeInfo(TMyType), [MyType2, MyType5], SizeOf([MyType2, MyType5])));
Memo1.Lines.Add(GetSetAll(TypeInfo(TMyType)));
end;
end.
Top
27 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 21:42:25 得分 0
//DsgnIntf.pas:2924
const
ModalResults: array[mrNone..mrYesToAll] of string = (
'mrNone',
'mrOk',
'mrCancel',
'mrAbort',
'mrRetry',
'mrIgnore',
'mrYes',
'mrNo',
'mrAll',
'mrNoToAll',
'mrYesToAll');
Top
28 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 21:43:17 得分 0
for Delphi6Top
29 楼3fly(三飞)回复于 2001-11-30 21:52:42 得分 0
原来如此,不过这几个function可获得TModalResult中的所有值吗?我用
Memo1.Lines.Add(GetSetStr(TypeInfo(TModalResult), [mrok, mrcancel], SizeOf([mrok, mrcancel])));都不行嘞(TModalResult 不是集合类型吧?)Top
30 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 22:02:25 得分 0
const
ModalResults: array[mrNone..mrYesToAll] of string = (
'mrNone',
'mrOk',
'mrCancel',
'mrAbort',
'mrRetry',
'mrIgnore',
'mrYes',
'mrNo',
'mrAll',
'mrNoToAll',
'mrYesToAll');
function f: string
var
I: Integer;
begin
for I := mrNone to mrYesToAll do
Result := Result + ',' + ModalResults[I];
Delete(Result, 1, 1);
end;
Top
31 楼3fly(三飞)回复于 2001-11-30 22:10:15 得分 0
看来只有这样了Top
32 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 22:53:58 得分 0
'mrNone,......,mrYesToAll'
直接写不是更好?Top
33 楼lizhenjia(暴雪)回复于 2002-05-06 12:15:20 得分 0
收藏Top




