通过字符串,类的引用,创建窗体。

原创 2005年05月23日 18:27:00

{*
单元说明    :  创建模式窗口,和非模式窗口的类,保证非模式窗口只创建一次。
作者        :   
笔名        :  易  一    英文名:yeeyee
E-Mail      :  jane1437@163.com
My Blog     :   http://blog.csdn.net/yeeyee/
QQ          :   282624758

创建时间    :  2005年3月24日
及最后修改时间:2005年5月28日
修改人修改时间:
修改说明:        
版权声明:      版权所有,转载请注明本人邮箱,笔名,
                并保证文章的完整性。
调用说明:
   YShowFormClass.ShowModalForm(TFormArea);YShowFormClass.ShowModalForm('TFormArea');

优缺点说明:
   可以进一步将他封装成 函数,返回类的实例。
*}
//控件单元。

{*
单元说明:     创建模式窗口,和非模式窗口的类,保证非模式窗口只创建一次。
作者        :     笔名:易  一    英文名:yeeyee
E-Mail     :    jane1437@163.com
创建时间:          2005年5月20日
及最后修改时间:
修改人修改时间及:
修改说明:
版权声明:      版权所有,转载请注明本人邮箱和笔名。
*}
unit ShowFormClass;

interface

uses
  SysUtils, Classes,Dialogs, Forms;

type          
  TShowFormClass = class(TComponent)
  private
    { Private declarations }
    //保存要创建的窗体的类名
    FFrmName:string;   
    //判断窗体是否存在。
    function IsFormExist:boolean;
    //得到窗体。
    function GetExistForm:TForm;
    //创建一个类
    function CreateAClass(const AClassName: string): TForm;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); virtual;
    destructor Destroy; override;
   
    //创建并显示窗体。模式窗体。
    procedure ShowModalForm(const AStrForm:string);overload;
    procedure ShowModalForm(AFormClass:TFormClass);overload;
    //创建并显示窗体。非模式窗体。
    procedure ShowModalLessForm(const AStrForm:string);overload;
    procedure ShowModalLessForm(AFormClass:TFormClass);overload;

  published
    { Published declarations }
  end;

procedure Register;

implementation


procedure Register;
begin
  RegisterComponents('Yeeyee', [TShowFormClass]);
end;

constructor TShowFormClass.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TShowFormClass.Destroy;
begin
  inherited Destroy;
end;

function TShowFormClass.GetExistForm:TForm;
var
  i:integer;
begin
  for i := 0 to (Application.ComponentCount - 1) do
  begin
    if (Application.Components[i] is TForm) then
    begin
      //注意,关键判断这个类型名称是否存在。
      if (application.Components[i] as TForm).ClassType.ClassName = FFrmName then
      begin
        Result:=(application.Components[i] as TForm);
        exit;
      end
    end;
  end;
end;

function TShowFormClass.IsFormExist:boolean;
var
  i:integer;
begin
  Result:=False;
  for i := 0 to (Application.ComponentCount - 1) do
  begin
    if (Application.Components[i] is TForm) then
    begin
      //注意,关键判断这个类型名称是否存在。
      if (application.Components[i] as TForm).ClassType.ClassName = FFrmName then
      begin
        Result:=True;
        exit;
      end
    end;
  end;
end;

//创建一个类
function TShowFormClass.CreateAClass(const AClassName: string): TForm;
var
  LFormClass : TFormClass;
  LForm: TForm;
begin
  LFormClass := TFormClass(FindClass(AClassName));
  LForm := LFormClass.Create(Application);
  Result := LForm;
end;

//创建并显示窗体。模式窗体。传入字符串。
procedure TShowFormClass.ShowModalForm(const AStrForm:string);
var
  LForm: TForm;
begin
  FFrmName:=AStrForm;
  LForm := CreateAClass(FFrmName);
  try
    LForm.ShowModal;
  finally
    LForm.Free;
  end;
end;

//创建并显示窗体。模式窗体。传入类的引用。
procedure TShowFormClass.ShowModalForm(AFormClass:TFormClass);
begin
  with AFormClass.Create(Application) do
  begin
    try
      ShowModal;
    finally
      Free;
    end;
  end;
end;

//创建并显示窗体。模式窗体。传入字符串。
procedure TShowFormClass.ShowModalLessForm(const  AStrForm:string);
var
  LForm: TForm;
begin
  FFrmName:=AStrForm;
  //窗体不存在,则创建。
  if not IsFormExist then
  begin
    LForm := CreateAClass(FFrmName);
    LForm.Show;
  end
  else
  begin
    //存在,则得到窗体。带到最前头。
    LForm:=GetExistForm;
    LForm.BringToFront;
  end;
