Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 700

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Такой вопрос у меня возник: хочу сделать так чтобы одна форма в проге примагничивалась к другой и к краям экрана, как это сделано в винампе, может кто занимался уже таким, мне бы идею как сделать или мож. уже готовые компоненты есть?

Zotaper Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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!
В приложении привожу пример прилипания второй формы к первой:

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, Unit2;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. procedure FormShow(Sender: TObject);
  12. private
  13. { Private declarations }
  14. public
  15. { Public declarations }
  16. end;
  17.  
  18. var
  19. Form1: TForm1;
  20.  
  21. implementation
  22.  
  23. {$R *.dfm}
  24.  
  25. { TForm1 }
  26.  
  27. procedure TForm1.FormShow(Sender: TObject);
  28. begin
  29. Form2.Show;
  30. end;
  31.  
  32. end.
  33.  
  34. unit Unit2;
  35.  
  36. interface
  37.  
  38. uses
  39. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  40. Dialogs;
  41.  
  42. type
  43. TForm2 = class(TForm)
  44. private
  45. procedure WMWINFORMMOVE(var Msg: TWMWINDOWPOSCHANGING); message WM_WINDOWPOSCHANGING;
  46. { Private declarations }
  47. public
  48. { Public declarations }
  49. end;
  50.  
  51. var
  52. Form2: TForm2;
  53.  
  54. implementation
  55.  
  56. Uses Unit1;
  57.  
  58. {$R *.dfm}
  59.  
  60. { TForm2 }
  61.  
  62. procedure TForm2.WMWINFORMMOVE(var Msg: TWMWINDOWPOSCHANGING);
  63. var
  64. rWorkArea: TRect;
  65. StickAt : Word;
  66. Docked: Boolean;
  67. begin
  68. Docked:=FALSE;
  69. SystemParametersInfo(SPI_GETWORKAREA, 0, @rWorkArea, 0);
  70. with Msg.WindowPos^ do
  71. begin
  72. if x <= rWorkArea.Left + StickAt then
  73. begin
  74. x := Form1.Left;
  75. y := Form1.Top + Form1.Height;
  76. Docked := TRUE;
  77. end;
  78. end;
  79. inherited;
  80. end;
  81.  
  82. end.
  83.  
  84.  


Ответ отправил: Градов Ю.М. (статус: 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

Pokemonchyk (статус: Посетитель), 2 сентября 2007, 16:49 [#1]:

а почему у моем делфи_6 нету "стандартное свойство у объекта TForm - ScreenSnap"?
Dron

Dron (статус: Студент), 2 сентября 2007, 16:52 [#2]:

Pokemonchyk: это свойство появилось только в Delphi 7.
С уважением.

31 января 2011, 19:17: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.02 сек.