ウィンドウをドラッグしたいのですが

解決


げん  2002-10-18 09:38:55  No: 1736

Formの上にEditコンポーネントを置いて、
Formの大きさをEditと同じ大きさにして、
FormのBorderStyleをbsNoneに設定してプログラムを
実行すると、Editだけ(のようにみえる)のウィンドウができますよね?
それをドラッグするにはどうすればいいでしょうか。
タイトルバーがあるとできるんですが・・・。
解決策をご存知の方、よろしくお願いいたします。


たかみちえ  URL  2002-10-18 09:44:50  No: 1737

ごめんなさい。今は…。
http://www.google.com/search?q=%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%83%90%E3%83%BC%E4%BB%A5%E5%A4%96%E3%82%92%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0&sourceid=opera&num=100&ie=utf-8&oe=utf-8
この辺りにあるかも。

  確かもっと楽な方法があったような気がしますけどねぇ…。
眠いー。


kazu  2002-10-18 17:34:34  No: 1738

こちらのサイトの「Delphi」→「過去のTips集」→「DelphiによるWin32API」→
「マウス」→「マウス操作でウインドウを移動する」で、出来ますが。


げん  2002-10-19 03:03:43  No: 1739

情報ありがとうございます。
検索かけてもこれだ、というのがなかったので困っていましたが、
調べるのが足りなかったようです。お騒がせ致しました。


げん(追加  2002-10-19 10:03:53  No: 1740

解決済みとしてしまったのですが、たびたびすいません。
もしOnMouseDownイベントを持たないコンポーネントの場合で
この方法を実現しようと思ったらどうなるでしょうか。


にしの  2002-10-19 11:38:39  No: 1741

WM_MOUSEDOWNなどのメッセージで実現できます。
procedure WMMouseDown(var Message: TMessage); message WM_MOUSEDOWN;
という定義です。クラスのメンバ関数に定義してください。
# プロシージャは適当。メッセージはデフォルトはこれ。messageの次にメッセージID。
もしかしたら、WM_MOUSEDOWNというメッセージがないかもしれませんが、文法はこんな感じ、ということで。


げん(追加  2002-10-20 10:25:37  No: 1742

この関数の定義はクラスのメンバ関数ということで、
フォームにこのメソッドを追加するのはできるのですが、

type
  TForm1 = class(TForm)
  protected
    procedure WMMouseDown(var Msg: TMessage); message WM_LBUTTONDOWN;
  end;

OnMouseDownイベントを持たないコンポーネント
(例えばComboBoxとかScroolBarとか)にこのメソッドを追加するには
どういう記述にすればよいのでしょうか・・・
TComboBoxを親とした子クラスを作成して、そのクラスにこのメソッドを
追加すればいいような気がするのですが、よくわからず・・・
何度もご迷惑をおかけしますが、よろしくお願いします。
一日中悩んでます・・・


にしの  2002-10-20 15:20:48  No: 1743

子クラスを作りたくないのであれば、WindowProcプロパティに、同様のプロシージャを代入してやればOKです。

type
  TForm1 = class(TForm)
  private
    OldWndProc: TWndMethod;
    procedure ComboBoxWindowMessage(var Msg: TMessage);
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldWndProc := ComboBox1.WindowProc;
  ComboBox1.WindowProc := ComboBoxWindowMessage;
end;

procedure TForm1.ComboBoxWindowMessage(var Msg: TMessage);
begin
  if Msg.Message = WM_MOUSEDOWN then
  begin
    { WM_MOUSEDOWNの処理を書く }
  end
  else
  begin
    OldWndProc(Message); { デフォルトの処理 }
  end;
end;

ただし、上の例の場合、ComboBox1に対してWindowProcを保存しているので、ComboBox2も同じように設定するには、ComboBox1.WindowProcとComboBox2.WindowProcをどう保存するか考えないといけません。
継承したクラスならば、WindowProcの初期値がWndProcなので、保存する必要はありません。継承していない場合は、WndProcがProtectedな関数なため、アクセスできないので保存する必要があります。


げん  2002-10-21 03:19:42  No: 1744

詳しい解説どうもすいませんでした。
なんとか動作しました^^;
これで頑張ってみます。
ありがとうございました!


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加