Главная страница
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.054 c
11-1107283638
Sphinxx
2005-02-01 21:47
2005.09.25
Как опросить компоненты на форме?


6-1117738965
GEEK
2005-06-02 23:02
2005.09.25
Кто работал с idHttpProxyServer? Ошибка вощем...


5-1100761074
Stanislav
2004-11-18 09:57
2005.09.25
Не создаеься потомок Tcollectionitem


14-1125657919
erika
2005-09-02 14:45
2005.09.25
Поиск AVI


14-1125863274
Кэш третьего уровня
2005-09-04 23:47
2005.09.25
сетевое администрирование