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

Вниз

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

 
HardClubber ©   (2003-06-02 01:22) [0]

Мастера!
Вопрос такой. Есть формочка, borderstyle := bsNone.
Хочу мышкой (левой кнопкой) таскать формочку по экрану, что бы не мерцало.
Пробовал так (не вышло):

var
MouseXOld, MouseYOld: integer;

procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseXOld := X; MouseYOld := Y;
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then begin
Form2.Left := X - MouseXOld + Form2.Left;
Form2.Top := Y - MouseYOld + Form2.Top;
MouseXOld := X; MouseYOld := Y;
end;
end;

Заранее благодарен


 
Rocker ©   (2003-06-02 02:52) [1]

Если у формы нет заголовка, но возможность двигать его должна остаться, то можно воспользоваться следующим примером.


private
procedure WMNCHITTEST(var Msg: TMessage); message WM_NCHITTEST;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle, GWL_STYLE,
GETWINDOWLONG(Handle, GWL_STYLE) and (not WS_CAPTION));
Height := ClientHeight;
end;

procedure TForm1.WMNCHITTEST(var Msg: TMessage);
begin
inherited;
Msg.Result := HTCAPTION;
end;


 
Думкин ©   (2003-06-02 05:48) [2]

procedure TMyForm.WMMouseDown;
begin
ReleaseCapture;
Perform(WM_SysCommand, $F012, 0)
end;


 
HardClubber ©   (2003-06-02 12:32) [3]

Не, это то понятно.... у меня форма двигается, только сильно мерцает, дёргается... и т.д.



 
HardClubber ©   (2003-06-02 16:23) [4]

Может её как то надо прятать, а потом показывать...


 
HardClubber ©   (2003-06-02 17:34) [5]

Эх... сам догадался... Вот один из вариантов, всё работает плавно и красиво :)

var
MouseXOld, MouseYOld: integer;

procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Mouse: TMouse;
begin
MouseXOld := Mouse.CursorPos.X; MouseYOld := Mouse.CursorPos.Y;
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Mouse: TMouse;
begin
if ssLeft in Shift then begin
Form2.Left := Form2.Left + (Mouse.CursorPos.X-MouseXOld);
Form2.Top := Form2.Top + (Mouse.CursorPos.Y-MouseYOld);
MouseXOld := Mouse.CursorPos.X;
MouseYOld := Mouse.CursorPos.Y;
end;
end;


 
LMD   (2003-06-02 22:22) [6]

А зачем так много всего? По-моему проще так:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
gPoint:=panel1.ClientToParent(Point(x,y),Form1);
Panel1.OnMouseMove:=Panel1MouseMove;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Form1.Top:=mouse.CursorPos.Y-gPoint.y;
Form1.left:=mouse.CursorPos.x-gPoint.x
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Panel1.OnMouseMove:=nil;
end;

Таким образом, если нажать на Panel1, то форма начнет перетаскиваться. Чуть экономится время на проверке условия if ssLeft in shift then, но код занимает чуть больше места.


 
LMD   (2003-06-02 22:24) [7]

Забыл: глобальная переменная gPoint
var
gPoint:TPoint


 
Думкин ©   (2003-06-03 06:12) [8]

То что оно дергается и мерцает - от кривых рук.
У всех работает как описано у меня и не дергается и не мерцает.
А если уж очень надо, то можно отключить прорисовку формы при перемещении.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
8-34940
DeveloperX
2003-02-28 22:58
2003.06.12
Визуализация


3-34742
Соловьев
2003-05-23 10:16
2003.06.12
Что с FireBird? кто сталкивался с траблой?


1-34781
The_Maxx
2003-06-02 12:20
2003.06.12
Запуск из программы файл *.pdf


1-34786
АлексейК
2003-06-02 08:28
2003.06.12
Использование DLL созданной в D7 для D5


3-34720
Rafik
2003-05-23 14:01
2003.06.12
Не соедениться с MSSQL