如何把一个类型作为参数进行传递?
想了很久没想明白

解决方案 »

  1.   

    procedure a(s :string);
    var
      i :integer;
    begin
      if s = 'integer' then
        i := 1
      else
        i := 0;
    end;
      

  2.   

    使用 Class-reference types!例如:TMyClass = class(TObject)
      ......
    end;TMyClass2 = class(TMyClass)
      ......
    end;TMyClassRef = class of TMyClass;  // 声明Class-reference types procedure f(MyClass: TMyClassRef);
    begin
      .....
    end;
    调用的时候可以:f(TMyClass);
    f(TMyClass2); // TMyClass 的派生类也行!
      

  3.   

    type
      TSomeProcType = procedure (var AI:Integer);
    ....
      procedure SomeProcWithTypeParams(ASomeProcType:TSomeProcType);
    ....procedure SomeProcWithTypeParams(ASomeProcType:TSomeProcType);
    begin
      ShowMessage(IntToStr(PInteger(@ASomeProcType)));
    end;这里就是将一个类型(过程类型)做为参数传递给相应方法进行处理!
      

  4.   

    用TObject类型传递
    在函数中通过判断传进来的类型的类名,例如:
    if Sender=Edit2 then
      TEdit(Sender).Text:='hehe';
      

  5.   

    用TObject类型传递
    在函数中通过判断传进来的类型的类名,例如:
    function LoadData(Sender:TObject);
    begin
      if Sender=Edit2 then
        TEdit(Sender).Text:='hehe';
    ......
    End;
      

  6.   

    类引用
     
    有时类的操作作用于其自身,这不同于作用于类的实例(即对象)。例如,当用类引用调用构造器方法时。对于这样的情况,总是可以明确指定要用的类的名称,但有时必需声明变量或参数把类作为值处理,并且这种情况下需要类引用类型(class-reference types)。
    类引用类型类引用类型有时叫做元类(metaclass),表示类引用类型的结构具有如下形式class of type这里的type是任何类类型。标识符type自身表示一个值,它的类型是type类。如果type1是type2的祖先,那么type2的类与type1的类是赋值兼容的。因此,type TClass = class of TObject;var AnyObj: TClass;这里声明一个叫做AnyObj的变量,用于可以保存对任何类的引用。(类引用类型的定义不能直接出现在变量声明或参数列表声明中。)可以把值nil赋给任何类引用类型的变量。要明白类引用类型是如何被使用的,可以查看TCollection(Classes单元中)的构造器声明:type TCollectionItemClass = class of TCollectionItem;  ...constructor Create(ItemClass: TCollectionItemClass);这里的声明表明,要创建TCollection的实例对象,就必需向构造器传递TCollectionItem类或自该类派生的类的名称。编译时,想要调用类或对象的类方法或者虚拟的构造器,而不知道其实际类型时,类引用类型是有用的。
    构造器和类引用构造器可以被类引用类型的变量调用。这就允许在编译时构造类型未知的对象。例如,type TControlClass = class of TControl;function CreateControl(ControlClass: TControlClass;  const ControlName: string; X, Y, W, H: Integer): TControl;begin  Result := ControlClass.Create(MainForm);  with Result do  begin    Parent := MainForm;    Name := ControlName;    SetBounds(X, Y, W, H);    Visible := True;  end;end;上面的例子中,CreateControl函数需要一个类引用类型告诉它何种控件被创建。该函数用这一参数调用类的构造器。因为类类型标识符表示类引用的值,所以对CreateControl调用可以指定类的标识符以创建相应的对象。例如,CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);用类引用调用的构造器通常是虚拟的。运行时类引用的类型决定了构造器在调用时的具体实现。