【问题标题】:How to access to a private variable used as by a property ( designTime package) from another unit (runtimepackage)如何从另一个单元(运行时包)访问属性(设计时间包)使用的私有变量
【发布时间】:2016-01-27 11:18:08
【问题描述】:

为了创建一个组件,我创建了一个设计时和运行时包,运行时包(我们称之为 RP140)包含我的组件的代码并需要 rtl.dcp,设计时包(我们称之为 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.

首先,我必须告诉你,我是创建包和组件的新手,所以我的做法是否正确?还是有什么问题?

其次,正如我之前所说,我想做的是从“myComponent”访问在“MyComponentRegister”中声明的私有变量,我尝试了很多技巧,但都没有奏效,当然有办法做到这一点,但是我的经验有限,我找不到它。那么,我该如何解决这个问题??

【问题讨论】:

  • 我重新格式化了您的代码。下次发布问题时,请确保您的代码可读。我删除了所有虚假的 cmets。发表评论告诉您public 意味着以下成员是公开的,这绝对没有意义。或者告诉您private 表示以下成员是私有的。不要使用与不言自明的内容相呼应的 cmets。
  • 您只是没有拆分设计和运行时包。类应该进入运行时,任何与 IDE 相关的东西(RegisterComponent 在最小的情况下)都应该进入设计时包,而 requires 相应的运行时包。

标签: delphi delphi-2010


【解决方案1】:

你的问题是你试图在多个地方定义你的组件。那是不可能的。您的代码声明了两个不同的类。这比您需要的多一个。

这样做:

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 中定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2014-06-24
    • 2016-07-29
    • 2011-05-12
    相关资源
    最近更新 更多