Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/33: Рейтинг темы: голосов - 33, средняя оценка - 4.97
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10

Отображение формы(или фрейма) в компании с другой модальной формой.

04.01.2012, 00:04. Показов 6450. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
Такое затруднение приключилось: есть форма условно основная, по событию над ней отображается вторая форма методом ShowModal(), так вот, как можно вместе со второй, модальной формой одновременно отображать и использовать третью форму, ну, или фрейм - что угодно.

При этом основная форма пользователю доступна быть не должна, хотя и должна быть видна на заднем плане, а вторая, модальная, и третья формы пользователю должны быть доступны обе одновременно. Еще, если это имеет значение в рамках данной задачки, все формы отображаются в стиле fsStayOnTop.

Так и сяк пробовал - из-за ShowModal(), блин, ничего не выходит...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2012, 00:04
Ответы с готовыми решениями:

Проблемы с модальной формой
Проблема такая. Во время загрузки основной формы надо показать модальную(например для выбора пользователя). Вызываю модальную форму...

Вызов модальной формы из модальной, нужно:закрытие последней и не закрытие первой.
1. Вызываю модальную форму из главной формы (немодальной). 2. Вызываю другую модальную форму из первой (п.1) модальной формы. 3....

Как общаться с модальной формой Excel?
Доброго времени суток Проблемка следующая есть файл шаблон в нем куча макросов в файле запаролен VBA и по поставлена защита на...

16
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.01.2012, 00:13
на то форма и модальная, чтобы ей ничто не мешало, имхо, да и все три формы в стиле fsStayOnTop - тоже круто.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.01.2012, 00:35  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
на то форма и модальная, чтобы ей ничто не мешало
То бишь, такой возможности нет, поскольку ее, по идее, и быть не должно?
Может, я не знаю, новый поток создать параллельно? Поможет?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.01.2012, 03:34
зависит - какая задача - я когда-то делал так: одна форма при открытии сворачивается в трей (или на панель задач) без отображения, две другие - полностью независимые формы, для отображения одновременно двух этих форм достаточно указать им соотвествующие параметры и координаты при открытии, работать можно с двумя формами одновременно, переключаясь между ними как и между другими окнами.

Добавлено через 1 час 44 минуты
Немодально запустить из одной формы другую

В Form1 в обработчике кнопки (или другом) : Form2->Show().
Чтобы Form2 не терялась, сделать ее StayOnTop.

Обратится из одной модальной формы к другой - не активной (не помню, есть ли это в билдере).
Pascal
1
2
3
4
5
procedure ShowAlmostModal(FormModal : TForm);
begin
  Form.Enabled :=False;
  FormModal.ShowModal
end;
И вот это - на OnShow почти модальной фоpмы
Pascal
1
2
3
4
procedure FormShow(Sender : Tobject);
begin
  Form.Enabled :=True;
end;
Как работать с модальной формой и стилем fsStayOnTop

В Delphi 2 (Windows 95 и Windows NT 4.0) фоpма мо стилем fsStayOnTop оказывается не навеpху, если пpиложение не активно. Как это испpавить?

Маленькая поправочка. В Win'95 или Win NT 4.0 фокус не пройдет. В том случае если приложение не активно (not foreground), формочка благополучно скроется под другими приложениями. Лечится вызовом 2-х функций в OnShow
Pascal
1
2
SetForegroundWindow(Form1.Handle);
SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE)
О модальных формах

Формы приложения могут быть модальными и немодальными.
Главной характерной особенностью модальной формы является то, что она приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь ее не закроет. Кроме того модальная форма не позволяет пользователю переключить фокус курсором мыши на другие формы данного приложения, пока модальная форма не будет закрыта. В результате пользователь должен выполнить определенные действия, предлагаемые модальной формой, прежде чем сможет далее продолжить работу с приложением.

В качестве модальной могут выступать формы типа AboutBox, различного рода справочники и т.д. Разработчик приложения в зависимости от задач, которые должна решить форма, должен сам определить, будет она модальной или же немодальной.

Остановимся подробнее на модальной форме.

Поведение модальной формы определяется ее основным свойством ModalResult, доступным только во время выполнения. При открытии формы методом ShowModal свойство ModalResult=0. Как только в результате каких-либо определенных событий на форме свойству ModalResult будет присвоено положительное целое значение (в зависимости от версии C++ Builder) от 1 до 8 (для 5 версии) и до 10 (для 6 версии), модальная форма закроется и пользователь продолжит работу с приложением. Численные значения и константы им соответствующие можно посмотреть во встроенной справке C++ Builder.

Модальную форму можно создать и удалить в той же области действия, что гарантированно предотвратит утечку памяти. Для этого форма не должна создаваться автоматически. С этой целью необходимо удалить ее из списка AutoCreate Forms вкладки Forms диалогового окна Project->Options. Затем из файла с расширением .cpp удаляется или комментируется строка:
C++
1
TFormX * FormX;
а из файла с расширением .h удаляется или комментируется строка:
C++
1
extern PACKAGE TFormX * FormX;
Для использования модальной формы создается следующая конструкция:
C++
1
2
3
4
5
6
7
8
9
 TFormX * FormX = new TFormX(0);
try
{
  FormX->ShowModal();
}
__finally
{
  delete FormX;
}
Использование блока try/__finally гарантирует защищенность кода при возникновении исключительной ситуации, т.е. в случае исключительной ситуации форма будет удалена.

Не стоит применять код вида:
C++
1
2
3
TFormX * FormX = new TFormX(0);
FormX->ShowModal();
delete FormX;
Причина - если исключительная ситуация возникнет между событиями создания и удаления формы, то эта форма никогда не будет удалена. Также не стоит для удаления объекта библиотеки VCL использовать метод Free(). Лучше использовать метод delete, гарантированно вызывающий деструктор объекта и освобождающий память, выделенную оператором new.
код не мой, не проверял
2
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.01.2012, 12:33  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
зависит - какая задача
Все так, в моем случае сворачивать - не вариант. Остается, пожалуй, только иммитировать недоступность основной формы, как при вызове модальной формы, и по таймеру вытаскивать вторую форму наверх из-под основной, если она под ней потеряется... Хотя, стоит сперва погонять этот трюк с переключением Enabled вызывающей формы, посмотреть, как он на модальных работает.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.01.2012, 13:26
Цитата Сообщение от BRcr Посмотреть сообщение
Может, я не знаю, новый поток создать параллельно? Поможет?
ИМХО, с потоками должно прокатить.
Или ShowModal все потоки останавливает???
А если так, то кто мешает создать новый процесс?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.01.2012, 16:34  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
А если так, то кто мешает создать новый процесс?
Процесс, наверно, мимо. Мне нужно будет местами из одной формы вызывать методы и события из классов других форм, а это из другого процесса делать непросто, если вообще возможно. Проще уж тогда внешне сымитировать ShowModal(), не используя, собственно, модальных форм.
Щас поиграюсь с потоками и переключением Enabled, там видно будет...
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
04.01.2012, 19:12
Цитата Сообщение от BRcr Посмотреть сообщение
Такое затруднение приключилось: есть форма условно основная, по событию над ней отображается вторая форма методом ShowModal(), так вот, как можно вместе со второй, модальной формой одновременно отображать и использовать третью форму, ну, или фрейм - что угодно.
При этом основная форма пользователю доступна быть не должна, хотя и должна быть видна на заднем плане, а вторая, модальная, и третья формы пользователю должны быть доступны обе одновременно. Еще, если это имеет значение в рамках данной задачки, все формы отображаются в стиле fsStayOnTop.
Так и сяк пробовал - из-за ShowModal(), блин, ничего не выходит...
Хм... а почему бы не попробовать сделать следующее:
Создаем три формы, прописываем все что нужно, чтобы их вызывать друг из друга. Затем размещаем на первой форме кнопку и назначаем на событие OnClick этой кнопки такой вот код:
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
Form2->ShowModal();
 
}
//---------------------------------------------------------------------------
Затем переходим на вторую форму и на событие OnShow формы пишем это вот:
C++
1
2
3
4
5
void __fastcall TForm2::FormShow(TObject *Sender)
{
Form3->Show();
}
//---------------------------------------------------------------------------
Вторая форма будет вызвана модально, а затем будет вызвана третья форма и доступа к первой не будет.
2
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.01.2012, 19:30
- а к третьей будет, если вторая "модально"?
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
04.01.2012, 19:39
nick42, будет. Она же вызывается после второй.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.01.2012, 21:32  [ТС]
Погонял все вышеупомянутые способы и вот что получилось в итоге.
Способы, подсказанные LK и NiTan, по сути своей, скорее всего, одинаковы, поскольку внешне они работают совершенно одинаково.

