Delphi 禁用/取消激活具有已发布属性的自定义组件
我在Delphi 禁用/取消激活具有已发布属性的自定义组件,delphi,constructor,delphi-7,custom-component,Delphi,Constructor,Delphi 7,Custom Component,我在Delphi-7中开发一个自定义组件,为此我发布了一些属性 private { Private declarations } FFolderzip ,Fimagezip,Ftextzip,FActivatezipComp : Boolean; FMessagebo : string; published { Published declarations } {component Properties} {#1.Folde
Delphi-7
中开发一个自定义组件,为此我发布了一些属性
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
properties为用户提供一个选项来激活/启用或停用/禁用组件执行。
组件将创建一个文件
因此,在构造函数中,我有这样一个命令,CreateATextFileProc
将在应用程序文件夹中创建文件。因此,如果我在构造函数中检查ActivateZipper
是否为真
我有一个构造函数
constructor TcomProj.Create(aOwner: TComponent);
begin
inherited;
if ActivateZipper then CreateATextFileProc;
end;
ActivateZipper
始终为false,即使我在对象检查器中将其设置为true。
如何禁止组件使用已发布的属性执行此操作
ActivateZipper
始终为False,即使我在对象检查器中将其设置为True
您的激活码现在被放置在构造函数中。关于这一点,有几点:
- 在构造函数中,所有私有字段都初始化为零(0、、null、nil,具体取决于类型)。如果不以其他方式进行设置,则在创建组件后,这些字段将保持为零
- 使用“对象检查器”更改特性时,零部件已创建
- 你的代码永远不会运行
- 如果确实希望在创建时以其他方式对其进行初始化,请同时更改默认存储说明符
您需要的是一个属性设置器,每当通过对象检查器或代码更改属性时,都将调用该属性设置器:
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;
ActivateZipper
始终为False,即使我在对象检查器中将其设置为True
您的激活码现在被放置在构造函数中。关于这一点,有几点:
- 在构造函数中,所有私有字段都初始化为零(0、、null、nil,具体取决于类型)。如果不以其他方式进行设置,则在创建组件后,这些字段将保持为零
- 使用“对象检查器”更改特性时,零部件已创建
- 你的代码永远不会运行
- 如果确实希望在创建时以其他方式对其进行初始化,请同时更改默认存储说明符
您需要的是一个属性设置器,每当通过对象检查器或代码更改属性时,都将调用该属性设置器:
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;
构造函数太早了。设计时特性值尚未流式传输到组件中。您需要等待组件的Loaded()
方法被调用,然后才能对这些值进行操作。如果在运行时动态创建组件,还需要一个属性设置器,因为没有DFM值,因此不会调用load()
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;
类型
TcomProj=类别(TComponent)
私有的
...
过程SetActivateZipper(值:布尔);
受保护的
加载程序;推翻
出版
属性ActivateZipper:Boolean read FActivatezipComp write SetActivateZipper;
终止
过程TcomProj.SetActivateZipper(值:布尔);
开始
如果FActivatezipComp值,则
开始
FActivatezipComp:=值;
如果ActivateZipper和((组件状态*[csDesigning,csLoading,csLoading])=[]),则
CreateATextFileProc;
终止
终止
程序TcomProj.已加载;
开始
继承;
如果激活Ezipper,则创建ATextFileProc;
终止
构造函数太早了。设计时特性值尚未流式传输到组件中。您需要等待组件的Loaded()
方法被调用,然后才能对这些值进行操作。如果在运行时动态创建组件,还需要一个属性设置器,因为没有DFM值,因此不会调用load()
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;
类型
TcomProj=类别(TComponent)
私有的
...
过程SetActivateZipper(值:布尔);
受保护的
加载程序;推翻
出版
属性ActivateZipper:Boolean read FActivatezipComp write SetActivateZipper;
终止
过程TcomProj.SetActivateZipper(值:布尔);
开始
如果FActivatezipComp值,则
开始
FActivatezipComp:=值;
如果ActivateZipper和((组件状态*[csDesigning,csLoading,csLoading])=[]),则
CreateATextFileProc;
终止
终止
程序TcomProj.已加载;
开始
继承;
如果激活Ezipper,则创建ATextFileProc;
终止
ActivateZipper
在构造函数中始终为False,因为对象初始化为零。当属性以流形式输入时,它将设置为真。你知道大多数应用程序运行时没有足够的权限写入应用程序文件夹吗?@DavidHeffernan好的,为了获得足够的权限,我想可以使用更高权限的清单文件。由于该组件是内部的,我们现在可以处理了that@PresleyDias,我已经看到了一些与这个组件相关的问题,我认为您不太理解Delphi组件哲学。因此,我衷心建议您阅读。虽然这本书很旧,但它的大部分内容仍然适用于这个主题。@Lightbull是的,我是这个组件创建、修改和定制的新成员。。衷心感谢你的链接appreciated@DavidHeffernanC:\Documents and Settings\Myname\Application Data\myfolder
(我想这样更好)谢谢:)ActivateZipper
在构造函数中始终为False,因为对象初始化为零。当属性以流形式输入时,它将设置为真。你知道大多数应用程序运行时没有足够的权限写入应用程序文件夹吗?@DavidHeffernan好的,为了获得足够的权限,我想可以使用更高权限的清单文件。由于该组件是内部的,我们现在可以处理了that@PresleyDias,我已经看到你的一些问题与这个相同的组成部分,我想你不太明白