Форум: "Начинающим";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];
ВнизВопросы с перемещением объектов по форме Найти похожие ветки
← →
Keba (2009-10-31 08:40) [0]У меня есть форма, в которой находятся 2 панели. Какждой из них я прописал следующее:
procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const sc_dragmove = $f012;
begin
releasecapture;
Menu.Perform(wm_syscommand, sc_dragmove, 0);
end;
Теперь их можно свободно перемещать их по форме нажав на них мышкой.
Первый вопрос:
Что и где нужно написать, чтобы при перемещении панелей они не выходили за границы формы и ктому же чтобы они (панели) сталкивались между собой.
Второй вопрос:
Что нужно сделать, чтобы объекты прилипали друг к другу и к краям самой формы.
Если кто не понял, что я имел в виду, то мне нужно сделать наподобие окон в фотошопе (инструменты, навигация, слои).
Пробовал с MDI, но там много заморочек.
Заранее спасибо за понимание и поддержку!
← →
AIK © (2009-10-31 10:49) [1]могу объяснить смысл алгоритма
> Первый вопрос:если панель1.края=форма1.края или панель1.края=панель2.края то
перемешения_панели:= лож;
> Второй вопрос:если панель1.Левый_край >= 5 то
панель1.Левый_крайЖ=0;
с правым краем чуть по сложнее но принцып тод же.
← →
AIK © (2009-10-31 10:52) [2]
> если панель1.Левый_край >= 5 то
> панель1.Левый_крайЖ=0;если панель1.Левый_край <= 5 то
панель1.Левый_край;=0;
Хотя не знаю, надо чуть намудрить так он может прилипнуть краю и не отлипнуть.
← →
Leonid Troyanovsky © (2009-10-31 12:11) [3]
> Keba (31.10.09 08:40)
By Peter Below:
type
TWmMoving = Record
Msg: Cardinal;
fwSide: Cardinal;
lpRect: PRect;
Result: Integer;
End;
TForm1 = class(TForm)
private
{ Private declarations }
docked : Boolean;
procedure WmMoving( Var msg: TWMMoving ); message WM_MOVING;
end;
var
Form1: TForm1;
{$R *.dfm}
implementation
procedure TForm1.WmMoving(var msg: TWMMoving);
var
r: TRect;
dx, dy: Integer;
pt: TPoint;
begin
SystemparametersInfo( SPI_GETWORKAREA, 0, @r, 0 );
// snap to nearest edge if closer that 20 pixels and not docked
dx:= 0;
dy:= 0;
With msg.lpRect^ Do Begin
If docked Then Begin
// prevent form from moving out of bounds
If left < r.Left Then
dx := r.left - left
Else If top < r.top Then
dy := r.top - top
Else If right > r.right Then
dx := r.right - right
Else If bottom > r.bottom Then
dy := r.bottom - bottom;
If (dx <> 0) or (dy <> 0) Then Begin
GetCursorPos( pt );
SetCursorPos( pt.x + dx, pt.y + dy );
Exit;
End;
End;
// check if form is inside snap limits of border
If Left <= (r.left+20) Then
dx:= r.left - left
Else If Top <= (r.top+20) Then
dy :=r.top - top
Else If Right >= (r.Right-20) Then
dx:= r.right - right
Else If Bottom >= (r.bottom - 20) Then
dy := r.Bottom - Bottom;
If (dx <> 0) or (dy <> 0) Then
// Is inside, dock if not already docked
If not docked Then Begin
docked := true;
GetCursorPos( pt );
SetCursorPos( pt.x + dx, pt.y + dy );
Exit;
End
Else
docked := False;
End; // With
inherited;
end;
I hope you know how to create a
message handler for the control class.
--
Regards, LVT.
← →
Keba (2009-10-31 14:57) [4]Leonid Troyanovsky
как это теперь добавить к Панели?
← →
Leonid Troyanovsky © (2009-10-31 16:59) [5]
> Keba (31.10.09 14:57) [4]
> как это теперь добавить к Панели?
http://www.podgoretsky.com/Redir.aspx?id=226&DownloadFile=~/ftp/Docs/Delphi/DX/PeterBelow.chm
See also topic: Moving components at runtime.
"I hope you know how to create a
message handler for the control class."
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c