7

Delphi 2006 (私が思うに) で TFlowPanel と TGridPanel が導入される前に、概念が似ているコントロールを作成しました。これらのコントロールが実行しないことはまだいくつかあります。私のコードを Delphi 2009 にアップグレードするときに、それにいくつかの拡張機能を追加することにしました。

現在、子コントロールの順序は作成順序によって決定されます。FlowPanel と GridPanel は、ControlIndex やその他のフィルター処理されたプロパティでより良い方法を示していますが、設計時にドラッグ アンド ドロップの並べ替えを処理する方法があるかどうか疑問に思っていました。私が知る限り、編集コントロールをドラッグしてパネルにドロップしても、設計時にアクセスできるものは何も呼び出されません。

ドロップ操作を直接検出する方法、またはコントロールが移動したことを検出してどこに移動するかを決定する方法について、半分空想していました。

何か案は?

更新: OK、動作しました。コンテナー コントロールは、コントロールの配置を管理するために、AlignControls を既にオーバーライドしていました。ネストされたコントロールをドラッグ アンド ドロップすると、AlignControls が再度呼び出されます。次に、コントロールの新しい座標をリスト内の他のコントロールと比較し、適切な位置に移動しました。

解決しなければならない問題がいくつかありました (ほとんどは、AlignControls への多数の呼び出しに関連しています) が、基本的な概念は十分に単純です。助けてくれたすべてのコメント投稿者に感謝します。

4

3 に答える 3

5

既にフォームにあるコントロールをドラッグしてパネルにドロップすることはできません。ドラッグはコントロールを移動するためのものであり、親を変更するためのものではありません。親を変更するには、カット アンド ペーストします。

コントロールが既にパネルにあり、それをパネル上の別の位置に移動したい場合、パネルはTWinControl.AlignControlsメソッドをオーバーライドしてレイアウトを制御できます。コントロールが移動されると、そのSetBoundsメソッドが呼び出されます。発生することの中にはAlignControl(Self)、親ウィンドウでの呼び出しがあります。それは を呼び出しますAlignControlsControls.pasを見ると、これは複雑なメソッドであることがわかりますが、これはコントロール上の子のレイアウトを担当するものであり、まさにあなたが変更しようとしているものです。

于 2009-05-25T15:13:58.987 に答える
3

おそらく、これらの提案のいくつかが役立つかもしれません。

カット アンド ペーストを行わなくても、デザイナーでコントロールの親を変更できます。構造ペインを表示し、ビジュアル コントロールを構造ペイン内の別の親のノードにドラッグするだけです。フロー パネルに項目がある場合は、すべてをフロー パネルの外にドラッグし、元の順序にドラッグして戻します。

(この方法で、親以外の何も変更せずに、任意のビジュアル コントロールの親を変更できます。この方法で行うことを強くお勧めします。)

フォームをテキストとして表示し、そこで宣言の順序を移動できますが、「リソース」ファイルを直接編集する場合は注意が必要です。

デザイナーでタブ オーダーを設定できるため、必要に応じて機能するタブ オーダーに基づいて別のコントロールを作成できます。フォームを右クリックして非ビジュアル コントロールの作成順序を変更できますが、ビジュアル コントロールでは機能しません。

于 2009-05-26T03:35:13.927 に答える
0

コンポーネントがデザイン モードかどうかを確認する、グリッド コンポーネントの「OnDragDrop」イベントを作成しようとしましたか?

そのようなコンポーネントはまだ作成していませんが、イベントがトリガーされない理由がわかりません。

于 2009-05-25T14:40:28.913 に答える