4

私の目標は、Delphi IDE に見られるような単純なフォーム エディタを作成することです。

現在、ユーザーはコンポーネントを選択して追加し、フォームの所有者である TPanel の親にすることができます。簡単にするために、TPanel もフォームに追加されるビジュアル コンポーネントと考えてください。

不足している部分が 2 つあります。完了するのに役立つアイデアやコードを見つけたいです。

1 - 作成したビジュアル コンポーネントを移動する方法は? Tpanel などのビジュアル コンポーネントを移動するための IDE と同じ効果、その上と左の位置を変更

視覚的な部分を処理するために関連する部分のみが必要です。私はDFMなどを生成していません。

4

3 に答える 3

5

簡単に言うと、移動コードでこれを行う必要があります。

  1. マウスが下がったら、マウスの位置がドラッグ可能なコントロールの上にあるかどうかを確認します。FDragControlその場合は、そのコントロールを参照する名前の変数を設定します。このコードは、OnMouseDownイベント ハンドラー内にあります。
  2. マウスが移動したとき、FDragControlが nil でない場合、コントロールを移動します。このコードは、OnMouseMoveイベント ハンドラー内にあります。
  3. マウスが上がると、FDragControlnil に設定します。

それだけです。主なニュアンスは、ドラッグが開始されたときのマウスの X、Y 値も覚えておく必要があるということです。したがって、OnMouseDownハンドラーで次のように記述します。

FStartMousePos := Point(X, Y);
FStartDragControlPos := Point(FDragControl.Left, FDragControl.Top);

そして、OnMouseMoveあなたの位置コードは次のようになります。

FDragControl.Left := FStartDragControlPos.X + (X-FStartX);
FDragControl.Top := FStartDragControlPos.Y + (Y-FStartY);

また、ドラッグを開始するときにマウスをキャプチャする必要があります。

サイズ変更コードも同様です。繰り返しますがOnMouseDown、ドラッグするのではなくサイズを変更することを で決定する必要がありますが、コードにはマウス ダウン、移動、およびアップ イベントの処理が含まれます。

ペイントに関しては、イベント ハンドラーの 1 つがフォームの外観に影響を与えるプロパティを変更するたびに、再ペイントを強制する必要があります。の値を使用してFDragControl、コントロールの特別な描画を使用するかどうかを決定し、ドラッグ中であることを示すことができます。サイズ変更についても同様です。

あなたの質問は高レベルで概念的なものであるため、完全に機能する実装をコーディングしていません。実装はあなた次第です。

于 2013-05-10T12:54:30.257 に答える
2

//元の質問の編集として実際に作成する必要があった最新の更新を読んだばかりなので、これを回答にしましたが、とにかく。

Cindy コンポーネント パックをダウンロードし、cyResizer コンポーネントを使用できます。これは、必要なほとんどすべてを実行し、非常にカスタマイズ可能でもあります。

ここからダウンロードできます: http://sourceforge.net/projects/tcycomponents/

于 2013-05-10T20:05:20.677 に答える
1

答えをさらに検索すると、次の記事が見つかりました。

実行時にコントロールを移動およびサイズ変更する方法 http://delphi.about.com/library/weekly/aa102505a.htm

実行時にサイズ変更されるコントロールにサイズ ハンドルを追加する方法 http://delphi.about.com/library/weekly/aa110105a.htm

ソースコードの例でこのタスクを完了するためのすべての情報がほとんど含まれています。

これらの記事では、TMover クラスを実装して使用する方法を示します。私はそれを行い、正しく動作します。

TcyComponents Pack もダウンロードし、TcyResizer を使用しました。これは、フォーム エディタのような Delphi に必要なほとんどすべてを備えたフル機能のフォーム エディタです。私はお勧め。ソースコードが付属しており、XE2 バージョンで正常に動作します。

于 2013-05-10T14:44:42.677 に答える