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实现建立类(有点像反射)的更多相关文章

  1. php 建立类POST/GET 的HTTP请求

    1.第一种利用fsock的方式来建立类POST的请求. <?php $srv_ip = '192.168.1.5';//你的目标服务地址. $srv_port = 80;//端口 $url = ...

  2. Delphi之TStrings和TStringLists类

    Delphi之TStrings和TStringLists类 有些类不是组件,但它们支持存在的组件.这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings.TCanvas和TC ...

  3. delphi 控制音量 静音的类

    delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...

  4. Delphi 跨单元进入(访问)类的私有成员,protected ,private部分

    http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...

  5. C# 直接创建多个类和使用反射创建类的性能

    原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 10 ...

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

    原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 li ...

  7. 2019-8-31-C#-直接创建多个类和使用反射创建类的性能

    title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-08-31 16:55:58 +0800 2018 ...

  8. 044-PHP获得多个类对应的反射信息

    <?php //获得多个类对应的反射信息 class demo{ public $str_1; private $str_2; protected $str_3; public function ...

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

    <?php // 简单获得一个类对应的反射信息 class demo{ CONST CON_STR = '123456'; public $str_1; private $str_2; prot ...

随机推荐

  1. 从Uboot到Linux技术内幕

    1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware) ...

  2. jQuery EasyUI - Add link to datagrid cell

    Extracted from: http://stackoverflow.com/questions/16061894/jquery-easyui-add-link-to-cell HTML: < ...

  3. Android Touch事件分发机制

    参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...

  4. 1934. Black Spot(spfa)

    1934 水题 RE了N久 后来发现是无向图 #include <iostream> #include<cstring> #include<algorithm> # ...

  5. Qt之运行一个实例进程

    简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...

  6. ubuntu下安装使用vmware、kvm、xen

    一. 概念介绍: (1)全虚拟化(Full Virtulization) 简介:主要是在客户操作系统和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使客户操作系统无需修改就能运行, 速度会根据不同的实 ...

  7. VB程序逆向反汇编常见的函数

    VB程序逆向常用的函数 1) 数据类型转换: a) __vbaI2Str    将一个字符串转为8 位(1个字节)的数值形式(范围在 0 至 255 之间) 或2 个字节的数值形式(范围在 -32,7 ...

  8. HDU 5312 Sequence (规律题)

    题意: 一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成? 思路: 首先,序列第1项是1,所以任何数都能构成了.但是最少应该是多少?对式 ...

  9. FFmpeg介绍及参数详细说明

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  10. poj 2773 Happy 2006

    // 题意 :给你两个数 m(10^6),k(10^8) 求第k个和m互质的数是什么这题主要需要知道这样的结论gcd(x,n)=1 <==> gcd(x+n,n)=1证明 假设 gcd(x ...