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

  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.
时间: 2024-10-06 00:03:17

Delphi使用TStringHash实现建立类(有点像反射)的相关文章

delphi 中DLL的建立

Dll的创建与调用 File ->New->Other->Dll Wizard DLL的创建 //可以将本代码复制粘贴到项目中 library Project1; uses SysUtils, Classes, Windows, Forms; {$R *.res} function Min(x,y:Integer):Integer;stdcall; begin if (x<y) then Result:=x else Result:=y; end; procedure MsgBox

043-PHP简单获得一个类对应的反射信息

<?php // 简单获得一个类对应的反射信息 class demo{ CONST CON_STR = '123456'; public $str_1; private $str_2; protected $str_3; public function test(){ } } # 系统内置的class,用于产生一个镜像 $class = new ReflectionClass("demo"); echo '<pre>'; # 系统内置的class,用于导出镜像能反射的

2019-11-29-C#-直接创建多个类和使用反射创建类的性能

原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-11-29 10:13:14 +0800 2018-10-12 11:24:21 +0800 C# 性能测试 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 1000 个类和一个测

Delphi之TStrings和TStringLists类

有些类不是组件,但它们支持存在的组件.这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings.TCanvas和TCollection. TStrings和TStringLists类 TStrings是一个抽象类,使你可以操纵属于组件(如TListBox)的字符串列表.TStrings实际上并不管理字符串的内存(那是由拥有TStrings类的组件管理的),它只是定义了方法和属性来访问和操纵组件的字符串,而不是使用组件的Win32 API函数和消息. 注意,我们所说的TSt

cocos3 python脚本建立类文件

以前看过一本关于精简工作内容的书,要把工作中重复的东西都简化 今天我就来简化cocos3建立.h文件和.cpp文件 ClassName="TestSprite" Type="Sprite" #.h file write file = open(ClassName+'.h', 'w') str='''#pragma once #include "cocos2d.h" USING_NS_CC; class ClassName:public Type

动态建立类

首先先发几个链接感谢下各位的技术分享: http://www.cnblogs.com/longgel/archive/2010/05/14/1735590.html http://www.cnblogs.com/yjmyzz/archive/2011/11/13/2247600.html http://www.cnblogs.com/lichdr/archive/2004/10/21/55038.html 内容其实差不了多少,在此只是为了记录而已. // --------------------

【Delphi】GIF 动画建立

var Gif:TGifImage; begin //Setting the delay for each frame TGIFGraphicControlExtension.Create(Gif.Add(image1.Picture.Bitmap)).Delay := 300; TGIFGraphicControlExtension.Create(Gif.Add(image2.Picture.Bitmap)).Delay := 300; TGIFGraphicControlExtension.

JS中通过建立类来防止方法重载

delphi 控制音量 静音的类

unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundControl = class class procedure Mute(); static; class procedure VolumeUp(); static; class procedure VolumeDown(); static; end; implementation { SimpleSoundControl } class p