如何从另一个单元(runtimepackage)访问属性(designTime包)使用的私有变量

时间:2016-01-27 11:18:08

标签: delphi delphi-2010

为了创建一个组件,我创建了一个设计时和运行时包,运行时包(让我们称之为RP140)包含我的组件的代码并需要rtl.dcp,designtime包(让我们称之为DclRP140)包含注册程序和需要DesignIDE,运行时包和rtl.dcp。现在我需要访问属于" DclRP140"的单元中声明的私有变量。包,来自属于" RP140"的另一个单元,我创建了一个包含相关部分的简单代码,只是为了让它更容易理解:

unit MyComponentRegister;

interface

uses Classes, MyComponent;

type
  TEvent = procedure(sender: TObject) of object;

  TMyComponent = class(TComponent)
  private
    FMyproperty: String;
    FMyEvent: TEvent;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property myProperty: String read FMyproperty write FMyproperty
      default initial_value;
    property myEvent: TEvent read FMyEvent write FMyEvent;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMyComponent]);
end;

Constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited;
  FMyproperty := initial_value;
end;

end.

另一个单元包含我的组件的主要代码:

unit myComponent;

interface

uses
  SysUtils, Classes;

type
  TMyComponent = class(TComponent)
  public
    procedure myProcedure(avalue: string);
  end;

implementation

procedure TMyComponent.myProcedure(avalue: string);
begin
  FMyproperty := avalue; // I want to access to FMyproperty
  if assigned(Fmyevent) then // I want to access to fMyEvent
    // do some work
end;

end.

首先,我必须告诉你,我是创建软件包和组件的新手,所以我是以正确的方式做到的吗?或者有什么不对吗?

其次,正如我之前所说,我想要做的是访问在' MyComponentRegister'中声明的私有变量。来自' myComponent',我尝试了许多技巧,但没有一个工作,肯定有办法做到这一点,但我不能用我有限的经验找到它。所以,我怎么能解决这个问题呢? ?

1 个答案:

答案 0 :(得分:4)

您的问题是您尝试在多个位置定义组件。那是不可能的。您的代码声明了两个不同的类。这比你需要的还要多。

这样做:

unit MyComponent;

interface

uses
  Classes;

type
  TEvent = procedure(sender: TObject) of object;

  TMyComponent = class(TComponent)
  private
    FMyproperty: String;
    FMyEvent: TEvent;
  public
    constructor Create(AOwner: TComponent); override;
    procedure myProcedure(avalue: string);
  published
    property myProperty: String read FMyproperty write FMyproperty;
    property myEvent: TEvent read FMyEvent write FMyEvent;
  end;

implementation

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited;
end;

procedure TMyComponent.myProcedure(avalue: string);
begin
  FMyproperty := avalue;
  if assigned(FMyEvent) then
    ; // do some work
end;

end.

此单元包含在设计时和运行时包中。

unit MyComponentRegister;

interface

uses
  Classes, MyComponent;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMyComponent]);
end;

end.

第二个单元仅包含在您的设计时间包中。请注意,它没有定义组件,因为它是在MyComponent中使用的。