• Class-reference types 类引用类型--快要失传的技术


    光看帮助你大概搞不清楚这个有什么用。我举一个例子,一般mainform都有很多菜单按钮,用来打开不同的窗口,通常做法要在uses部分添加所有要引用的单元,十分麻烦,用上面的技术就可以避免引用。假设所有的业务窗口都从TAppBasicForm继承,你可以声明这样的类型:

    TTAppBasicFormClass = class of TTAppBasicForm;

    然后在每个业务窗口代码结尾处加上:

    initialization
      RegisterClass(TBusMemberNewForm); //TBusMemberNewForm从TAppBasicForm继承

    finalization
      UnRegisterClass(TBusMemberNewForm);

    最后在Mainform用下面的函数:
    procedure TTMainForm.ShowForm(sFormClass: string);
    var
      AppFormClass: TTAppBasicFormClass;
    begin
      try
        AppFormClass := TTAppBasicFormClass(FindClass(sFormClass));
        with AppFormClass.Create(self) do begin
          Show;
        end;
      except
        ShowMessage('Class ‘+sFormClass+' not exist or not register!');
      end;
    end;
    这个函数的参数就是要打开的窗口类名
    
    更进一步,因为项目中Menu的hint属性不会用到,可以用来存储要打开的类名,如下:
    procedure TTMainForm.MainFormMenuClick(Sender: TObject);
    var
      sFormName: string;
    begin
      with sender as TMenuItem do begin
        sFormName := Trim(Hint);
        if sFormName<>'' then ShowForm(sFormName);
      end;
    end;
    
    procedure TTMainFaceForm.SetMenuAction;
    var
      i: integer;
    begin
      for i:=0 to ComponentCount-1 do begin
        if Components[i] is TMenuItem then begin
          with Components[i] as TMenuItem do
            if Trim(Hint)<>'' then OnClick := MainFormMenuClick;
        end;
      end;
    end;
    
    这样的话每增加一个菜单,只要指定菜单的hint属性就自动实现打开对应业务的功能,避免引用单元,也不用写菜单的onclick代码,非常简洁。当然这个还用到了RegisterClass和FindClass的技术,去看帮助就明白了。
  • 相关阅读:
    软件杯华为ModelArts平台
    软件杯第一阶段博客
    《系统架构》阅读笔记05
    第11周周博客
    测试面试题
    杭电2014 (第一次用vector ac题目)
    杭电 2013 猴子吃桃 递归解法&循环解法
    杭电2012 质数问题
    杭电2629 Identity Card
    杭电1170
  • 原文地址:https://www.cnblogs.com/del88/p/6364993.html
Copyright © 2020-2023  润新知