Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление информации между страницами CPropertySheet  (Прочитано 11587 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ezus
Опытный

il
Offline Offline

« : 10-12-2013 08:47 » 

Добрый день.
Есть CPropertySheet с двумя страницами: одна содержит идентификационные данные, вторая - доп.информацмию.
Кроме того вторая страница также содержит ряд полей с идентификационными данными из первой страницы в режиме "только чтение".
Вопрос: Как при переходе от 1-ой страницы ко 2-ой выполнять обновление идентификационных данных?

Я могу обеспечить пересылку данных между страницами\диалогами, но как поймать момент переключения?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 10-12-2013 11:11 » 

Хранить данные в диалогах (страницах) - боооольшой грех. Данные надо хранить в отдельной структуре, к которой страницы имеют доступ. Каждая страница отвечает за получение данных из этой структуры, и за запись данных в структуру. Делать она это может, например, сразу при изменении данных (можно напрямую связать элементы управления с полями данных), или, например, при получении (инициаллизация) / потере (запись) фокуса. Если речь идёт о MFC CPropertySheet со страницами CPropertyPage, то для этих операций лучше всего воспользоваться ф-ми объекта CPropertySheet -> OnSetActive / OnKillActive.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ezus
Опытный

il
Offline Offline

« Ответ #2 : 10-12-2013 11:29 » 

Спасибо.
Я уже нашел OnKillActive.
Что касается данных, тут ты абсолютно прав. Просто дата создание этого диалога относится к 92 году прошлого века. И если начальство решит переписывать код, то конечно все будет не так.
Записан
ezus
Опытный

il
Offline Offline

« Ответ #3 : 18-12-2013 13:22 » 

К сожалению, не все так просто, во всякомслучае для меня.
Я использую OnSetActive() для блокировки перехода к данному табу.
Если выхожу из этой функции с TRUE - все Ок!
Но при FALSE, вместо возврата происходит переход к следующиму табу.

Вопросы:
Где можно почитать? Я сам не нашел.

Возможно ли просто вернуться из  OnSetActive()? Если да, то как?

Возможно требуется выбрать другой путь?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 18-12-2013 15:57 » 

Как само название ф-ции уже говорит (On), ф-я вызывается ПОСЛЕ активирования текущей страницы, те как результат совершённого действия  (SetActive). Поэтому просто вернуть 0 недостаточно.

Вобще-то, если необходима блокировка "табов" - страниц, то "табы" - неудачный режим PropertySheet. Для последовательной отработки страниц предусмотрен режим мастера (CPropertySheet::SetWizardMode). В нём можно, находясь на текущей странице, полностью контролировать кнопки "Prev", "Next" (и тд), запрещая, или разрешая, таким образом переход к след. странице, например, если условия на текущей не позволяют это делать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ezus
Опытный

il
Offline Offline

« Ответ #5 : 18-12-2013 16:13 » 

Я уточню задачу.
Есть два класса, наследуемые от общего класс. Они содержат разную доп.информацию в зависимости от типа.
Есть диалог содержащий 3 таба: общие данные, доп.данные для типа А и допюданные для типа Б.
Сам тип может изменяться в общем табе.
Необходимо заблокировать переход к чужой доп.информации.

Для диалога был использован класс сам CPropertySheet. Поэтому я могу использовать для контроля только перехваты в табах.

Я так понял, что при таком подходе задача не реализуема. Это так?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-12-2013 18:36 » 

ezus, плохое решение. Хорошее решение - вообще скрывать и делать невидимым "таб" для неподходящего типа.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 19-12-2013 09:09 » 

ezus, я правильно понял: если в общем "табе" выбран тип А, то доступен "таб" А, если тип Б, то "таб" Б? Общий "таб" доступен всегда?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ezus
Опытный

il
Offline Offline

« Ответ #8 : 19-12-2013 13:46 » 

ezus, я правильно понял: если в общем "табе" выбран тип А, то доступен "таб" А, если тип Б, то "таб" Б? Общий "таб" доступен всегда?
Да, верно. В любой момент видно только 2 таба.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 19-12-2013 14:23 » 

Так в чём тогда проблема?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 19-12-2013 16:11 » 

В режиме мастера, эта задача решается элементарно. Первая страница определяет переход к след.

Если же этот режим по каким-то причинам невозможно установить, то тогда решается как Димка уже сказал скрывать (можно и удалять/добавлять из/в Sheet ) "ненужный" таб. Правда этот вариант для пользователя не самый удачный: вдруг табы начинают вести себя как призраки "то явятся, то растворятся" (с).
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 19-12-2013 18:31 » 

Джон, можно ведь заголовок у них одинаковый сделать. Хотя я подумал о том, что таб "Детали" можно сделать один, и на нём показывать/прятать диалоги с нужными настройками, в зависимости от выбора на основном табе
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 20-12-2013 08:42 » 

Конечно, можно сделать и так. Но при определённых условиях нет гарантии, что "моргание" будет незаметным. Тем более, что речь идёт о "старых" технологиях. Но, опять же, на это тоже можно закрыть глаза, если клиенту это не мешает.

Можно запихать на вторую страницу элементы управления обоих доп. страниц (А и Б) и управлять при активировании их видимостью. Можно вобще динамически создавать элементы управления на второй странице. Всё ворос цены/времени/возможности. Я начал с самого простого: 1. режим мастера, 2. по Next переходим к нужной странице -> основной код и основная логика остаются практически без изменений.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ezus
Опытный

il
Offline Offline

« Ответ #13 : 22-12-2013 13:26 » 

Спасибо.
Прорвался почти через всё.
Остался пока нерешенный вопрос: по ОК выполняется некоторая валидация в каждом из табов.
Как остаться в диалоге в случае обнаружения ошибки?

В простом диалоге я просто выходил из ОК по return - без CDialog::OnOK(), а тут пока не получается.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 23-12-2013 07:19 » 

Опять же всё говорит в пользу режима мастера: кнопка "Finish" активна если всё в порядке.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ezus
Опытный

il
Offline Offline

« Ответ #15 : 23-12-2013 09:58 » 

Спасибо. И здесь тоже прорвался
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines