1

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プロパティは、コンポーネントの実行をアクティブ化/有効化または非アクティブ化/無効化するオプションを使用に提供します。コンポーネントはファイルを作成するので、コンストラクターでこれを使用すると、アプリケーションフォルダーにファイルが作成されます。したがって、コンストラクターをチェックインすると、がtrueかfalseCreateATextFileProcかがわかります。ActivateZipper

私は持っていますconstructor

     constructor TcomProj.Create(aOwner: TComponent);
     begin
       inherited;
       if ActivateZipper then CreateATextFileProc;
     end;

ActivateZipperオブジェクトインスペクタでtrueに設定した場合でも、これは常にfalseです。コンポーネントが公開されたプロパティで機能するように無効にするにはどうすればよいですか?

4

2 に答える 2

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;
于 2012-06-29T16:33:38.737 に答える
2

ActivateZipperオブジェクト インスペクタで True に設定しても、常に False です。

アクティベーション コードがコンストラクターに配置されます。それについてのいくつかのこと:

  • コンストラクターでは、すべてのプライベート フィールドがゼロ (型に応じて 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;

実行時にのみ実際の圧縮が必要になる可能性が高いため、設計時にはこの機能をオフにすることを検討してください。csDesigning次に、フラグをテストしComponentStateます。

procedure TcomProj.SetZipperActive(Value: Boolean);
begin
  if FZipperActive <> Value then
  begin
    FZipperActive := Value;
    if csDesigning in ComponentState then
      if FZipperActive then
        CreateATextFile
      else
        ...
end;
于 2012-06-29T10:12:50.097 に答える