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

unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls,
IniFiles;//TStringHash使用 type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; type
// 边信息基类接口
IClassInfo = interface
['{219E2CE1-78AE-4479-A4D8-A23DB421621C}']
function GetName: string;
end;
//
TInfoClass = class of TMyClass;
//自定义的类
TMyClass = class(TObject, IInterface)
protected
FRefCount: Integer;
private
FMyName: string;
public
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
constructor Create; virtual;
function GetName: string; virtual;
property RefCount: Integer read FRefCount;
end;
//展示类
TMyClass1 = class(TMyClass, IClassInfo)
private
FMyName: string;
public
constructor Create; override;
function GetName: string; override;
end;
//工厂类
TClassInfoFactroy = class
class function CreateClass(const ATypeID: Integer): TMyClass;
end; var
Form1: TForm1; implementation {$R *.dfm} var
MyClassList: TStringHash; { TMyClass }
//注册类方法
procedure RegisterMyClass(const ATypeID: Integer; AClass: TInfoClass);
var
num: Integer;
begin
num := MyClassList.ValueOf(IntToStr(ATypeID));
if num = - then
MyClassList.Add(IntToStr(ATypeID), Integer(AClass))
else
Assert(False, Format('ElementTypeID %d ''s EdgeInfo already registered', [ATypeID]));
end; constructor TMyClass.Create;
begin
// 子类实现
end; function TMyClass.GetName: string;
begin
// 子类实现
end; function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result :=
else Result := E_NOINTERFACE;
end; function TMyClass._AddRef: Integer;
begin
Result := InterlockedIncrement(FRefCount);
end; function TMyClass._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = then Destroy;
end; { TMyClass1 } constructor TMyClass1.Create;
begin
FMyName := '类1';
end; function TMyClass1.GetName: string;
begin
Result := FMyName;
end; { TClassInfoFactroy }
//建立类方法
class function TClassInfoFactroy.CreateClass(const ATypeID: Integer): TMyClass;
var
nClass: Integer;
begin
nClass := MyClassList.ValueOf(IntToStr(ATypeID));
if nClass <> - then
Result := TInfoClass(nClass).Create
else begin
Result := nil;
end;
end;
//调用类方法
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := (TClassInfoFactroy.CreateClass() as IClassInfo).GetName;
end;
//初始化
initialization
if MyClassList = nil then
MyClassList:= TStringHash.Create();
// 注册类
RegisterMyClass(, TMyClass1); end.
Delphi使用TStringHash实现建立类(有点像反射)的更多相关文章
- php 建立类POST/GET 的HTTP请求
1.第一种利用fsock的方式来建立类POST的请求. <?php $srv_ip = '192.168.1.5';//你的目标服务地址. $srv_port = 80;//端口 $url = ...
- Delphi之TStrings和TStringLists类
Delphi之TStrings和TStringLists类 有些类不是组件,但它们支持存在的组件.这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings.TCanvas和TC ...
- delphi 控制音量 静音的类
delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...
- Delphi 跨单元进入(访问)类的私有成员,protected ,private部分
http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...
- C# 直接创建多个类和使用反射创建类的性能
原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 10 ...
- 2019-11-29-C#-直接创建多个类和使用反射创建类的性能
原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 li ...
- 2019-8-31-C#-直接创建多个类和使用反射创建类的性能
title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-08-31 16:55:58 +0800 2018 ...
- 044-PHP获得多个类对应的反射信息
<?php //获得多个类对应的反射信息 class demo{ public $str_1; private $str_2; protected $str_3; public function ...
- 043-PHP简单获得一个类对应的反射信息
<?php // 简单获得一个类对应的反射信息 class demo{ CONST CON_STR = '123456'; public $str_1; private $str_2; prot ...
随机推荐
- 在XML里的XSD和DTD以及standalone的使用3----具体使用详解
本人亲自写的一个简单的测试例子 1.xsd定义 <?xml version="1.0" encoding="utf-8"?><xs:schem ...
- HDU 4725 The Shortest Path in Nya Graph(最短路拆点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:n个点,某个点属于某一层.共有n层.第i层的点到第i+1层的点和到第i-1层的点的代价均是 ...
- php整理(一):变量和字符串
PHP中的变量: 1. 定义:$符号来定义变量 2. 说明: (1)PHP弱语言,定义变量的时候不用声明类型,但是并不代表PHP没有数据类型 (2)变量名是区分大小写的,只能是数字,字母或者下划线 ( ...
- eclipse运行emulator时,PANIC:Could not open emulator的解决办法
使用eclipse启动emulator的时候,出现PANIC:Could not open emulator,模拟器无法正常的运行. 经过搜索得知,因为我的SDK的环境变量出问题,需要重新配置下环境变 ...
- rapidxml使用
以前都是用tinyxml,这次开发中解析xml配置文件像尝试一下rapidxml,据说效率很高... RapidXml Manual: http://rapidxml.sourceforge.net/ ...
- iOS开发:插件记录
进入沙盒的插件 https://github.com/TongeJie/ZLGotoSandboxPlugin 图片提示的插件 https://github.com/ksuther/KSImageNa ...
- 【转】JAVA之动态代理
转自:像少年啦飞驰 代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示 ...
- Android 开发问题集合
1.屏幕横.竖切换 修改“AndroidManifest.xml”的android:screenOrientation 一般需要:landscape.portrait 2.修改应用名字 修改“Andr ...
- Java [leetcode 8] String to Integer (atoi)
问题描述: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ...
- 在Windows下编译ffmpeg完全手册
本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...