Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

расклейка форм [D7]


Просто Фан ©   (2012-07-04 03:21:00) 

Добрый день народ. Нужна ваша помощь в одном дельце. У меня есть три формы и они склеиваются между собой пример внизу

procedure TForm2.WMMove(var Msg: TWMMove);
 begin
 try
  if Assigned(Form3) then
   begin
    if abs(Form2.Left+Form2.Width-Form3.Left)<300 then //лево
     begin
      Form3.Left:=Form2.Left+((Form2.Width div 2)+50);
      Form3.Top:=Form2.Top;
     end;
    if abs(Form3.Left+Form3.Width-Form2.Left)<300 then    //право
     begin
      Form3.Left:=Form2.Left-((Form3.Width div 2)+50);
      Form3.Top:=Form2.Top;
     end;

    if abs(Form2.Left+Form2.Width-Form4.Left)<300 then //лево
     begin
      Form4.Left:=Form2.Left+((form2.Width div 2)+50);
      Form4.Top:=Form2.Top;
     end;
    if abs(Form4.Left+Form4.Width-Form2.Left)<300 then    //право
     begin
      Form4.Left:=Form2.Left-((form4.Width div 2)+50);
      Form4.Top:=Form2.Top;
      end;
   end;
 except
 end;  
 end;

procedure TForm3.WMMove(var Msg: TWMMove);
 begin
 try
 if Assigned(Form2) then
  begin
   if abs(Form2.Left+Form2.Width-Form3.Left)<300 then   //право
    begin
     Form2.Left:=Form3.Left-((form2.Width div 2)+50);
     Form2.Top:=Form3.Top;
    end;
   if abs(Form3.Left+Form3.Width-Form2.Left)<300 then //лево
    begin
     Form2.Left:=Form3.Left+((form3.Width div 2)+50);
     Form2.Top:=Form3.Top;
    end;
  end;
  if Assigned(Form4) then
    if abs(Form3.Left+Form3.Width-Form4.Left)<300 then //лево
     begin
      Form4.Left:=Form3.Left+((form3.Width div 2)+50);
      Form4.Top:=Form3.Top;
     end;
    if abs(Form4.Left+Form4.Width-Form3.Left)<300 then    //право
     begin
      Form4.Left:=Form3.Left-((form4.Width div 2)+50);
      Form4.Top:=Form3.Top;
      end;
  except
  end;
 end;

procedure TForm4.WMMove(var Msg: TWMMove);
 begin
  try
   if Assigned(Form2) then
   begin
    if abs(Form4.Left+Form4.Width-Form2.Left)<240 then //лево
    begin
     Form2.Left:=Form4.Left+((form4.Width div 2)+50);
     Form2.Top:=Form4.Top;
    end;
    if abs(Form2.Left+Form2.Width-Form4.Left)<240 then    //право
    begin
     Form2.Left:=Form4.Left-((form2.Width div 2)+50);
     Form2.Top:=Form4.Top;
    end;
   end;

  if Assigned(Form3) then
  begin
   if abs(Form3.Left+Form3.Width-Form4.Left)<240 then   //право
   begin
    Form3.Left:=Form4.Left-((form3.Width div 2)+50);
    Form3.Top:=Form4.Top;
   end;
   if abs(Form4.Left+Form4.Width-Form3.Left)<240 then //лево
   begin
    Form3.Left:=Form4.Left+((form4.Width div 2)+50);
    Form3.Top:=Form4.Top;
   end;
  end;
  except
 end;
end;


Но я не могу расклеить их - предполагается сделать так. Пользователь выбрал и удерживая ЛК мыши начинает быстро её двигать(хаотичное движение похожее на встряхивание) и форма отлипнет от уже сущ. склейки. ВОт как мне это реализовать или если кто хочет заработать круглую суму стучите на почту gleb.lucenko@mail.ru


Сергей М.   (2012-07-07 22:37:00) [1]

> адаптируем под свои нужды и будет отлично

Это делать мне смешно.


AV   (2012-07-06 19:30:00) [2]


> Просто ФАН   (06.07.12 17:59) [18]

да не за что,
не отчет бы - дописал


Просто ФАН   (2012-07-06 17:59:00) [3]

AV спасибо за совет и помощь - адаптируем под свои нужды и будет отлично.


AV   (2012-07-06 15:11:00) [4]


> эм... он у меня не запустился можете просто ехе файл дать
> мне?

http://zalil.ru/33546311
в виде - в каком бросил.


Просто Фан   (2012-07-05 12:11:00) [5]

хм... хорошее предложение, но увы не смогу реализовать в коде


***   (2012-07-05 08:10:00) [6]

> [12] AV ©   (04.07.12 17:35)
Если подойдет близко — надо записать форму в массив/ список (пока не решил)

