| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |