RegisterClasses([TButton]);一下就可以了

解决方案 »

  1.   

    newwen(wen) :应该写在哪里呢?
     再问一个:如果是自己的一个class如下Unit Unit2;Interface
    Uses
       Windows, SysUtils, Dialogs, Classes, Forms, Graphics, comctrls, StdCtrls,
       Controls, typinfo;
    Type
       TBaseObject = Class(TPersistent) {数据据结果在这里写}
       Private
          FX: Integer;
          FY: Integer;
          FStr: String;
          {....}
          {修改结构同时也修改CopyObject中的属性}
       Public
          Constructor Create;
          Destructor Destroy; Override;
          Property X: Integer Read FX Write FX;
          Property Y: Integer Read FY Write FY;
          Property OneStr: String Read FStr Write FStr;
          {....}
          {修改结构同时也修改CopyObject中的属性}
       End;
    Type
       TCxBase = Class(TList)
       Private
          Function GetObject(AIndex: Integer): Pointer;
          Procedure SetObject(AIndex: integer; Aobject: Pointer);
       Public
          Procedure addObject(NewObject: Pointer);
          Procedure InsertObject(AIndex: Integer; NewObject: Pointer);
          Procedure DeleteObject(AIndex: Integer);
          Property GmObject[Index: integer]: Pointer Read Getobject Write SetObject;
          {ToDo:
             GmObject :如果将List列表中的某一个项直接赋给另一项,则释放时有可能会出错。
             这是因为指向了同一个地址而释放多错而出错。}
          Destructor Destroy; Override;
          Function CopyObject(AObject: Pointer):Pointer; {将结构中的所有的值重新赋值一次}
          Procedure PasteObject(AObject:Pointer);{ Copy and Paste}
          Function FindObjectStr(FieldName: String; FieldValue: String): Boolean;
          Function FindObjectReal(FieldName: String; FieldValue: Real): Boolean;
       End;
    Type
       tmyobject = Class(TBaseObject)
       private
          fa:string;
       Public
          property a:string read fa write fa;
    end;ImplementationConstructor TBaseObject.Create;
    Begin
       Inherited Create;
       Fx := 0;
       Fy := 0;
       FStr := 'abc';
    End;Destructor TBaseObject.Destroy;
    Begin
       Inherited Destroy;
    End;{ Tcxbase }Procedure Tcxbase.addObject(NewObject: Pointer);
    Begin
       Add(NewObject);
    End;function TCxBase.CopyObject(AObject: Pointer): Pointer;
    Var
       Tempobject:TBaseObject;
    begin
       Tempobject.X := TBaseObject(AObject).X;
       Tempobject.Y := TBaseObject(AObject).Y;
       Result:=Tempobject;end;Procedure TCxBase.DeleteObject(AIndex: Integer);
    Begin
       If AIndex > Self.Count - 1 Then
          MessageDlg('List index out of bounds(' + IntToStr(AIndex) + ')', mtError, [mbOK], 0)
       Else Begin
          TBaseObject(Self.Items[Aindex]).free;
          Self.Delete(Aindex);
       End;
    End;Destructor Tcxbase.Destroy;
    Var
       I: integer;
    Begin
       For i := 0 To Self.Count - 1 Do Begin
          TBaseObject(Self.Items[i]).free;
       End;
       Inherited DEstroy;
    End;Function TCxBase.FindObjectReal(FieldName: String; FieldValue: Real): Boolean;
    Begin
    //   ShowMessage('this is 123.3');
       Result := True;
    End;Function TCxBase.FindObjectStr(FieldName, FieldValue: String): Boolean;
    {Var
       aObject: TObJect;
       OneBaseObject: TBaseObject;
       aa, bb: String;
       PropInfo: PPropInfo;}
    Begin
    这里是问题:1、要根据所传递过来结构中某个属性和该属性的性,那应当如何判断所传过的属性在上面的结果中已定义呢?如上面的onestr,则是正确,如传onstr就是错误的呢?
    2、如果传过的属性是合法的,那么应该当如何取该属性的值呢?谢 谢
    {   OneBaseObject := Self.items[0];
       showmessage(onebaseobject.onestr);
       aObject := OneBaseObject;
       bb := 'OneStr';
       PropInfo := GetPropInfo(aObject.ClassInfo, bb);
       aa := '';
       If PropInfo = Nil Then
          ShowMessage(aa)
       Else
          aa := GetStrprop(aobject As TBaseObject, PropInfo);
       //   ShowMessage(aa); }
       Result := True;
    End;Function Tcxbase.GetObject(AIndex: Integer): Pointer;
    Begin
       Result := Self.Items[Aindex];
    End;Procedure Tcxbase.InsertObject(AIndex: Integer; NewObject: Pointer);
    Begin
       self.Insert(Aindex, NewObject);
    End;procedure TCxBase.PasteObject(AObject: Pointer);
    Var NewObject:TBaseObject;
    begin
       NewObject:=TBaseObject.Create;
       with NewObject do begin
          x:=TBaseObject(AObject).x;
          y:=TBaseObject(AObject).y;
       end;
       Self.addObject(NewObject);
    end;Procedure Tcxbase.SetObject(AIndex: integer;
       Aobject: Pointer);
    Begin
       If Aindex > Self.Count - 1 Then Begin
          MessageDlg('List index out of bounds(' + IntToStr(AIndex) + ')', mtError, [mbOK], 0)
       End Else
          Self.Items[Aindex] := Aobject;
    End;End.