为了创建一个组件,我创建了一个设计时和运行时包,运行时包(让我们称之为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',我尝试了许多技巧,但没有一个工作,肯定有办法做到这一点,但我不能用我有限的经验找到它。所以,我怎么能解决这个问题呢? ?
答案 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
中使用的。