Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

Перетаскивание формы   Найти похожие ветки 

 
SergProger ©   (2005-08-31 01:07) [0]

Всем привет! Вот такая у меня опять проблема: есть процедура

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
const
 SC_DragMove = $F012;
begin
 ReleaseCapture;
 perform(WM_SysCommand, SC_DragMove, 0);
end;

перетаскивание проичходит, но иногда(!) и правой кнопкой мыши можно перетащить, а когда вообще форма прилипает к курсору мыши, т.е. даже при отпущенной кнопке мыши форма не отстаёт от от курсора. Помогите доработать процедуру!


 
Джо ©   (2005-08-31 01:11) [1]


> и правой кнопкой мыши можно перетащить,

Ну, так if Button = mbLeft then.


 
SergProger ©   (2005-08-31 01:48) [2]

Джо, но заметь, что иногда, тем более, что не должно реагировать.


 
wicked ©   (2005-08-31 02:05) [3]

добрый совет - не заморачиваться с полулегальными-полудокументированными способами, а просто обрабатывать сообщение WM_NCHITTEST.... никогда не подводило....


 
SergProger ©   (2005-08-31 02:20) [4]

Пробовал, но не даёт вылезти PopupMemu. Посмотрите, может, опять чего-нибудь намудрил:

type
 TForm1 = class(TForm)
   ...
 private
   procedure DragWindow(var M: TWMNCHitTest); message WM_NCHitTest;
 public
 end;

implementation

procedure TForm1.DragWindow(var M: TWMNCHitTest);
begin
 inherited;
 if M.Result=htClient then
 M.Result:=htCaption;
end;


 
wicked ©   (2005-08-31 02:54) [5]

ясен пень, что не даст... что код делает то?... проверяет, находится ли мышь над клиентской областью, и если это так, то возвращает системе, что курсор то над заголовком...
решения - системные:
1) сделать "пятна" на форме, где обработчик сообщения для курсора, находящегося над клиентской частью формы, будет честно об этом сообщать виндовсу.....
2) ловить и обрабатывать самостоятельно клики правой кнопкой мыши... требует заведения флажка "настоящий-хит-код-который-нам-вернули"... соотв., обработчик кликов правой кнопкой должен проверять этот флажок на то, действительно ли курсор мыши находился над клиентской частью формы....

ЗЫ звиняйте за сумбур - спать охота очень.....


 
SergProger ©   (2005-08-31 05:12) [6]

Ладно, не обижаюсь, у самого глаза красные, можно сказать, мы - братья по "оружию", но исходный код стал выглядеть примерно так:

var
 DownButton: Boolean;
 Cur: TPoint;

procedure TForm1.FormMouseDown(...);
begin
 If Button=mbLeft then begin
   DownButton:=True;
   Cur.X:=X;
   Cur.Y:=Y;
 end;
end;

procedure TForm1.FormMouseUp(...);
begin
 DownButton:=False;
end;

procedure TForm1.FormMouseMove(...);
begin
 If DownButton then begin
   Form1.Left:=Form1.Left+X-Cur.X;
   Form1.Top:=Form1.Top+Y-Cur.Y;
 end;
end;

Работает отлично, без глюков и головной боли. Всем большое спасибо, тема закрыта.



Страницы: 1 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
14-1125475004
12DFBDDh
2005-08-31 11:56
2005.09.25
Никлас Вирт Паскаль и его потомки (интервью)


1-1125898664
leonidus
2005-09-05 09:37
2005.09.25
Как обновить TEdit


3-1123748480
topmoz
2005-08-11 12:21
2005.09.25
Запрос на запись в таблицу


1-1125586034
RzCoDer
2005-09-01 18:47
2005.09.25
NT сервисы


2-1124022167
bogdan
2005-08-14 16:22
2005.09.25
копирование каталогов с содержимым