从自定义类派生的Component属性

时间:2013-05-07 11:05:22

标签: delphi class components

我创建了自己的类,我想在我的新组件中使用它但是我收到错误... 代码如下:

type
  TMyClass = class
    Name: string;
    Number: double;
  end;

  TMyComponent = class(TCustomPanel)
  private
    FMyClass: TMyClass;
  public
    procedure SetMyClass(aName: string; aNumber: double);
  published
    property MyClass: TMyClass write SetMyClass;
  end;

procedure SetMyClass(aName: string; aNumber: double);
begin
  FMyClass.Name:= aName;
  FMyClass.Number:= aNumber;
end;

看来该属性有不兼容的类型,我不知道为什么。

有没有人对此有所了解,我该如何解决这个问题。 将FName和FNumber作为TMyComponent中的字段不是一个选项,我的代码更复杂,这是解释我的目标的一个简单示例。

感谢

3 个答案:

答案 0 :(得分:2)

我目前看到的错误代码是:

  1. 属性设置器必须接收与属性相同类型的单个参数,即TMyClass
  2. 属性设置器必须是该类的成员,但您已将其实现为独立过程。
  3. 已发布的财产需要有一个吸气剂。
  4. 所以代码将成为:

    type
      TMyClass = class
        Name: string;
        Number: double;
      end;
    
      TMyComponent = class(TCustomPanel)
      private
        FMyClass: TMyClass;
        procedure SetMyClass(Value: TMyClass);
      published
        property MyClass: TMyClass read FMyClass write SetMyClass;
      end;
    
    procedure TMyComponent.SetMyClass(Value: TMyClass);
    begin
      FMyClass.Name:= Value.Name;
      FMyClass.Number:= Value.Number;
    end;
    

    此代码不会实例化FMyClass。我猜测实例化FMyClass的代码是为了这个问题而被删除的更大组件代码的一部分。但显然你需要实例化FMyClass

    实例化FMyClass的替代方法是将TMyClass转换为记录。无论这是否符合您的需求,我都说不出来。


    看起来你在实例化这个对象时遇到了一些问题。这样做:

    type
      TMyClass = class
        Name: string;
        Number: double;
      end;
    
      TMyComponent = class(TCustomPanel)
      private
        FMyClass: TMyClass;
        procedure SetMyClass(Value: TMyClass);
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property MyClass: TMyClass read FMyClass write SetMyClass;
      end;
    
    constructor TMyComponent.Create(AOwner: TComponent);
    begin
      inherited;
      FMyClass:= TMyClass.Create;
    end;
    
    destructor TMyComponent.Destroy;
    begin
      FMyClass.Free;
      inherited;
    end;
    
    procedure TMyComponent.SetMyClass(Value: TMyClass);
    begin
      FMyClass.Name:= Value.Name;
      FMyClass.Number:= Value.Number;
    end;
    

    最后一条评论。使用MyClass作为对象是一个坏名字。使用类作为实例的类型和对象。因此,您的属性应为MyObject,成员字段应为FMyObject等。

答案 1 :(得分:1)

试试这个:

type
  TMyClass = class
    Name: string;
    Number: double;
  end;

  TMyComponent = class(TCustomPanel)
  private
    FMyClass: TMyClass;
  public
    procedure SetMyClass(Value: TMyClass);
  published
    property MyClass: TMyClass write SetMyClass;
  end;

procedure TMyComponent.SetMyClass(Value);
begin
  FMyClass := Value;
end;

答案 2 :(得分:0)

unit MyComponentTest2;

interface

uses SysUtils, Classes, Controls, Forms, ExtCtrls, Messages, Dialogs;

type
  TMyClass = class
    Name: string;
    Number: double;
  end;

  TMyComponentTest2 = class(TCustomPanel)
  private
    FMyClass: TMyClass;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure SetMyClass(Value: TMyClass);
  published
    property MyClass: TMyClass read FMyClass write SetMyClass;
  end;

procedure Register;

implementation

constructor TMyComponentTest2.Create(AOwner: TComponent);
begin
  Inherited Create(AOwner);
  FMyClass:= TMyClass.Create;
end;

destructor TMyComponentTest2.Destroy;
begin
  Inherited;
  FMyClass.Free;
end;

procedure TMyComponentTest2.SetMyClass(Value: TMyClass);
begin
  FMyClass.Name:= Value.Name;
  FMyClass.Number:= Value.Number;
end;

procedure Register;
begin
  RegisterComponents('MyComponents', [TMyComponentTest2]);
end;

end.