Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передвижение окон. 
V
    Опции темы
Pentium02
Дата 13.8.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Короче надо сделать так, знаете в винампе, когда подносишь окно плейлиста к окну плеера, оно какбы примагничивется к окну плеереа, и при двежение окна плеера, окно плейлиста двигается вместе с ним, как замутить такую штуку?
PM MAIL WWW ICQ   Вверх
Klose
Дата 13.8.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.7.2006
Где: Каменск-Уральский

Репутация: нет
Всего: нет



http://delphi.about.com/od/formsdialogs/l/aa070301a.htm

Вот тут вродиб то , что надо.
В drkb эта статья на русском есть.
PM MAIL ICQ   Вверх
Pentium02
Дата 13.8.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Нашёл в drkb но не то, там прилипание к краям экрана. Ща попробую прилипать к форме.

Вот код из drkb 


Код

procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
var
 WorkArea: TRect;
 StickAt : Word;
begin
 StickAt := 10;
 SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
 with WorkArea, Msg.WindowPos^ do
 begin
 // Сдвигаем границы для сравнения с левой и верхней сторонами
 Right:=Right-cx;
 Bottom:=Bottom-cy;
 if abs(Left - x) <= StickAt then x := Left;
 if abs(Right - x) <= StickAt then x := Right;
 if abs(Top - y) <= StickAt then y := Top;
 if abs(Bottom - y) <= StickAt then y := Bottom;
 end;
 inherited;
end;


Но чёт мозг не варит. Как прилипать к форме


Это сообщение отредактировал(а) Pentium02 - 13.8.2006, 22:02
PM MAIL WWW ICQ   Вверх
Fedia
Дата 14.8.2006, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Pentium02, этот код позволит осуществить прилипание активной формы (в моем примере это Form1), ко всем остальным формам проекта:

Код

procedure TForm1.WMMove(var Message: TMessage);
const
  DeltaStick = 15;
var
  i, delta, left, top: integer;
