Главная страница
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.047 c
1-1125436052
SergProger
2005-08-31 01:07
2005.09.25
Перетаскивание формы


5-1100244969
Суслик
2004-11-12 10:36
2005.09.25
Runtime package


1-1125568760
ssmaxx
2005-09-01 13:59
2005.09.25
Ошибка #36 при работе с jpeg


4-1122578548
Galiaf
2005-07-28 23:22
2005.09.25
Простенький файловый менеджер.


14-1125377598
stud
2005-08-30 08:53
2005.09.25
литература по SQL SERVER 2000