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 ...
随机推荐
- BZOJ3122 随机数生成器
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3122 题意: 思路:(1)x1=t则n=1; (2)a=0,则b=t,n=2;否则无解: ...
- Sublime Text3中文乱码及tabs中文方块的解决方案
一.文本出现中文乱码问题 方案1 1.打开Sublime Text 3,按Ctrl+-打开控制行,复制粘贴以下python代码,然后回车运行. 2. 复制并粘贴如下代码: import urllib. ...
- jenkins 状态管理
如何安装Jenkins as rpm: $ sudo service jenkins restart Usage: /etc/init.d/jenkins {start|stop|status|res ...
- POJ2135 最小费用最大流模板题
练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include ...
- The resource could not be loaded because the App Transport
Xcode7 beta 网络请求报错:The resource could not be loaded because the App Transport Xcode7 beta 网络请求报错:The ...
- error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC解决办法
使用qtcreator加androidndk编译项目时报错: error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; r ...
- git - 搭建git仓库
1. 更新git版本: http://codelife.me/blog/2013/06/25/upgrade-git-on-centos-6-4/ 2. 建立git仓库: git init --bar ...
- hdu 4435 charge-station
// 题意 从1出发逛完N个点回到出发点 要在这N个点选择性建设加油站 车每次加满油最多可以行使D米// 然后最少要花多少钱才能达到上述要求// 注意到 第i个城市的花费是 2^(i-1) 所以 我就 ...
- java运用FFMPEG视频转码技术
基于windows系统安装FFMPEG转码技术 http://wenku.baidu.com/link?url=z4Tv3CUXxxzLpa5QPI-FmfFtrIQeiCYNq6Uhe6QCHkU- ...
- Vijos 1132 求二叉树的先序序列
描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8). 格式 输入格式 第一行为二叉树的中序序列 第二行为二叉树的后序序列 输出格式 一行,为二叉树的先 ...