Принцип будет выглядеть как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TForm *second = new TForm(NULL);
TForm *third= new TForm(NULL);
// ...
 
// загасить third переключением 
third->Enabled = false;
// или методом 
third->Close();
 
second->ShowModal();
// ...
 
// в обработчике OnShow формы second переключить обратно 
third->Enabled = true;
// или вызвать 
third->Show();
По сути это активация третьей формы после отработки функции second->ShowModal().

C использованием нового потока можно написать, к примеру, так:
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
void __fastcall Tmainform::Button1Click( TObject *Sender )
{
  if ( !second ) {
    second = new Tsecond_form( this );
  }
  new third_form_thread(false);
  second->ShowModal();
}
 
// при условии, что: 
 
__fastcall third_form_thread::third_form_thread( bool CreateSuspended )
               : TThread( CreateSuspended )
{
    FreeOnTerminate = true;
}
// ---------------------------------------------------------------------------
void __fastcall third_form_thread::Execute( )
{
    Synchronize( show_third_form );
 
    while ( mainform->third->Visible && !Terminated ){
       Sleep( 500 );
    }
    Synchronize( free_third_form );
 
    ShowMessage( "thread execution finished, third form destroyed" );
}
 
void __fastcall third_form_thread::show_third_form( void ) {
 
    if (! mainform->third) {
       mainform->third = new Tthird_form( NULL );
    }
    mainform->third->Show( );
}
 
void __fastcall third_form_thread::free_third_form( void ) {    
    delete mainform->third;
    mainform->third = NULL;
}
И этот код будто бы отработает, как нам хочется, но если строчки:
C++
1
2
new third_form_thread(false);
second->ShowModal();
разнести во времени, например по разным обработчикам раскидать:
C++
1
2
3
4
5
6
7
8
9
void __fastcall Tmainform::Button1Click( TObject *Sender )
{
  new third_form_thread(false);
}
 
void __fastcall Tmainform::Button2Click( TObject *Sender )
{
  second->ShowModal();
}
тогда вся возня с потоком оказывается бесполезной - модальная форма, как обычно, побеждает всех.

Получается, что и с использованием потока третья форма будет доступна только в том случае, если будет вызвана по времени после выполнения функции second->ShowModal(), то есть вся эта ерунда с созданием потока и формы в потоке, выделением под них памяти только оттягивает время, за которое ShowModal() и успевает отработать, не затрагивая создающуюся в это время третью форму.

Отсюда вопрос, можно ли заставить форму вообще жить в параллельном потоке, независимо от основного, или, как я где-то читал, классы VCL под это не заточены?
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
09.01.2012, 21:37
1. говорят, потоки вобче не для визуальных компонентов.
2. если вам форма нужна не постоянно, не каждый день, а время от времени, суньте ее в ДЛЛ, но это уже будет совсем другая форма и совсем другая история .
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.01.2012, 21:43  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
если вам форма нужна не постоянно, (...) суньте ее в ДЛЛ, но это уже будет совсем другая форма
А как это поможет с устранением модальности? Форма в этом случае будет проживать в отдельном потоке, исполняющем dll ?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.01.2012, 21:49
Цитата Сообщение от BRcr Посмотреть сообщение
или, как я где-то читал, классы VCL под это не заточены?
Такое ущущенье, что не заточен под это сам хозяин Виндовоз. Ведь VCL - это всего лишь обертка. Мне тоже временами "хотелось странного", но...
Есть там такая концепция "главной формы". И простыми телодвижениями из нее не выплыть.
Хотя Qt, кажется (крещусь!) от этой штуки ушел. Но тут я ничего конкретного сказать не могу, мое знакомство с Кутей на уровне "Hellow". Так, лапкой трогаю его...
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
09.01.2012, 21:51
это будет просто себе отдельная форма
возвращаясь к истокам: я что-то не пойму, если вам одновременно нужны форма №2 и форма №3, для чего форму №2 отображать модально - да хоть модально - выводите сколько хотите форм, задаете им стиль WS_EX_APPWINDOW , получаете совершенно свободное окно со своей кнопкой на TaskBar'е - и - вперед, и с песней.
2
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.01.2012, 06:12  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
если вам одновременно нужны форма №2 и форма №3, для чего форму №2 отображать модально
Да просто исследую разные возможности. Ведь функция ShowModal() предоставляет весьма полезную и удобную возможность - приостановить исполнение кода в точке своего вызова.

А вот за WS_EX_APPWINDOW спасибо, попробуем...

Добавлено через 8 часов 6 минут
Цитата Сообщение от LK Посмотреть сообщение
да хоть модально - выводите сколько хотите форм, задаете им стиль WS_EX_APPWINDOW , получаете совершенно свободное окно со своей кнопкой на TaskBar'е
Так, вот этого что-то не понял. Как изменение стиля поможет побороть ShowModal()?

Насколько я понимаю, метод ShowModal() либо отнимает у Application цикл принятия сообщений от Windows, либо вносит в него такие изменения, чтоб все сообщения, не касающиеся модальной формы, просто не обрабатывались. Или применяет ко всем активным формам программы какой-нить метод навроде EnableWindow(form_handle, false), только брутальнее. Вообще, любопытно, чего конкретно делается...

Короче, делаю так - результат нулевой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    if ( !second ) {
        second = new Tsecond_form( this );
    }
    if ( !third ) {
        third = new Tthird_form( this );
    }
 
    LONG tf_style = GetWindowLongW( third->Handle, GWL_EXSTYLE );
    tf_style |= WS_EX_APPWINDOW;
    SetWindowLongW( third->Handle, GWL_EXSTYLE, tf_style );
 
    third->Show( );
 
    second->ShowModal( );
Может не так надо?
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.01.2012, 20:09  [ТС]
Изначально возможность независимости от модальных форм требовалась для создания пультика ДУ для отладки программы. На форме располагается управление некоторыми вещами, так что можно в любой момент что-то сделать в обход всех и всяческих правил и посмотреть результат.

Может, пригодится кому - разрешилось все так:
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
//////////////////////////////////////////////////////////////////////////////
// Эти макросы будут отвечать за
// - создание формы
// - стабильную работу формы при активации модальных форм
//
// Создание формы - REMOTE_CREATE
// Операции перед вызовом модальных компонентов - REMOTE_BEFORE_MODAL
// Операции в обработчике OnShow модальных компонент - REMOTE_AFTER_MODAL
//
// форму можно полностью исключить из проекта, отменив объявление REMOTE_TURN_ON
/////////////////////////
#define REMOTE_TURN_ON // <------------ Отключение формы
/////////////////////////
 
#ifdef REMOTE_TURN_ON
 
#define REMOTE_CREATE extern Tremote_form *remote_form; \
    extern Tmainform *mainform; \
    remote_form = new Tremote_form(mainform); \
        remote_form->Show();
#define REMOTE_BEFORE_MODAL extern Tremote_form *remote_form; \
    remote_form->Enabled = false;
#define REMOTE_AFTER_MODAL extern Tremote_form *remote_form; \
    remote_form->Enabled = true; \
    remote_form->BringToFront();
 
#else
#define REMOTE_CREATE
#define REMOTE_BEFORE_MODAL
#define REMOTE_AFTER_MODAL
 
#endif
 
//...
    REMOTE_CREATE
//...
    REMOTE_BEFORE_MODAL
    link_prop_form->ShowModal( );
//...
void __fastcall Tlink_prop_form::FormShow( TObject *Sender ) {
    //...
    REMOTE_AFTER_MODAL
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2012, 20:09
Помогаю со студенческими работами здесь

Управление формой из другой формы
мне надо изменить тэг form3, из кода для form1, фокус на form1)Как это сделать?)

Как передать данные с одной формы на страницу с другой формой?
Есть страница с формой заказа там есть номер телефона, как передать номер телефона на страницу с другой формой?

Управление формой из другой формы (запустить какой-нибудь метод)
Как передать параметр из одной в другую и наоборот понятно. А вот как допустим из Form2 запустить какой-нибудь метод в Form1Одна тема -...

Как из одного фрейма обратиться к содержимому формы другого фрейма?
страница состоит из нескольких фреймов. Как из одного фрейма обратиться к содержимому формы другого фрейма?...плизззз намыльте

Вывод модальной формы после отправки формы AJAX
Здравствуйте, помогите, пожалуйста, разобраться, есть модальная форма arcticmodal для просмотра этой формы можно найти её в поисковике, она...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru