7

私はカスタムコントロールを持っています:

type
   TContosoFrobber = class(TCustomControl)
   private
   end;

内部的に、私のコンポーネントはコントロールを作成します:

type
   TContosoFrobber = class(TCustomControl)
   private
      FMyDateTimePicker: TDateTimePicker;
   public
      constructor Create(AOwner : TComponent); override;
      property DateTimePicker: TDateTimePicker read FMyDateTimePicker;
   end;

constructor TContosoFrobber.Create(AOwner: TComponent);
begin
   inherted Create(AOwner);

   FMyControl := TMyDateTimePicker.Create(AOwner);
end;

ここで、TMyDateTimePickerTDateTimePickerの単純な子孫です

TMyDateTimePicker = class(TDateTimePicker)
protected
end;

だから私がやったことを要約してください:

  • のプライベート変数を宣言するTDateTimePicker
  • タイプの公開(つまり、公開されていない) プロパティとして公開します。TDateTimePicker
  • ポリモーフィズムを通じて、コントロールは実際にはの子孫ですTDateTimePicker

そして、それはすべて機能しました-最近、Delphi XE6(Windows 10上)を再インストールするまで。

DFM

これが、設計時にエラーが発生した理由を理解できなかった理由です。

クラス TMyDateTimePicker が見つかりません

なぜそのクラスを見つけようとしているのですか?実装の詳細のそのクラス。ストリーミング用に公開されていません。ストリーミング システムはどのようにそれを作成しようとしているのですか!? だから私はDFMをチェックします:

  object cfBeachBall: TContosoFrobber
     Left = 445
     Top = 25
     Width = 101
     Height = 22
     ...snip...
     object TMyDateTimePicker
        Left = 0
        Top = 0
        Width = 101
        Height = 22
        Date = 37306.581535243100000000
        Time = 37306.581535243100000000
        TabOrder = 0
        TabStop = False
     end
  end

なぜTInternalDateTimePickerdfmで終わるのですか:

  • プロパティはpublicであり、公開されていません

フォーム ストリーミング システムが公開されていないプロパティを dfm に配置しないようにするにはどうすればよいですか?

さらに悪いのは、バグのある IDE です。

含まれてはならないプロパティが含まれている場合があるだけではありません。時々、 2回すべきではないプロパティが含まれています:

  object cfPlasticBag: TContosoFrobber
     Left = 445
     Top = 25
     Width = 101
     Height = 22
     ...snip...
     object TMyDateTimePicker
        Left = 0
        Top = 0
        Width = 101
        Height = 22
        Date = 37306.581535243100000000
        Time = 37306.581535243100000000
        TabOrder = 0
        TabStop = False
     end
     object TMyDateTimePicker
        Left = 0
        Top = 0
        Width = 101
        Height = 22
        Date = 37306.581535243100000000
        Time = 37306.581535243100000000
        TabOrder = 0
        TabStop = False
     end
  end
  • 公開されていないプロパティが dfm に含まれないようにするにはどうすればよいですか?
  • dfm が2 回含まれないようにするにはどうすればよいですか?

ハッキングの回避策

私は恐ろしいハックを知っています: DFM に、DFM が知っておくべきではないコントロールについて教えてください:

initialization
    RegisterClass(TMyDateTimePicker);

finalization
    UnRegisterClass(TMyDateTimePicker);

end.

現在、dfm には、業務上認識していないコントロールが含まれています。フォームを保存するたびに、本来あるべきではないものへの参照が含まれます。そして最悪なことに、私はそれがTMyDateTimePicker.

Delphi XE6 が再インストール前にこれを行わなかったのはなぜですか? おそらく、長い間サポートされていなかったバージョンの Delphi の最新のアップデートをインストールする必要がありますか?

既知のバグ?

ここに画像の説明を入力

4

1 に答える 1

12

問題は、間違ったOwnerをに割り当てていることですTDateTimePickerTContosoFrobberの代わりに の所有者を割り当てていTContosoFrobberます。

constructor TContosoFrobber.Create(AOwner: TComponent);
begin
  inherted Create(AOwner);
  FMyControl := TMyDateTimePicker.Create(Self); // <-- not AOwner!
end;

nilまたは: Jerry Doge が述べたように、代わりに Ownerを使用できます。Free()手動で行う必要がありますTDataTimePicker

type
  TContosoFrobber = class(TCustomControl)
  private
    FMyDateTimePicker: TDateTimePicker;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    ...
  end;

constructor TContosoFrobber.Create(AOwner: TComponent);
begin
  inherted Create(AOwner);
  FMyControl := TMyDateTimePicker.Create(nil);
end;

destructor TContosoFrobber.Destroy;
begin
  FMyControl.Free;
  inherted Destroy;
end;
于 2016-09-14T20:04:12.170 に答える