end;

//创建并显示窗体。模式窗体。传入类的应用。
procedure TShowFormClass.ShowModalLessForm(AFormClass:TFormClass);
var
  LForm: TForm;
begin
  FFrmName:=AFormClass.ClassName;
  //窗体不存在,则创建。
  if not IsFormExist then
  begin
    LForm := CreateAClass(FFrmName);
    LForm.Show;
  end
  else
  begin
    //存在,则得到窗体。带到最前头。
    LForm:=GetExistForm;
    LForm.BringToFront;
  end;
end;

end.


//调用单元

procedure TMainForm.mmiAreaClick(Sender: TObject);
begin
  //
  YShowFormClass.ShowModalForm(TFormArea);
end;


(*

procedure TMainForm.mmiAreaClick(Sender: TObject);
begin
  //
  YShowFormClass.ShowModalForm('TFormArea');
end;

initialization                            
begin
  RegisterClasses([TAboutBox,TFormArea]);
end;

finalization
begin
  UnRegisterClasses([TAboutBox,TFormArea]);
end; *)

通过字符串,类的引用,创建窗体

unit ShowFormClass;interfaceuses  SysUtils, Classes,Dialogs, Forms;type             TShowFormClass =...
  • oasiswsc
  • oasiswsc
  • 2007年06月04日 22:33
  • 502

通过字符串,类的引用,创建窗体

unit ShowFormClass; interface uses SysUtils, Classes,Dialogs, Forms; type TSho...
  • QDseashore
  • QDseashore
  • 2012年07月24日 06:14
  • 391

通过字符串,类的引用,创建窗体。

通过字符串,类的引用,创建窗体。document.title="通过字符串,类的引用,创建窗体。 - "+document.title {*单元说明    :  创建模式窗口,和非模式窗口的类,保证非...
  • BennyMavis
  • BennyMavis
  • 2005年07月07日 23:29
  • 1891

Delphi 通过字符串实例化类

D2007 通过字符串创建窗体类对象 1、需要在程序初始胡的时候将类注册,注册到对象 RegGroups:(TRegGroups)中,一遍查找。 注册类使用的函数:RegisterClass...
  • xia_xing
  • xia_xing
  • 2016年08月31日 14:18
  • 848

C#中根据类的名称字符串创建类的实例

这种用法很像是工厂类,但是我们不需要自己实现字符串到类型的对应关系,也不需要创建的类有继承关系,代码如下: // 第一步:得到类的全名(命名空间+类名) ...
  • maozhu_yimi
  • maozhu_yimi
  • 2011年06月02日 16:13
  • 4631

C#如何使用反射实现通过字符串创建类

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Ref...
  • sinat_15155817
  • sinat_15155817
  • 2017年01月03日 17:09
  • 747

创建新的窗体类

创建新的窗体类   到目前为止,我们看到的程序还只是脚本风格,用现有的窗体和控件,快速把窗体放在一起。这种编程风格可用于快速开发单一窗体的应用程序,但是,对于快速创建有多个窗体组成的应用程序,或者创建...
  • hadstj
  • hadstj
  • 2014年05月04日 19:54
  • 1684

如何根据字符串动态创建类对象

如何根据字符串动态创建类对象       今天跟同事聊天的时候,同事有一个需求,就是如何根据类的名字和值,动态返回该类的实例对象。比如,我们给一个函数传入字符串类名”java.lang.String”...
  • wgw335363240
  • wgw335363240
  • 2011年07月09日 14:38
  • 10469

通过字符串创建对象并访问类中的方法(利用java的反射)

首先,通过字符串创建对象,也就是说同一个包下有好多xxxclass.java文件,这些文件中都有相同的属性和方法,那么问题是如何通过我传入字符串来创建对应的对象并访问其中的方法属性等 先来简单说一下...
  • chang3247
  • chang3247
  • 2017年05月16日 14:53
  • 1562

观止——《从Decorator,Adapter模式看Java/IO库》

题记:      总有一些博文总结得很好,看了这篇,就可以忽略其它同一题材的博文了,这就叫观止吧。      我想任何一本介绍模式的书在讲到Decorator模式的时候不能不提到它的实际应用--...
  • thomescai
  • thomescai
  • 2012年04月01日 16:03
  • 486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过字符串,类的引用,创建窗体。
举报原因:
原因补充:

(最多只允许输入30个字)