|
Вопрос # 700/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!
Такой вопрос у меня возник: хочу сделать так чтобы одна форма в проге примагничивалась к другой и к краям экрана, как это сделано в винампе, может кто занимался уже таким, мне бы идею как сделать или мож. уже готовые компоненты есть?
 |
Вопрос задал: Zotaper (статус: Посетитель)
Вопрос отправлен: 4 июля 2007, 15:16
Состояние вопроса: решён, ответов: 4.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Zotaper!
Делим задачу на три задачи.
1) отследить перемещение форму
2) узнать, пристаёт ли при данных координатах форма.
3) узнать положение других форм.
итак, по порядку.
1) в public части формы пишем
procedure WMMove(var msg:TMessage);message WM_MOVE;
жмём Ctrl+Shift+C
Делфи сделает обрабочик. Он будет вызываться, когда форма будет передвинута.
Узнать положение формы - просто - свойства Left и Top.
2) Размер экрана узнаём через Screen.Width и screen.height. Остается только добавить условия типа
if left<10 then left:=0;
только будте акуратны, так как можно смоделировать ситуацию, когда форма будет дёргаться вправо-влево:)
3) это тоже не сложно, но интересно.
узнать, сколько у нашего приложения форм - screen.FormCount
обратиться к какому то свойству формы - screen.Forms[1].Caption
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 июля 2007, 17:17
Оценка за ответ: 5
Комментарий к оценке: Отлично, будем пробовать, главное идея, а с остальным справимся :-)
|
Ответ #2. Отвечает эксперт: Градов Ю.М.
Здравствуйте, Zotaper!
В приложении привожу пример прилипания второй формы к первой:
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, Unit2;
-
- type
- TForm1 = class(TForm)
- procedure FormShow(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- { TForm1 }
-
- procedure TForm1.FormShow(Sender: TObject);
- begin
- Form2.Show;
- end;
-
- end.
-
- unit Unit2;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs;
-
- type
- TForm2 = class(TForm)
- private
- procedure WMWINFORMMOVE(var Msg: TWMWINDOWPOSCHANGING); message WM_WINDOWPOSCHANGING;
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form2: TForm2;
-
- implementation
-
- Uses Unit1;
-
- {$R *.dfm}
-
- { TForm2 }
-
- procedure TForm2.WMWINFORMMOVE(var Msg: TWMWINDOWPOSCHANGING);
- var
- rWorkArea: TRect;
- StickAt : Word;
- Docked: Boolean;
- begin
- Docked:=FALSE;
- SystemParametersInfo(SPI_GETWORKAREA, 0, @rWorkArea, 0);
- with Msg.WindowPos^ do
- begin
- if x <= rWorkArea.Left + StickAt then
- begin
- x := Form1.Left;
- y := Form1.Top + Form1.Height;
- Docked := TRUE;
- end;
- end;
- inherited;
- end;
-
- end.
-
-
 |
Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 4 июля 2007, 17:42
Оценка за ответ: 5
Комментарий к оценке: I'll try :-)
|
Ответ #3. Отвечает эксперт: Николай Рубан
Здравствуйте, Zotaper!
Хотелось бы еще дополнить ответы предыдущих экспертов.
Если Вам необходимо ТОЛЬКО прилипание формы к краям экрана, то есть стандартное свойство у объекта TForm - ScreenSnap, если его установить в TRUE, то если один из краев формы окажется на расстоянии, которое указано в свойстве SnapBuffer- то форма примагнитится к соответсвующему краю экрана. Если ScreenSnap = false - следовательно эффект отключен.
Для эффекта прилипания форм между собой смотрите предыдущие ответы либо почитайте статейку по ссылке http://delphiworld.narod.ru/base/sticky_windows.html.
Good Luck!!!
 |
Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 4 июля 2007, 21:51
Оценка за ответ: 5
Комментарий к оценке: ОК, это мне тоже подходит, бум пробовать!
|
Ответ #4. Отвечает эксперт: min@y™
Велосипед изобретён давно.
Вот готовые примеры:
http://www.codenet.ru/progr/delphi/stat/snap.php
http://rsdn.ru/article/files/Classes/StickyDlg.xml
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 5 июля 2007, 08:13
Оценка за ответ: 5
Комментарий к оценке: Спасибо большое!
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 2 сентября 2007, 16:52; участников в обсуждении: 2.
|
Pokemonchyk (статус: Посетитель), 2 сентября 2007, 16:49 [#1]:
а почему у моем делфи_6 нету "стандартное свойство у объекта TForm - ScreenSnap"?
|
|
Dron (статус: Студент), 2 сентября 2007, 16:52 [#2]:
Pokemonchyk: это свойство появилось только в Delphi 7.
С уважением.
|
31 января 2011, 19:17: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|