Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Склеить 2 формы

28.11.2010, 23:48. Показов 2537. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Ребята подскажите по такому вопросу

Можно ли как-нить склеить 2 формы чтобы было как в Винампе. Тоесть есть 2 формы, когда главная форма находитбся близко ко второй то они склеиваются и потом тягая за одну форму, тягается и другая.

Заранее благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2010, 23:48
Ответы с готовыми решениями:

Ребят, такое можно склеить?
Всех приветствую. В общем, проблема следующая... Хочу чтобы на форме, а именно в поле ввода (ну в данном случае оно является полем...

Склеить несколько строк в одну
Склеить несколько строк в одну. Помогите, у меня сделано, но есть где-то косяк.

Столбец StringGrid склеить в одну строку
Подскажите пожалуйста, в StringGrid введен текст(побуквенно в каждую ячейку), как в Edit2 выписать буквы из столбца, номер которого...

14
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
29.11.2010, 00:11
Могу посоветовать по Handle окна проводить эти операции

1) Получить HWND главной формы и узнать ее позицию
2) при перетаскивании второй формы определить на каком расстоянии они находятся

упс. не по HWND а просто узнать позиции (так как вторая форма Ваша)
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.11.2010, 00:21  [ТС]
Цитата Сообщение от Gremlin Посмотреть сообщение
(так как вторая форма Ваша)
Они обе мои так как это один проект
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
29.11.2010, 00:31
просто я не знаю, какое событие идет при движении формы,
поэтому двигаю ее за Клиентскую оюласть а не за заголовок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//---------------------------------------------------------------------------
void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    long SC_DRAGMOVE = 0xF012;
    if(Button == mbLeft)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    }
    int otstup = 25; // отступ, т.е. если Форма2 на расстоянии 25px от Форм1
 
    int f1_top = Form1->Top;
    int f1_left = Form1->Left;
    int f1_bottom = Form1->Top + Form1->Height;
    int f1_right = Form1->Left + Form1->Width;
 
    int f2_top = Form2->Top;
    int f2_left = Form2->Left;
    int f2_bottom = Form2->Top + Form2->Height;
    int f2_right = Form2->Left + Form2->Width;
 
    if(f2_left <= f1_right + otstup) // прилипание справа к Первой форме
    {
        Form2->Left = f1_right;
    }
}
//---------------------------------------------------------------------------
вот тут я делал прилипание к краям экрана когда то...
Прилипание формы к краям экрана как QIP например

проще говоря: много вычислять нужно...

Тема актуальна и интересна, так как я хотел такое сделать... но тогда опыта небыло
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.11.2010, 00:46  [ТС]
Цитата Сообщение от Gremlin Посмотреть сообщение
просто я не знаю, какое событие идет при движении формы,
поэтому двигаю ее за Клиентскую оюласть а не за заголовок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//---------------------------------------------------------------------------
void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    long SC_DRAGMOVE = 0xF012;
    if(Button == mbLeft)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    }
    int otstup = 25; // отступ, т.е. если Форма2 на расстоянии 25px от Форм1
 
    int f1_top = Form1->Top;
    int f1_left = Form1->Left;
    int f1_bottom = Form1->Top + Form1->Height;
    int f1_right = Form1->Left + Form1->Width;
 
    int f2_top = Form2->Top;
    int f2_left = Form2->Left;
    int f2_bottom = Form2->Top + Form2->Height;
    int f2_right = Form2->Left + Form2->Width;
 
    if(f2_left <= f1_right + otstup) // прилипание справа к Первой форме
    {
        Form2->Left = f1_right;
    }
}
//---------------------------------------------------------------------------
вот тут я делал прилипание к краям экрана когда то...
Прилипание формы к краям экрана как QIP например

проще говоря: много вычислять нужно...

