zoukankan      html  css  js  c++  java
  • Delphi用窗体类名创建窗体(需要用到GetClass)

    -----------开发环境 Delphi7

    图片:

    -------------------------------

    这个适合对Delphi有一定了解的人看,因为我不会细说步骤的:

    新建一个工程后,Delphi会自动创建立一个Form1;我们再添加一个Form2;设置Form2不要自动创建!

    --------------------------------

    --Unit开始-------

    ---Unit1开始----

     1 unit Unit1;
     2 
     3 interface
     4 
     5 uses
     6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     7   Dialogs, StdCtrls;
     8 
     9 type
    10   TForm1 = class(TForm)
    11     Button1: TButton;
    12     procedure Button1Click(Sender: TObject);
    13   private
    14     procedure MyCreateForm(sFormClass: string);
    15     { Private declarations }
    16   public
    17     { Public declarations }
    18   end;
    19 
    20 var
    21   Form1: TForm1;
    22 
    23 implementation
    24 
    25 {$R *.dfm}
    26 
    27 procedure TForm1.Button1Click(Sender: TObject);
    28 begin
    29   MyCreateForm('TForm2');
    30 end;
    31 
    32 procedure TForm1.MyCreateForm(sFormClass: string);
    33 var
    34   TvFrmClass: TFormClass;//相当于这个(AFormClass: T.....FormClass;) //这个注释是写给某个人看的,请忽略
    35   vForm:TForm; //这个相当于这个(AForm: T.....Form; )  //这个注释是写给某个人看的,请忽略
    36 begin
    37   TvFrmClass:=TFormClass(GetClass(sFormClass));
    38   if TvFrmClass<>nil then
    39     vForm:=TvFrmClass.Create(self);
    40   //vForm:=TFormClass(GetClass(sFormClass)).Create(self);// 和上面几句是一样效果,但是上面的写法不会报错//当要创建的窗体没有注册时,这句会报错的
    41   if vForm<>nil then
    42     vForm.Show;
    43 end;
    44 
    45 end.

    GetClass简述:

    单元Classes中有这样的定义

    function GetClass(const AClassName: string): TPersistentClass;
    begin
    RegGroups.Lock;
    try
    Result := RegGroups.GetClass(AClassName);
    finally
    RegGroups.Unlock;
    end;
    end;

    RegGroups是什么,是这个TRegGroups类型的变量,是TRegGroups的一个实例赋值给了RegGroups;

    RegGroups怎么创建的?

    在加载Classes这个单元时创建的RegGroups

    ---RegGroups开始

    initialization
    AddModuleUnloadProc(ModuleUnload);
    {$IFDEF MSWINDOWS}
    GlobalNameSpace := TMultiReadExclusiveWriteSynchronizer.Create;
    {$ENDIF}
    {$IFDEF POSIX}
    GlobalNameSpace := TSimpleRWSync.Create;
    {$ENDIF}
    RegGroups := TRegGroups.Create;//这里这里
    IntConstList := TThreadList.Create;
    GlobalFixupList := TThreadList.Create;

    finalization
    UnRegisterModuleClasses(HInstance);
    GlobalNameSpace.BeginWrite;
    FreeIntConstList;
    RemoveFixupReferences(nil, '');
    FreeAndNil(GlobalFixupList);
    FreeAndNil(GlobalLists);
    FreeAndNil(RegGroups);
    GlobalNameSpace := nil;
    RemoveModuleUnloadProc(ModuleUnload);
    FreeAndNil(FindGlobalComponentProcs);

    ---RegGroups 结束

    这个RegGroups 建立了,但问题是

    GetClass的中的值怎么来的

    在Unit2中的最下方有这么一句RegisterClass(TForm2),这就是向RegGroups 添加一个TForm2,这样才能实现GetClass按类名获取到类

    下面的这个一点点扩展,可以不管了,怕绕晕人!

    {扩展:RegisterClass 和 GetClass实际操作的不是TRegGroups的实例,而是TRegGroup的实例,这个两个类的实例配合使用的 }

    -----Unit1结束---------

    -------Unit2开始

     1 unit Unit2;
     2 
     3 interface
     4 
     5 uses
     6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     7   Dialogs;
     8 
     9 type
    10   TForm2 = class(TForm)
    11     procedure FormClose(Sender: TObject; var Action: TCloseAction);
    12   private
    13     { Private declarations }
    14   public
    15     { Public declarations }
    16   end;
    17 
    18 var
    19   Form2: TForm2;
    20 
    21 implementation
    22 
    23 {$R *.dfm}
    24 procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    25 begin
    26   Action:=caFree;
    27 end;
    28 
    29 initialization
    30   RegisterClass(TForm2);
    31 finalization
    32   UnRegisterClass(TForm2);
    33 end.

      在Unit2单元最下面看的到

    29 initialization  //加载单元时执行
    30   RegisterClass(TForm2);//注册这个TForm2
    31 finalization//就叫卸载吧,卸载单元时执行
    32   UnRegisterClass(TForm2);//卸载这个TForm2

    这里的注册TForm2和卸载TForm2要成对出现,最好这样!

    只有注册了,GetClass才能按类名称获取得到类,否则是获取不到。

    --------Unit2结束

    ---Unit结束------

    -------Form开始---

    ---Form1开始

     1 object Form1: TForm1
     2   Left = 633
     3   Top = 333
     4   Width = 341
     5   Height = 281
     6   Caption = 'Form1'
     7   Color = clBtnFace
     8   Font.Charset = DEFAULT_CHARSET
     9   Font.Color = clWindowText
    10   Font.Height = -11
    11   Font.Name = 'MS Sans Serif'
    12   Font.Style = []
    13   OldCreateOrder = False
    14   PixelsPerInch = 96
    15   TextHeight = 13
    16   object Button1: TButton
    17     Left = 112
    18     Top = 80
    19     Width = 75
    20     Height = 25
    21     Caption = 'Button1'
    22     TabOrder = 0
    23     OnClick = Button1Click
    24   end
    25 end

    ----Form1结束

    ----Form2开始

     1 object Form2: TForm2
     2   Left = 588
     3   Top = 370
     4   Width = 439
     5   Height = 315
     6   Caption = 'Form2'
     7   Color = clBtnFace
     8   Font.Charset = DEFAULT_CHARSET
     9   Font.Color = clWindowText
    10   Font.Height = -11
    11   Font.Name = 'MS Sans Serif'
    12   Font.Style = []
    13   OldCreateOrder = False
    14   OnClose = FormClose
    15   PixelsPerInch = 96
    16   TextHeight = 13
    17 end

    ---Form2结束

    ------Form结束----

  • 相关阅读:
    装饰器函数(一)
    面向对象的初阶复习
    内置函数/反射/内置方法(单例类面)
    property特殊属性/类方法/静态方法
    多态/封装
    接口类抽象类
    初始继承之顺序/深度优先及广度优先
    类涉及的空间关系及组合(可变项地址面)
    <head></head>
    让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/15158099.html
Copyright © 2011-2022 走看看