1

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

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 中的字段不是一种选择,我的代码更复杂,这是一个解释我的目标的简单示例。

谢谢

4

3 回答 3

2

目前我认为您的代码有问题的是:

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

所以代码会变成:

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.

实例化的另一种方法FMyClassTMyClass变成记录。这是否适合您的需求,我无法确定。


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

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等。

于 2013-05-07T11:25:32.383 回答
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;
于 2013-05-07T11:11:03.497 回答
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.
于 2013-05-07T12:50:36.113 回答