Форум: "Начинающим";
Текущий архив: 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]Ёпт... Сначала создают темы "как склеить", а потом расклеить не могут. Свистелки-перделки ü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]> задача очень интересная — согласен, но и сложная
Решение в лоб: ставите на форму таймер. При каждом тике запоминаете X и Y так, чтобы всегда помнить 3 последних позиции формы. При каждом тике смотрите — если x1>x2<x3 или x1<x2>x3 (и то же cамаое по Y) — то мышью «тряхнули». Считаете количество встрясок в секунду — если достаточное, то либо отцепляете форму, либо вызываете 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)
Если подойдет близко — надо записать форму в массив/ список (пока не решил)
Зачем 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-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