Тема актуальна и интересна, так как я хотел такое сделать... но тогда опыта небыло
Голяк...................... Чёто ничё оно не прилипает. Вторая форма вообще куда исчезает
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
29.11.2010, 01:04
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//---------------------------------------------------------------------------
void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    long SC_DRAGMOVE = 0xF012;
    if(Button == mbLeft)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    }
    int otstup = 25; // отступ, т.е. если Форма2 на расстоянии 25px от Форм1
 
    int f1_top = Form1->Top;
    int f1_left = Form1->Left;
    int f1_bottom = Form1->Top + Form1->Height;
    int f1_right = Form1->Left + Form1->Width;
    /////////////////////////////////////
    int f2_top = Form2->Top - otstup;
    int f2_left = Form2->Left - otstup;
    int f2_bottom = Form2->Top + Form2->Height + otstup;
    int f2_right = Form2->Left + Form2->Width + otstup;
    // узнали с на каком расстоянии Форма2 от формы1 со всех сторон
    int rightX = (f2_left - f1_right); // расстояние справа
    int leftX = (f1_left - f2_right); // left
    int topX = (f1_top - f2_bottom); // top
    int bottomX = (f1_bottom - f2_top); // bottom
    // теперь нужно узнать, пересикется ли расстояние формы2 к форме1
    // для приклеивания
    if(f2_bottom >= f1_top && f2_top <= f1_bottom)
    {
        if(f2_right >= f1_left && f2_left <= f1_right)
        {
            // тут найти наименьшее число (по модулю),
            // то с той чтороны и прилепить
            //
            ShowMessage(
            AnsiString(rightX) + "\n" +
            AnsiString(leftX) + "\n" +
            AnsiString(topX) + "\n" +
            AnsiString(bottomX)
            );
        }
    }
}
//---------------------------------------------------------------------------
Вложения
Тип файла: zip amp.zip (527.4 Кб, 22 просмотров)
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.11.2010, 01:11  [ТС]
Не понятно что ты хотел этим показать, координаты показываются но форма не прилипает одна к другой
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
29.11.2010, 02:00
Вроде прилипает со всех сторон
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//---------------------------------------------------------------------------
void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    long SC_DRAGMOVE = 0xF012;
    if(Button == mbLeft)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    }
    int otstup = 25; // отступ, т.е. если Форма2 на расстоянии 25px от Форм1
 
    int f1_top = Form1->Top;
    int f1_left = Form1->Left;
    int f1_bottom = Form1->Top + Form1->Height;
    int f1_right = Form1->Left + Form1->Width;
    /////////////////////////////////////
    int f2_top = Form2->Top - otstup;
    int f2_left = Form2->Left - otstup;
    int f2_bottom = Form2->Top + Form2->Height + otstup;
    int f2_right = Form2->Left + Form2->Width + otstup;
    // узнали с на каком расстоянии Форма2 от формы1 со всех сторон
    int rightX = (f2_left - f1_right); // расстояние справа
    int leftX = (f1_left - f2_right); // left
    int topX = (f1_top - f2_bottom); // top
    int bottomX = (f1_bottom - f2_top); // bottom
    // теперь нужно узнать, пересикется ли расстояние формы2 к форме1
    // для приклеивания
    if(f2_bottom >= f1_top && f2_top <= f1_bottom)
    {
        if(f2_right >= f1_left && f2_left <= f1_right)
        {
            // НУ НЕЗНАЮ Я КАК МАССИВ ОТСОРТИРОВАТЬ ПО МОДУЛЮ =)
            // ПОЭТОМУ ПУСТЬ ТАК БУДЕТ
            if(abs(rightX) <= abs(leftX) && abs(rightX) <= abs(topX) && abs(rightX) <= abs(bottomX))
            {
                Form2->Left = Form1->Left + Form1->Width;
                // задать в переменную что приклеилось
            }
            else if(abs(leftX) <= abs(rightX) && abs(leftX) <= abs(topX) && abs(leftX) <= abs(bottomX))
            {
                Form2->Left = Form1->Left - Form2->Width;
                // задать в переменную что приклеилось
            }
            else if(abs(bottomX) <= abs(rightX) && abs(bottomX) <= abs(leftX) && abs(bottomX) <= abs(topX))
            {
                Form2->Top = Form1->Top + Form1->Height;
                // задать в переменную что приклеилось
            }
            else if(abs(topX) <= abs(rightX) && abs(topX) <= abs(leftX) && abs(topX) <= abs(bottomX))
            {
                Form2->Top = Form1->Top - Form2->Height;
                // задать в переменную что приклеилось
            }
            else
            {
                // Вторая часть вопроса:
                // ... и потом тягая за одну форму, тягается и другая ...
                //
                // место для глобально переменной, чтоб Первая Форма знала
                // приклеено ли к ней это окно или нет
                // тут задать что окно не приклеено
                //
                // И когда двигать Первую Форму->
                // если вторая приклеена то Двигать вместе с собой вторую
            }
        }
    }
}
//---------------------------------------------------------------------------

Не по теме:

Может если будет время продолжу... и сделаю через цикл: пробегать по всем окнам проекта

0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
29.11.2010, 04:22
движения Первой формы вместе со второй идею взял отсюда Перемещение двух форм одновременно
Вложения
Тип файла: zip amp.zip (890.6 Кб, 31 просмотров)
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.11.2010, 11:35  [ТС]
Ну вот это то, что надо спасибо тебе, а что борта специально убрал?
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
29.11.2010, 15:18
я не знаю как отловить сообщение когда форму двигают за ЗАГОЛОВОК, поэтому все это работает когда форму двигаю за ее "тело" (Поэтому борта и убрал, если за них перетаскивать то ничего не получается)

Склеивает >= 2 форм

тут я объявил для Form1
C++
1
void __fastcall TForm1::prilip(TForm * SendForm)
и потом просто в каждой форме прописать #include "Unit1.h"
и повесть на OnMouseDown
C++
1
2
3
ReleaseCapture();
SendMessage(this->Handle, WM_SYSCOMMAND, 0xF012, NULL);
Form1->prilip(this);
только меня шлейфы раздражают... либо из за цикла (хотя всего 3 формы в этом проекте) либо из за специфического передвижения...
Вложения
Тип файла: zip amp.zip (898.4 Кб, 15 просмотров)
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.11.2010, 17:10  [ТС]
Сейчас остаётся вопрос как реализовать когда тянуть за шапку формы, а не за её канву
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
29.11.2010, 17:14
Цитата Сообщение от Sasha Посмотреть сообщение
Сейчас остаётся вопрос как реализовать когда тянуть за шапку формы, а не за её канву
Полностью согласен!
Вот именно - как узнать, когда передвигают форму? через таймер - бессмысленно, Hook наверно нужно на WM_MOVE
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
01.12.2010, 04:41
Вобщем отлавливаю я на форме событие WM_MOVE
все как положено, за заголовок двигается, если приклеена форма то она вместе с главной шевелиться

где тут может быть ошибка - непойму
в цикле ясно прописано: если у формы Тэг == 1 то MoveWindow()
но это происходит только для той формы, которая была активна последней а вторая так, подрыгивается маленько и все!
(есть 3 формы, Форм1 главная, Форм2 и Форм3 дополнительные, если я кликну мышкой по форм3 то она быдет тащится а Форм2 - нет, и наоборот если клик по Форм2 то Форм3 тогда не хочет двигаться, или тоже самое в порядки их показа, та которая последней Form->Show() та и будет работать как нужно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    for(int i = 0; i < Screen->FormCount; i++)
    {
        if(Screen->Forms[i]->Showing)
        {
            if(Screen->Forms[i]->Handle != this->Handle)
            {
                // если форма приклеена то тащим за собой
                if(Screen->Forms[i]->Tag == 1)
                {
                    MoveWindow(
                    Screen->Forms[i]->Handle,
                    Screen->Forms[i]->Left + Form1->Left - old_x, // смещение по X
                    Screen->Forms[i]->Top + Form1->Top - old_y, // по Y
                    Screen->Forms[i]->Width,
                    Screen->Forms[i]->Height,
                    true
                    );
                }
                //else// посылаем всем окнам сообщение Что главная Форма двигается
                //{   // и чтоб если близко то приклеивались
 
                    //SendMessage(Screen->Forms[i]->Handle, WM_MOVE, NULL, NULL);
                    Prilipanie(Screen->Forms[i]);
                //}
            }
        }
    }
Вложения
Тип файла: zip !prilip.zip (908.7 Кб, 16 просмотров)
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
02.12.2010, 06:18
Меня эта тема прям за живое взяла...
вообщем не получилось у меня при перетаскивании за заголовок
таскать за Главной формой еще 2 формы - только одну

Вот тут красиво но только 2 формы... и подергиваются при прилипании... может WM_PAINT теперь нужно обрабатывать как то - незнаю

можно сказать чистый проект на 2 формы...
Вложения
Тип файла: zip !prilip.zip (890.1 Кб, 51 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.12.2010, 06:18
Помогаю со студенческими работами здесь

Склеить две строки и вывести в новое поле edit 3 в форме
есть два файла 1. Unit1.h extern string a; extern string b; extern string ss(string b, string a) { return a+b; } ...

Прозрачность формы, при наведении мыши на кнопку реализовать изменение её положения относительно формы с невозможностью выхода за границы формы
доброй ночи, уважаемые программисты, студенты,а также любители программировать. помогите, пожалуйста, написать программу на языке С++ ...

Склеить видеофайлы
Подскажите как склеить avi файлы c помощью ffmpeg, слышал про функцию cat но нигде не нашел как ее использовать в Win.

Склеить две формы в одну
Здравствуйте, просьба подсказать, возможно ли такое? и если да то каким образом реализуется? Две формы, в одной основная программа,...

Как склеить в php два текстовых поля формы post?
Не удается никак склеить два текстовых поля формы. Мне нужно чтобы в форме post было два текстовых поля message1 и message2 (в одной строке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru