TypeInfo(TWindowState) 怎么才能用字符串

缘中人 2013-07-23 11:12:40
var
pti: PTypeInfo;
pti:= TypeInfo(TWindowState)

这样可以

能不能根据字符串'TWindowState'获取PTypeInfo呢

最终我是想根据任意一个字符串查询其Enum字符串列表
...全文
246 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
武稀松 2013-07-24
  • 打赏
  • 举报
回复
用XE4给你写了个例子 uses System.Rtti, System.TypInfo; procedure TForm3.SpeedButton1Click(Sender: TObject); var r: TRttiContext; t: TRttiType; types: TArray<TRttiType>; enumType: TRttiEnumerationType ABSOLUTE t; i: Integer; sb: TStringBuilder; begin sb := TStringBuilder.Create; r := TRttiContext.Create; { t := r.FindType('System.UITypes.TWindowState'); FindType全名, 要带单元 为了用名字直接找,也可以先获取系统所有类型信息,然后自己找,就可以忽略单元名了 } types := r.GetTypes; t := nil; for t in types do if (t.Name = 'TWindowState') { and(t.UnitName = 'System.UITypes') } then begin // t.Handle就是TypeInfo case t.TypeKind of tkEnumeration://其他类型都可以自己处理 begin sb.AppendFormat('%s=(', [t.Name]); for i := GetTypeData(t.Handle)^.MinValue to GetTypeData(t.Handle) ^.MaxValue do begin if i <> GetTypeData(t.Handle)^.MinValue then sb.Append(',' + GetEnumName(t.Handle, i)) else sb.Append(GetEnumName(t.Handle, i)); end; sb.Appendline(');'); end; end; end; ShowMessage(sb.ToString); sb.Free; end;
缘中人 2013-07-23
  • 打赏
  • 举报
回复
不是根据Minimized字符串获取,是根据集合名称(相当于类名称)字符串获取。 不是Minimized,而是TYPE_INFO_NAME名称字符串 例如 TWindowState = (wsNormal, wsMinimized, wsMaximized); 是根据字符'TWindowState' ,查出有几个元素,分别是什么 不是根据'wsNormal', 也不是根据 wsMinimized, 也不是根据 wsMaximized 查询其子项对应的名称。
feiba7288 2013-07-23
  • 打赏
  • 举报
回复

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TypeInfo = (tiNormal, tiMinimized, tiMaximized);
  PTypeInfo = ^TypeInfo;

const
  TYPE_INFO_NAME: array[0..2] of string = ('Normal', 'Minimized', 'Maximized');

function GetTypeInfoByName(sName: string): TypeInfo;
var
  i: integer;
begin
  Result := tiNormal;
  for i := Low(TYPE_INFO_NAME) to High(TYPE_INFO_NAME) do
    if sName = TYPE_INFO_NAME[i] then
    begin
      Result := TypeInfo(i);
      Break;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ti: TypeInfo;
begin
  ti := GetTypeInfoByName('Minimized');
  ShowMessage(TYPE_INFO_NAME[Byte(ti)]);
end;

end.
缘中人 2013-07-23
  • 打赏
  • 举报
回复
就像getclass根据类名称字符串获取TPersistentClass一样,有没有相应的办法根据字符串获取PTypeInfo
缘中人 2013-07-23
  • 打赏
  • 举报
回复
能查询到pti 就可以了,问题是如何根据任意字符串获取PTI
feiba7288 2013-07-23
  • 打赏
  • 举报
回复
定义一个静态的字符串数组对应PTypeInfo,然后根据给定的字符串循环字符串数组,循环到的Index就是PTypeInfo的index对应的TypeInfo。
缘中人 2013-07-23
  • 打赏
  • 举报
回复
Delphi2010有啥方法,请给个提示啊
武稀松 2013-07-23
  • 打赏
  • 举报
回复
如果是Delphi2010以上是可以的.用新的RTTI机制可以的
feiba7288 2013-07-23
  • 打赏
  • 举报
回复
你可以看下Graphics单元下的ColorToString,他就是这样的实现原理。
feiba7288 2013-07-23
  • 打赏
  • 举报
回复
引用 5 楼 ksrsoft 的回复:
不是根据Minimized字符串获取,是根据集合名称(相当于类名称)字符串获取。 不是Minimized,而是TYPE_INFO_NAME名称字符串 例如 TWindowState = (wsNormal, wsMinimized, wsMaximized); 是根据字符'TWindowState' ,查出有几个元素,分别是什么 不是根据'wsNormal', 也不是根据 wsMinimized, 也不是根据 wsMaximized 查询其子项对应的名称。
哥,没有,按我说的方式自己定义CONST。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