Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2012, 16:16   #1
Ol_Alex
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 12
По умолчанию Многооконное приложение из однооконного

Проблема в следующем.
Есть программа-одна форма. Там есть чекбоксы, радиобаттоны, эдиты и т.п.-типа производится настройка параметров перед вычислениями. Потом программа считывает установленные параметры, обращаясь к соответствующим эдитам и т.д.
Возникла необходимость модернизировать прогру, добавить возможностей. иеста на главной форме уже нет. Надо вынести часть настрое в отдельные окна или фреймы.
1. Что для этого лучше-фрейма или окна (формы)?
2. Стал пробовать с дочерними формами. Создал, перенес интересующие поля на дочернюю форму (Контрол-Х, Контрол-V), устанавливил свойство Form Style в fsMDIForm для основной формы и в fsMDIChild для второй формы, на которую перенес кнопки, в свойствах проекта перенес вторую форму в Auto Create form. Да, сделал чтобы в коде обоих форм были перекресные инклуды заголовочных файлов - с помощью Инклуде Юнит Хедер. Запускаю Run-выдает ошибки в коде программы - неопределенные символы "RadioGroup1" и.т.д.-все боксы и поля не распознаются. Что я делаю не так?
Ol_Alex вне форума Ответить с цитированием
Старый 19.04.2012, 16:27   #2
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Я рекомендую применить компонент PageControl (из "Win32"); сам этим пользуюсь регулярно. Во первых: не появляется новая куча файлов, как с новыми формами, во вторых: все переменные и контролы доступны как обычно, в третьих: в режиме дизайна можно свободно перемещаться по вкладкам и размещать на них компоненты, как на чистой форме.
nick42 вне форума Ответить с цитированием
Старый 19.04.2012, 16:46   #3
Ol_Alex
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 12
По умолчанию

Я уже использую ТабКонтролы-да, это выход и я об этом думал - но хотел, чтобы можно было перемещать по окну главной формы, вынести за пределы главного окна и т.д.
Ol_Alex вне форума Ответить с цитированием
Старый 19.04.2012, 17:24   #4
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Если вы их убрали из главного окна, а обработчики событий на эти компоненты оставили, то будет ошибка. Страницы не всегда хороши. А вы правильно создаете дочернее окно?
Drugnir вне форума Ответить с цитированием
Старый 19.04.2012, 17:51   #5
Ol_Alex
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Drugnir Посмотреть сообщение
Если вы их убрали из главного окна, а обработчики событий на эти компоненты оставили, то будет ошибка. Страницы не всегда хороши. А вы правильно создаете дочернее окно?
Ну естественно, что обработчик на события, связанные с этими полями я оставил. Т.к. если чистить главное окно-то это заморочка, да к тому же обрать обработчики событий - а куда их сунуть? Я грешным делом думал, что если я указал Иклуд заголовочного файла второй формы, то эти поля и радиогруппы будут понятны первой форме. Ошибки начинаются еще до того, как начинают обрабатываться события второй формы. Например, обработка события открытия файла (кнопка и обработчик-на первой форме), нг там есть запись типа:
Если файл открылся успешно, сделать активным поле второй формы. И вот это поле - неопределенный символ для первой формы.

А дочернее окно создавал так:
1. Файл-Нью-Форм
2. В свойствах проекта Ран-Опшенс перенес вторую форму из Эвейлебл в Автокриейт формс
3. В свойствах форм ФормСтайл установил в родительский для первой и в дочернюю для второй
4. меню Файл-ИнклюдеЮнитХедер установил так,Ю чтобы в проекте первой формы был указан заголовочный файл второй формы и наоборот.
5. Сонтрол-Х, Сонтрол-V интересующие меня поля и группы из первой формы во вторую

Что еще нужно сделать, чтобы не выдавало ошибки? Как правильно сделать так, чтобы события, происходящие на второй форме - были понятны родительской форме-ну типа на дочерней изменил значение в Эдит, а при обработке событий первая форма могла прочитать значение этого поля. Или первая форма, в случае условного оператора, могла проверить это условие в зависимости от выбора, сделанного на второй форме.
Ol_Alex вне форума Ответить с цитированием
Старый 19.04.2012, 18:01   #6
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

- ну, это просто: Form1->CheckBox2->Checked ... Form2->Edit4->Text ... if(Form3->RadioGroup1->ItemIndex==3) ... и т.д. (указывать родителя...).
nick42 вне форума Ответить с цитированием
Старый 19.04.2012, 18:36   #7
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Создание дочерней формы
1. В файле project удалить create
2. В родительской форме на нужное вам событие
Код:
if(!Form2)
      Form2 = new TForm2(Application);
3. На OnClose у Form2:
Код:
Action = caFree; Form2 = NULL;
Обработчики событий теперь должны быть в дочерней форме, а результаты можно передать, через переменные в public'е или так как описал nick42. Так же можно использовать модальные формы.
Drugnir вне форума Ответить с цитированием
Старый 19.04.2012, 19:08   #8
Ol_Alex
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от nick42 Посмотреть сообщение
- ну, это просто: Form1->CheckBox2->Checked ... Form2->Edit4->Text ... if(Form3->RadioGroup1->ItemIndex==3) ... и т.д. (указывать родителя...).
Ну я понял принцип-спасибо. Вроде сделал. Но Запускаю Ран-выводится только основная форма. Вторая форма с настройками не выводится...
Ol_Alex вне форума Ответить с цитированием
Старый 19.04.2012, 19:16   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Ol_Alex Посмотреть сообщение
Вторая форма с настройками не выводится...
Она и не выведется автоматически. Её нужно вызывать кнопкой или разделом меню, вот так:
Form2->Show();
Или:
Form2->ShowModal();
В этом случае форма вызывается как модальная.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 19.04.2012, 19:29   #10
Ol_Alex
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Drugnir Посмотреть сообщение
Создание дочерней формы
1. В файле project удалить create
2. В родительской форме на нужное вам событие
Код:
if(!Form2)
      Form2 = new TForm2(Application);
3. На OnClose у Form2:
Код:
Action = caFree; Form2 = NULL;
Обработчики событий теперь должны быть в дочерней форме, а результаты можно передать, через переменные в public'е или так как описал nick42. Так же можно использовать модальные формы.
Удалить create в Projec.cpp? У меня там нет create... или имелось в виду
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TFilterOption s), &FilterOptions);
?


Ну, объявить переменные второй формы Паблик - это понятно. Но если не все там делается переменными - например, проверка состояния флагов. Конечно, это Итемс-ы? - их глобальными не объявить ведь.
Ol_Alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приложение ALEX777a Фриланс 5 14.03.2012 13:27
многопоточное приложение favorite Общие вопросы Delphi 0 26.05.2011 19:47
Многооконное приложение Miha85193 Общие вопросы Delphi 1 03.12.2010 01:49
Задача:в вижуал с++ Разработать приложение-сервер и приложение (смотри дальше сообщение) Мила777 Фриланс 2 21.10.2009 11:05