Delphi使用TStringHash实现建立类(有点像反射)

摘要:
15程序按钮单击(发件人:对象);标准调用;标准调用;事实上的覆盖;=MyClassList.ValueOf(IntToStr(ATypeID));7980constructorTMyClass.Create;一串整数;=联锁递减(FRefCount);106端;

Delphi使用TStringHash实现建立类(有点像反射)第1张

  1 unit Unit1;
  2 
  3 interface
  4 
  5 uses
  6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7   Dialogs, StdCtrls, jpeg, ExtCtrls,
  8   IniFiles;//TStringHash使用
  9 
 10 type
 11   TForm1 = class(TForm)
 12     Button1: TButton;
 13     Edit1: TEdit;
 14     Image1: TImage;
 15     procedure Button1Click(Sender: TObject);
 16   private
 17     { Private declarations }
 18   public
 19     { Public declarations }
 20   end;
 21 
 22 type
 23   // 边信息基类接口
 24   IClassInfo = interface
 25   ['{219E2CE1-78AE-4479-A4D8-A23DB421621C}']
 26     function GetName: string;
 27   end;
 28   //
 29   TInfoClass = class of TMyClass;
 30   //自定义的类
 31   TMyClass = class(TObject, IInterface)
 32   protected
 33     FRefCount: Integer;
 34   private
 35     FMyName: string;
 36   public
 37     function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
 38     function _AddRef: Integer; stdcall;
 39     function _Release: Integer; stdcall;
 40     constructor Create; virtual;
 41     function GetName: string; virtual;
 42     property  RefCount: Integer read FRefCount;
 43   end;
 44   //展示类
 45   TMyClass1 = class(TMyClass, IClassInfo)
 46   private
 47     FMyName: string;
 48   public
 49     constructor Create; override;
 50     function GetName: string; override;
 51   end;
 52   //工厂类
 53   TClassInfoFactroy = class
 54     class function CreateClass(const ATypeID: Integer): TMyClass;
 55   end;
 56 
 57 var
 58   Form1: TForm1;
 59 
 60 implementation
 61 
 62 {$R *.dfm}
 63 
 64 var
 65   MyClassList: TStringHash;
 66 
 67 { TMyClass }
 68 //注册类方法
 69 procedure RegisterMyClass(const ATypeID: Integer; AClass: TInfoClass);
 70 var
 71   num: Integer;
 72 begin
 73    num := MyClassList.ValueOf(IntToStr(ATypeID));
 74    if num = -1  then
 75      MyClassList.Add(IntToStr(ATypeID), Integer(AClass))
 76    else
 77     Assert(False, Format('ElementTypeID %d ''s EdgeInfo already registered', [ATypeID]));
 78 end;
 79 
 80 constructor TMyClass.Create;
 81 begin
 82 // 子类实现
 83 end;
 84 
 85 function TMyClass.GetName: string;
 86 begin
 87 // 子类实现
 88 end;
 89 
 90 function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
 91 begin
 92   if GetInterface(IID, Obj) then
 93     Result := 0
 94   else Result := E_NOINTERFACE;
 95 end;
 96 
 97 function TMyClass._AddRef: Integer;
 98 begin
 99   Result := InterlockedIncrement(FRefCount);
100 end;
101 
102 function TMyClass._Release: Integer;
103 begin
104   Result := InterlockedDecrement(FRefCount);
105   if Result = 0 then Destroy;
106 end;
107 
108 { TMyClass1 }
109 
110 constructor TMyClass1.Create;
111 begin
112   FMyName := '类1';
113 end;
114 
115 function TMyClass1.GetName: string;
116 begin
117   Result := FMyName;
118 end;
119 
120 { TClassInfoFactroy }
121 //建立类方法
122 class function TClassInfoFactroy.CreateClass(const ATypeID: Integer): TMyClass;
123 var
124   nClass: Integer;
125 begin
126   nClass := MyClassList.ValueOf(IntToStr(ATypeID)); 
127   if nClass <> -1 then
128     Result := TInfoClass(nClass).Create
129   else begin
130     Result := nil;
131   end;
132 end;
133 //调用类方法
134 procedure TForm1.Button1Click(Sender: TObject);
135 begin
136   Edit1.Text := (TClassInfoFactroy.CreateClass(123) as IClassInfo).GetName;
137 end;
138 //初始化
139 initialization
140   if MyClassList = nil then
141     MyClassList:= TStringHash.Create(26);
142   // 注册类
143   RegisterMyClass(123, TMyClass1);
144 
145 end.

免责声明:文章转载自《Delphi使用TStringHash实现建立类(有点像反射)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi float浮点值转换整型int 方法《团队-Android手机便签-项目进度》下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ansible使用jinja2模板

jinja2基本语法 控制结构 {% %}             jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典          2.变量取值 {{ }}             jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/...

VC++ 复制整个文件夹

CopyFile只能复制一个文件,要想复制整个文件夹的所有文件,需要遍历文件夹里面的文件。 MyFile.h #pragma once #include <string> #include <Windows.h> #include <iostream> #include <stdio.h> #include...

MySQL学习随笔--通过实例理解merge ,temptable算法的差异

实例1 使用视图的两种算法merge和temptable分别统计 表tb_phone中market_price大于4000的手机,然后查询视图查找出小于6000的手机 简单总结最终获取的结果:查询出market_price大于4000且小于6000的手机 表数据: merge合并算法 合并的执行方式,每当执行的时候,先将视图的sql语句与外...

c# Winform PropertyGrid 实现下拉框 多选

1 usingPropertyGridHelpers.Controls; 2 usingSystem; 3 usingSystem.Collections.Generic; 4 usingSystem.ComponentModel; 5 usingSystem.Drawing.Design; 6 usingSystem.Windows.Forms;...

&amp;lt;转&amp;gt;PHP中正则表达式函数

PHP中的正则表达式函数       在PHP中有两套正则表达式函数库。一套是由PCRE(Perl Compatible Regular Expression)库提供的,基于传统型NFA。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。另一套是由POSIX(Portable Operation Sy...

获取DataTable中一列的数据

#region 获取合同号DataRow[] arrRow = new DataRow[ds.Rows.Count];int w = 0;foreach (DataRow row in ds.Rows){arrRow[w] = row;w++;}string[] ary = Array.ConvertAll(arrRow, r => r["cdon...