Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

расклейка форм   Найти похожие ветки 

 
Просто Фан   (2012-07-04 03:21) [0]

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

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-04 07:41) [1]

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


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

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

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

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

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


 
AV ©   (2012-07-04 10:03) [3]

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


 
AV ©   (2012-07-04 10:08) [4]


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

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

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

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


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

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


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

> задача очень интересная &#151; согласен, но и сложная

Решение в лоб: ставите на форму таймер. При каждом тике запоминаете X и Y так, чтобы всегда помнить 3 последних позиции формы. При каждом тике смотрите &#151; если x1>x2<x3 или x1<x2>x3 (и то же cамаое по Y) &#151; то мышью &laquo;тряхнули&raquo;. Считаете количество встрясок в секунду &#151; если достаточное, то либо отцепляете форму, либо вызываете 911 для пользователя. Конечно, лучше делать не через таймер а через системные сообщения (хотя тогда придется фильтровать мелкие встряски, так что таймер может быть будет еще и удобнее) и запоминать больше позиций, а не 3, но суть от этого не меняется...

PS: кстати, в Windows 7, если потрясти окном с папкой, то закроются все остальные окна (видимо, сделано в рассчете на вконец разозлившегося, запутавшегося в окнах человека). Может быть имеет смысл придерживаться их стандарта, а на форму добавить 2 кнопки: сцепить и отцепить? Будет кошернее. Кроме того для пользователей, которые только начинают работать мышкой, так будет проще.


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

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


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

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

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


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

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


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

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

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


 
AV ©   (2012-07-04 15:20) [11]

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

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


 
AV ©   (2012-07-04 17:35) [12]

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

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

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


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

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


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

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

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


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

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

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

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


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

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


 
AV ©   (2012-07-06 15:11) [17]


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

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


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

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


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


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

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


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

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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.078 c
2-1342008651
Handler
2012-07-11 16:10
2013.03.22
const


2-1342633944
Nilman
2012-07-18 21:52
2013.03.22
Фон StringGrid вне ячеек


11-1244317439
Lirk
2009-06-06 23:43
2013.03.22
Вариант решения проблемы...


2-1337243492
TStas
2012-05-17 12:31
2013.03.22
Как установить отступ в ричэдите у всех абзацев?


15-1331627201
advise
2012-03-13 12:26
2013.03.22
Подскажите на каих ресурсах можно найти программиста Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский