【问题标题】:Disable/de-activate a custom component with published property禁用/停用具有已发布属性的自定义组件
【发布时间】:2012-06-29 09:41:34
【问题描述】:

我正在 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;

ActivateZipper 始终为 false,即使我在对象检查器中将其设置为 true。 如何禁止组件使用已发布的属性?

【问题讨论】:

  • ActivateZipper 在构造函数中始终为 False,因为对象初始化为零。流式传输属性时将设置为 True。您是否知道大多数应用程序运行时没有足够的权限写入应用程序文件夹?
  • @DavidHeffernan 好的,为了获得足够的权限,我想可以使用更高权限的清单文件..因为组件是内部的,现在我们可以有希望地处理这一点
  • @PresleyDias,我很少看到您提出与该组件相关的问题,而且我认为您不太了解 Delphi 组件哲学。因此,我衷心推荐您阅读Delphi Component Design by Danny Thorpe。虽然这本书很老了,但它的大部分内容仍然适用于这个主题。
  • @LightBulb 是的,我是这个组件创建、修改和自定义的新手。 ..感谢您的链接..衷心感谢
  • @DavidHeffernan C:\Documents and Settings\Myname\Application Data\myfolder(我想这样更好)谢谢:)

标签: delphi constructor delphi-7 custom-component


【解决方案1】:

构造函数太早了。设计时属性值尚未流入组件。您需要等到组件的 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 但只是为了进一步说明:仅当 CreateATextFileProc 依赖于可能尚未设置/加载的其他属性时才需要加载;无论如何都会调用属性设置器。不过应该提到它!
  • 是的,总是调用属性设置器,这就是为什么我对其进行编码以检查 ComponentState 属性,因此 CreateATextFileProc() 在设计时或在 DFM 流式传输期间不会被调用。
  • [+1,accepted] 它有效..!!...请从 if ActivateZipper 和 ((ComponentState * [csDesigning, csLoading, csLoading ) ]) 中删除额外的大括号 ) = []) 然后..我无法删除,因为编辑太小了
【解决方案2】:

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;

您可能会考虑在设计时关闭此功能,因为您可能只希望在运行时进行实际压缩。然后测试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;

【讨论】:

  • +1,谢谢,但是在创建过程中如何调用它?..更好的主意是在应用程序代码中设置ZipperActive:=true
  • 然后在构造函数中添加ZipperActive := True(或SetZipperActive(True)几乎相同)。
  • 构造函数根本就不是管理文本文件的地方。您必须等到首先调用Loaded(),除非组件是在代码中而不是在设计时构建的。有关如何处理这两种情况的示例,请参阅我的答案。
猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2011-06-29
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多