Зачем List? Исходя из того, как задача поставлена, нам требуется, чтобы формы сцеплялись и расцеплялись. Чтобы формы было удобно расцепить, они должны аккуратно сцепляться (а если делать сложную иерархию сцепленных форм спомощью List, этого будет сложно добиться). Достаточно, чтобы каждая форма могла иметь ссылку на одну прицепленную к ней форму (а та в свою очередь — ссылку на третью и т.д.) Тогда формы будут сцепляться, образовывая цепочки. Это удобно, т.к. такая цепочка будет выглядеть на экране аккуратно (каждая следующая форма в цепочке будет лежать немного ниже и правее предыдущей). Тогда ни одна форма не будет полностью перекрыта другой и каждую форму можно будет ухватить за заголовок и отцепить. А если обнаружим, что форма «B» из цепочки A-B-C расположена близко к форме «D» из цепочки D-E-F, то сцепим их и получим A-B-D-E-F-C.

А вот если бы автору вопроса нужно было сцеплять формы по бордюрам, то было бы другое дело, и пришлось бы не только списки использовать, но еще и свободные части бордюров где-то хранить, но автор сцепляет формы проще: Form3.Left:=Form2.Left+((Form2.Width div 2)+50);


Просто Фан   (2012-07-04 23:12:00) [7]

Видно же что человек и понимает(код привел, тем более мы помним как этот код рождался тут :)), и не жмот, сразу деньги предлагает
- я с таких не беру :)
если и возьмусь, то бесплатно

эээ... я его сам додумал не надо бочку гнать на мои мозги их хотя немного, но все же они есть и работают.


Просто Фан   (2012-07-04 23:11:00) [8]

эм... он у меня не запустился можете просто ехе файл дать мне?


AV   (2012-07-04 17:35:00) [9]

сегодня не буду делать :)
что-то устал
если тока завтра

что заметил - у тебя там по моему только с одной стороны если форму подводишь работает склейка.

Набросал пока так
http://zalil.ru/upload/33538549
Пока даже не склеивается, но
1. любая таскаемая форма сообщает о себе всем другим формам
2. они знают расстояние до нее, и подходит ли она сверху или снизу.
// to do 3. Если подойдет близко - надо записать форму в массив/ список (пока не решил), подтянуть вплотную(ее left|top поменять).
// to do 4. Когда нас таскают - надо таскать все формы, которые записаны в массиве/ списке
// to do 5. Когда нас таскают интенсивно - надо очистить массив/ список и никого за собой таскать не придется. Т.е. мы отклеились.


AV   (2012-07-04 15:20:00) [10]

да беритесь кто хотите :)

Видно же что человек и понимает(код привел, тем более мы помним как этот код рождался тут :)), и не жмот, сразу деньги предлагает
- я с таких не беру :)
если и возьмусь, то бесплатно


***   (2012-07-04 14:53:00) [11]

> [9] Просто Фан   (04.07.12 14:42)

Ok. Вечером напишу вам письмо тогда (если AV © к тому времени не возъмется за задачу).


Просто Фан   (2012-07-04 14:42:00) [12]

хм ну пока он со мной еще не списывался)


***   (2012-07-04 14:38:00) [13]

> [7] Просто Фан   (04.07.12 14:34)

AV уже изъявил желание попробовать. Не буду перебивать. Проф. этика должна же быть :)


Просто Фан   (2012-07-04 14:34:00) [14]

*** - если вы мне это сделаете то будет отлично - только без всяких кнопок и сообщений, разумеется я вам оплачу работу


***   (2012-07-04 14:20:00) [15]

> задача очень интересная — согласен, но и сложная

Решение в лоб: ставите на форму таймер. При каждом тике запоминаете X и Y так, чтобы всегда помнить 3 последних позиции формы. При каждом тике смотрите — если x1>x2


Просто Фан   (2012-07-04 12:12:00) [16]

задача очень интересная - согласен, но и сложная


AV   (2012-07-04 10:08:00) [17]


> если кто хочет заработать круглую суму

самая круглая сумма - 0
в любой системе исчисления :)

Думаю тут надо завести что-то TBaseForm,
с проперти CanGlue: boolean;
списком указателей на приклеенные формы
методом Moving
а от него остальные формы

Если день выдастся ненапряжный - вечерком гляну. В принципе, интересно..


AV   (2012-07-04 10:03:00) [18]

А зачем это все? Просто так? Для тренировки?
Не знаю кому нравится, когда что-то клеится без ведома.. Меня так вообще бесит :)


AV   (2012-07-04 10:00:00) [19]

форма должна иметь проперти CanGlue: boolean;
которое выставляется в false, если

> Пользователь выбрал и удерживая ЛК мыши начинает быстро
> её двигать(хаотичное движение похожее на встряхивание)

далее в условиях
if abs(FormX.Left  .... FormY.Left)<240
добавить and (FormX.CanGlue) and (FormY.CanGlue)

При отпускании ЛК мыши проперть опять становится true


Давайте будем жрать!   (2012-07-04 07:41:00) [20]

Ёпт... Сначала создают темы "как склеить", а потом расклеить не могут. Свистелки-перделки über alles! Ура!


Наверх

Титульная страница Поиск, карта сайта Написать письмо