我正在使用Delphi -7
中的自定义组件,我有一些published
属性
private
{ Private declarations }
FFolderzip ,Fimagezip,Ftextzip,FActivatezipComp : Boolean;
FMessagebo : string;
published
{ Published declarations }
{component Properties}
{#1.Folder Zip}
property ZipFolder : Boolean read FFolderzip write FFolderzip default False;
{#2.Send imagezip ?}
property ZipImage : Boolean read Fimagezip write Fimagezip default False;
{#3.text files}
property ZipText : Boolean read Ftextzip write Ftextzip default False;
{#4.message}
property ZipMessage: String read FMessagebo write FMessagebo ;
{#5.Activate }
property ActivateZipper: Boolean read FActivatezipComp write FActivatezipComp Default false;
end;
当用户删除应用程序上的组件时,ActivateZipper
属性为用户提供激活/启用或禁用/禁用组件的选项。
该组件创建一个文件
所以在构造函数中我有这个,CreateATextFileProc
将在应用程序文件夹中创建文件。所以,如果我签入构造函数,ActivateZipper
是真还是假..
我有constructor
constructor TcomProj.Create(aOwner: TComponent);
begin
inherited;
if ActivateZipper then CreateATextFileProc;
end;
即使我在对象检查器中将其设置为true,ActivateZipper
也始终为false。
如何禁止组件使用已发布的属性?
答案 0 :(得分:4)
构造函数太早了。设计时属性值尚未流入组件。您需要等到组件的Loaded()
方法被调用,然后才能对值进行操作。如果在运行时动态创建组件,则还需要属性设置器,因为没有DFM值,因此不会调用Loaded()
。
type
TcomProj = class(TComponent)
private
...
procedure SetActivateZipper(Value: Boolean);
protected
procedure Loaded; override;
published
property ActivateZipper: Boolean read FActivatezipComp write SetActivateZipper;
end;
procedure TcomProj.SetActivateZipper(Value: Boolean);
begin
if FActivatezipComp <> Value then
begin
FActivatezipComp := Value;
if ActivateZipper and ((ComponentState * [csDesigning, csLoading, csLoading]) = []) then
CreateATextFileProc;
end;
end;
procedure TcomProj.Loaded;
begin
inherited;
if ActivateZipper then CreateATextFileProc;
end;
答案 1 :(得分:2)
即使我在对象检查器中将其设置为True,
ActivateZipper
也总是为假。
您的激活码现在放在构造函数中。关于这一点的一些事情:
您需要的是属性设置器,只要通过对象检查器或代码更改属性,就会调用它:
private
procedure SetZipperActive(Value: Boolean);
published
property ZipperActive: Boolean read FZipperActive write SetZipperActive default False;
procedure TcomProj.SetZipperActive(Value: Boolean);
begin
if FZipperActive <> Value then
begin
FZipperActive := Value;
if FZipperActive then
CreateATextFile
else
...
end;
您可能会考虑在设计时关闭此功能,因为您可能只想在运行时进行实际压缩。然后在ComponentState
中测试csDesigning
标记:
procedure TcomProj.SetZipperActive(Value: Boolean);
begin
if FZipperActive <> Value then
begin
FZipperActive := Value;
if csDesigning in ComponentState then
if FZipperActive then
CreateATextFile
else
...
end;