begin
  if Screen.FormCount>1 then
  begin
    left:=Screen.ActiveForm.Left;
    Top:=Screen.ActiveForm.Top;
    for i:=0 to Screen.FormCount -1 do
    if Screen.Forms[i].Handle <> Screen.ActiveForm.Handle then
    begin
      //передвигаем вверх, если
      delta:=Screen.ActiveForm.Top - (Screen.Forms[i].Top +
        Screen.Forms[i].Height);
      if abs(delta) < DeltaStick then
      Top:=Top - delta;

      //передвигаем вниз, если
      delta:=Screen.Forms[i].Top - (Screen.ActiveForm.Top +
        Screen.ActiveForm.Height);
      if abs(delta) < DeltaStick then
      Top:=Top + delta;

      //передвигаем влево, если
      delta:=Screen.ActiveForm.Left - (Screen.Forms[i].Left +
        Screen.Forms[i].Width);
      if abs(delta) < DeltaStick then
      Left:=Left - delta;

      //передвигаем вправо, если
      delta:=Screen.Forms[i].Left - (Screen.ActiveForm.Left +
        Screen.ActiveForm.Width);
      if abs(delta) < DeltaStick then
      Left:=Left + delta;

      if (Left<>Screen.ActiveForm.Left) or (Top<>Screen.ActiveForm.Top) then
      SetWindowPos(Screen.ActiveForm.Handle, HWND_TOP, Left, Top, 0, 0,
         SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
    end;
  end;
end;



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pentium02
Дата 14.8.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Fedia
Да. Если форма одна, то она липнет к другой, НО если форм несколько, и мне надо, чтобы каждая форма могла липнуть к любой другой. Я пытался использовать приложеный тобой код к каждой формы, но были глюки, например я двигаю форму к другой, и её начинает дёргать. 
PM MAIL WWW ICQ   Вверх
Fedia
Дата 14.8.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Pentium02, 
Код

      if (Left<>Screen.ActiveForm.Left) or (Top<>Screen.ActiveForm.Top) then    
      SetWindowPos(Screen.ActiveForm.Handle, HWND_TOP, Left, Top, 0, 0,    
         SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
 замени на
Код

      if (Left<>Screen.ActiveForm.Left) or (Top<>Screen.ActiveForm.Top) then
      begin    
        SetWindowPos(Screen.ActiveForm.Handle, HWND_TOP, Left, Top, 0, 0,    
           SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
        break;
      end;



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pentium02
Дата 14.8.2006, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Всё пашет, кроме одного, при движении формы надо, чтобы прилепленая форма двигалась месте с ней.
P.S. Я вас ещё не достал?

Это сообщение отредактировал(а) Pentium02 - 14.8.2006, 02:00
PM MAIL WWW ICQ   Вверх
Fedia
Дата 14.8.2006, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Избежать использования глобальных переменных не удалось. В итоге получился этот монстр smile :
Код

var
  Form1: TForm1;
  OldTop, OldLeft: integer;
  IsMoved: Boolean;

implementation

uses Unit2, Unit3, Unit4, Unit5;

{$R *.dfm}

{ TForm1 }

procedure TForm1.WMMove(var Message: TMessage);
const
  DeltaStick = 20;
var
  i, delta, Left, Right, Top, Bottom: integer;

  function GetNewFormPosition(i, FDelta: integer): Boolean;
  var
    FLeft, FTop: integer;
  begin
    Result:=false;
    if (FDelta in [0,1]) and (not IsMoved) then
    begin
      FLeft:=Screen.Forms[i].Left + Left - OldLeft;
      FTop:=Screen.Forms[i].Top + Top - OldTop;
      SetWindowPos(Screen.Forms[i].Handle, HWND_TOP, FLeft, FTop, 0, 0,
         SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
      Result:=true;
    end;
  end;
begin
  if inMove then
  exit;
  if Showing and (Screen.FormCount>1) then
  begin
    inMove:=true;
    Left:=Screen.ActiveForm.Left;
    Right:=left + Screen.ActiveForm.Width;
    Top:=Screen.ActiveForm.Top;
    Bottom:=Top + Screen.ActiveForm.Height;
    for i:=0 to Screen.FormCount -1 do
    if (Screen.Forms[i].Handle <> Screen.ActiveForm.Handle) and
      (Screen.Forms[i].Showing) then
    begin
      if (Left < Screen.Forms[i].Left + Screen.Forms[i].Width) and
        (Right > Screen.Forms[i].Left) then
      begin
        //передвигаем вверх, если
        delta:=Top - (Screen.Forms[i].Top + Screen.Forms[i].Height);
        if not GetNewFormPosition(i, delta - Top + OldTop) then
        if (delta < DeltaStick) and (delta>0) then
        Top:=Top - delta;

        //передвигаем вниз, если
        delta:=Screen.Forms[i].Top - (Top + Screen.ActiveForm.Height);
        if not GetNewFormPosition(i, delta - OldTop + Top) then
        if (delta < DeltaStick) and (delta>0) then
        Top:=Top + delta;
      end;

      if (Top < Screen.Forms[i].Top + Screen.Forms[i].Height) and
        (Bottom > Screen.Forms[i].Top) then
      begin
        //передвигаем влево, если
        delta:=Left - (Screen.Forms[i].Left + Screen.Forms[i].Width);
        if not GetNewFormPosition(i,  delta - Left + OldLeft) then
        if (delta < DeltaStick) and (delta>0) then
        Left:=Left - delta;

        //передвигаем вправо, если
        delta:=Screen.Forms[i].Left - (Left + Screen.ActiveForm.Width);
        if not GetNewFormPosition(i,  delta - OldLeft + Left) then
        if (delta < DeltaStick) and (delta>0) then
        Left:=Left + delta;
      end;

      if (Left<>Screen.ActiveForm.Left) or (Top<>Screen.ActiveForm.Top) then
      begin
        IsMoved:=true;
        SetWindowPos(Screen.ActiveForm.Handle, HWND_TOP, Left, Top, 0, 0,
           SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
        IsMoved:=false;
        break;
      end
    end;
    OldTop:=Screen.ActiveForm.Top;
    OldLeft:=Screen.ActiveForm.Left;
    inMove:=false;
  end;
end;


1. inMove - глобальная переменная, видимая во всех модулях с процедурой WMMove
2. Во всех модулях, кроме, содержащего код главной формы, лучше закомментировать процедуру GetNewFormPosition, иначе формы не отлепишь друг от друга smile


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Pentium02
Дата 14.8.2006, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Спасибо огромное!!!!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.