4

複数のアイテム コントロールの親となるコンテナー コントロール、TScrollBox があります。

複合自体であるすべての項目コントロールには、削除ボタンが含まれています (親と所有)。ボタンを押すと、項目コントロールの削除が開始されます。

削除にはコンポーネントの解放が含まれるため、実際の操作はアイテムに関して外在的でなければなりません。問題は、それを行うための最良の方法は何ですか?

私は実際にいくつかのオプションを知っています:

  • 小さな間隔のタイマー (ボタンのクリックで開始);
  • 非表示の外側のボタン (マウスのダウンとアップのメッセージが表示されるボタン);
  • フォームのカスタム メッセージ ハンドラ。

私は自信を持ってこれらの方法のいずれかを実装できましたが、自分自身をお世辞として、どれが最適かはわかりません。その上、タイマー オプションは幼稚に見え、非表示のボタンはハックっぽく、カスタム メッセージは少しやり過ぎです。要するに、3 つすべてが多かれ少なかれ半分は受け入れられるように見えます。

私は単に偏見を持っているだけかもしれませんし、逆に納得しても構いません。それでも、そのような場合に使用する一般的な方法は何かを知りたいです(おそらく、私がずっと見逃していたものです)。

4

2 に答える 2

4

通常のアプローチは、解放するコントロールにメッセージをポストすることです。TForm.Releaseたとえば、実装方法を参照してください。CM_RELEASE実際、メッセージを再利用できない理由はわかりません。

メッセージの投稿に関するポイントは、キューの最後に移動し、同期メッセージ (つまり によって配信されたメッセージSendMessage) の処理が完了した場合にのみ処理されることです。これにより、オブジェクトが解放された後にメソッドが呼び出されるのを回避できます。これは、明らかによく知っているエラーです。

于 2011-03-29T12:58:39.303 に答える
2

まず、TScrollBox から継承するカスタム コントロールを作成し、サブコントロールのインスタンス化と削除をそのスクロール ボックス内の機能として提供することをお勧めします。このコードは独自のユニットに配置され、そのパブリック要素のみが外部に表示されます。それはまさにオブジェクト指向の基本です。

第 2 に、スクロール ボックスからコントロールを削除する (削除する) 場合、Timer は単に混乱の元になります。そのコンテナに入れるすべてのコントロールをサブクラス化している場合は、TForm.Release で使用されるメカニズムを使用して (CM_RELEASE メッセージを送信します)、このメッセージが送信されたときにコントロールが自分自身を削除する方法で CM_RELEASE を実装することができます。 、ただし、フォーカスを失うと破棄される編集コントロールの場合を除いて、これは醜いと思います。

TScrollLBox クラスとそれに入れたい他のクラスの両方をサブクラス化し、コントロールの削除を親オブジェクト (TScrollBox) で処理することにより、タイマーに頼らずにこれらのメソッドを直接削除します。あらゆる種類の外部操作によるものではありません。

于 2011-03-29T13:00:17.270 に答える