Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

При пертаскивании формы не за заголовок не работает OnMouseUp [D7, 2000]


azl ©   (2005-12-25 16:16:00) 

Добрый день. Столкнулся с такой проблемой: При пертаскивании формы не за заголовок не работает событие OnMouseUp.

procedure TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform (WM_SYSCOMMAND,SC_MOVE+2,0);
end;

Пробовал другой вариант:

type
TForm = class(TForm)
private
procedure NCHitTest(var WMNCMsg: TWMNCHitTest); message WM_NCHITTEST;
end;
...
procedure TForm1.NCHitTest(var WMNCMsg: TWMNCHitTest);
begin
inherited;
with WMNCMsg do if Result = HTClient then Result:= HTCaption;
end;


OnMouseUp работает, но при этом не SpeedButton не нажимается.
Как быть в такой ситуации?
Мне нужно чтобы и событие OnMouseUp работало и SpeedButton нажмался, и при этом можно было перетаскивать форму не за заголовок.

Спасибо.


azl   (2005-12-26 14:03:00) [1]

Да, действительно все работает. У меня ошибка была в том, что в событии OnMouseDown я писал вот как:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Pos := Point(x, y);
 ReleaseCapture;
 Perform (WM_SYSCOMMAND,SC_MOVE+2,0);
end;


Спасибо.


Fenik   (2005-12-25 23:42:00) [2]

uses Messages;


Fenik   (2005-12-25 23:40:00) [3]

> azl ©  (25.12.05 17:39) [3]
> Да, но это совершенно не работает.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;

type
 TForm1 = class(TForm)
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 private
   Pos: TPoint;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Pos := Point(x, y);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if ssLeft in Shift then
   SetBounds(Left - (Pos.x - x), Top - (Pos.y - y), Width, Height);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 ShowMessage('Yes!');
end;

end.


Все работает. Хватаю за форму левой кнопкой, таскаю, отпускаю - выскакивает сообщение 'Yes!'.


Antonn   (2005-12-25 18:09:00) [4]

да есть такая фигня, сам как то задавал вопрос. решения небыло, как то по другому решал...


azl   (2005-12-25 17:39:00) [5]


> Fenik ©


Да, но это совершенно не работает. Мало того, функция Pos здесь совершенно не причем. Я, конечно, изменял Pos на Pos1 (Pos1: TPoint);

Я заметил, что при первом способе OnMouseUp cрабатывает если делать щелчок правой кнопкой мыши.


azl   (2005-12-25 17:15:00) [6]

Спасибо большое


Fenik   (2005-12-25 16:28:00) [7]

procedure TFM.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Pos := Point(x, y);
end;

procedure TFM.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if ssLeft in Shift then
   SetBounds(Left - (Pos.x - x), Top - (Pos.y - y), Width, Height);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо