| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS Access > Перехват события подчиненной формы |
| Автор: Laky 7.4.2009, 10:06 |
| На главной форме [GL] существует подчиненная [F1] Подчиненная форма выводит все данные из таблицы [T1] (имя, пол, возраст, место работы\учебы) Для удобства в подчиненной все поля, кроме имени, скрыты На главной соответственно сделаны 3 поля, которые выводят данные при выборе имени, то есть, например, поле возраст главной формы имеет источник записи как [Forms]![GL]![F1].[Form]![vozrast] Вопрос: 1) например, поле пол в таблице булево, как сделать так, чтобы на главной форме специальный лейбл менял название мужской\женский в зависимости от значения поля в таблице 2) на первый вопрос и кучу таких же примитивных вопросов легко ответить, если знать, как перехватить тот момент, когда поле главной с прописанным источником данных, меняет свое значение. Есть ли такое событие? Прежде чем ответить, попробуйте сделать, ибо кажется, что должно сработать, вот прям точно, а не работает. Если перехватить событие изменения контрола главной не имеется возможности, тогда покажите, как это сделать с помощью событий подчиненной. Пример базы http://slil.ru/27381195 Заранее спасибо |
| Автор: Akina 7.4.2009, 10:20 |
| Базу качать не буду - сейчас некогда, но скажу кое-что. Не насилуйте объектную модель - каждый объект должен отвечать только за себя, никто в его свойства/методы/события своими грязными руками влезать не должен. Если событие или изменение происходит в подчинённой форме - именно она должна обработать событие/изменение. Если необходимо оповестить о нём главную форму - пусть она вызовет соотв. метод или публичную процедуру/функцию главной формы или создаст соотв. событие для главной формы. И наоборот. |
| Автор: bopoha 7.4.2009, 12:28 | ||||||
| А вообще использовать в качестве источника данных подчиненную форму это плохое решение. Лучше данные брать непосредственно из таблицы (с редактированием проблем не будет). А показывать данные только выбранной фамилии при помощи фильтра. При этом также стоит с главной формы вынести в подчиненную блок с данными о фамилии. Если же очень хочется остатся на источнике данных в качестве формы, то стоит писать свою процедуру загрузки данных на главную форму при изменении позиции в подчиенной и тогда котролы станут редактируемыми (Увы, контролы с выражениями не редактируются) и можно будет обрабатывать события об изменениях. Но это гемор. Как это потом сопровождать? Вот общая информация о событиях: http://5codelines.net/events1/ Обрабатываеть события можно только объектов (формы, пользовательские классы). Увы от таблиц не получится. Поэтому можно обработать события поля формы. Чтобы событие от элемента управления просиходило, необходимо контролу об этом сказать:
Далее объявить ссылку на улемент управления:
И инициализировать ссылку, например при открытии формы
А теперь объясните, зачем такие сложности? Мне очень любопытно. |
| Автор: Laky 7.4.2009, 17:38 |
| Я не понимаю, что вызывает у вас такое удивление, если честно) Говорите, лучше данные брать непосредственно из таблицы? я беру их не из таблицы, а через подчиненную, не потому, что боюсь каких-то проблем с редактированием (к слову, редактировать мне ничего не нужно) а потому, что так нагляднее объясняю: вы когда нибудь видели на одной главной форме две, связанные между собой подчиненные формы? ну, первая подчиненная - список организаций, вторая - подробности каждой? У меня получается практически так же с отличием в том, что вторую подчиненную я не делаю, перенеся ее функционал на главную. Подчиненная форма вывела все имена. Выбрали какое-то имя, кликнули, рядом в полях - все подробности. Это удобно? Да. А какую альтернативу вы можете предложить? Напишите. Может, ваше предложение действительно интереснее. Вопрос состоял как раз в том, о чем сказал(а) Akina: "Если событие или изменение происходит в подчинённой форме - именно она должна обработать событие/изменение. Если необходимо оповестить о нём главную форму - пусть она вызовет соотв. метод или публичную процедуру/функцию главной формы или создаст соотв. событие для главной формы. И наоборот. " какое событие происходит? то есть к какой-то записи в подчиненной форме пришел фокус но подчиненная форма имеет ленточную структуру запись подчиненной формы получает 1 раз, при загрузке значит, дело не в этом изменилась текущая запись? ну да, нужно отследить, что пользователь в подчиненной форме тыкнул на вторую\пятую\десятую запись вот тут, каким событием отслеживается изменение текущей записи в подчиненной форме, у меня и возник вопрос еще мне подумалось, что можно пойти другим путем и не ловить то, что происходит в подчиненной а поймать тогда, когда полю главной будет присвоено новое значение и опять же не известно мне, каким событием это можно отследить Что касается высказывания про "влезание своими грязными руками", то хотелось бы уточнить, действительно ли вы считаете присвоение полю какого-то значения через конструктор, а не исключительно программным способом, "влезанием", и всегда ли вы считаете, что у программистов "грязные руки"? Не просто так приложена была база, она абсолютно не нагруженна лишними деталями зато тут же ставит все на свои места и становится понятнее, что собственно нужно, где и как. Уж кому, как не вам знать, что объяснение словами бывает запутаннее, чем суть на самом деле. Заранее спасибо! |
| Автор: bopoha 8.4.2009, 16:28 |
| Вот пример, как обещал. Обратите внимание, что подчиненные формы ничего не знают о друг друге и главной форме. Только главная форма разруливает события! Добавлено через 1 минуту и 22 секунды При этом подчиненные формы можно использовать повторно не зависимо друг от друга. |
| Автор: Laky 8.4.2009, 19:15 |
| все замечательно за исключением 2 моментов: 1) вы прекрасно показали, как можно организовать фильтр через главную и формы подчиненные друг о друге ничего не знают это конечно здорово только фильтр мне совершенно ни к чему у меня по сути просто выводится вся таблица, без всяких заморочек да и хвататет у меня сложных мест, чтобы еще вот с простым выводом изощряться поэтому ваш пример мне не полезен в поиске ответа на мой вопрос (потому что вопрос в другом заключался) 2) мне на будущее: баг у вас в программе, вот от него как прикажете избавляться? теперь, возвращаясь к моим баранам, попрошу вас на своем (то есть на вашем) примере поразмыслить: пусть, как только вы выбрали Фирму 1, Label0 на второй подчиненной форме поменяет цвет шрифта, если же другую - вернется к черному (или любой другое свойство свое поменяет) как только получится - тогда будет мне счастье, ибо вы найдете ответ на мой вопрос |
| Автор: Akina 8.4.2009, 19:36 | ||
|
| Автор: Laky 8.4.2009, 20:56 |
| Akina, это не общее решение а если у вас 11000 записей? а поменять цвет текста лейбла вам надо только тогда, когда название будет заканчиваться на "а" например? в чем у меня состоял вопрос: If pol.value = True Then Label.caption = "мужской" Else Label.caption = "женский" эту строчку надо было прописать в правильном событии и была нужда в вашей помощи в поиске этого события, а если его не существует, то в написании оном только в такие моменты понимаешь всю серьезность и сложность труда специалистов, ориентированных на написание ТЗ... |
| Автор: Akina 8.4.2009, 21:13 | ||
Так Вам ещё и разжевать, как по индексу записи получить её содержимое? Неужели нельзя самостоятельно сделать такую простую вещь? А суть везде одна и та же - сообщить главной форме о событии в подчинённой, чтобы она выполнила необходимые действия в другой подчинённой. А будет там IF или CASE, одно простое условие или десяток навороченных - какая разница? |
| Автор: bopoha 8.4.2009, 21:30 | ||||||||
| Laky, нет слов одни эмоции. Научитесь четко и ясно выражать свои мысли, а именно задавать вопросы. Только сейчас дошло, что вам нужно. А теперь к делу. Дело не в событии. Access еще и выражения поддерживает. Например, Iif, который можно использовать в источнике данных. Получается для поля в источнике данных можно написать так: = Iif([pol];"мужской";"женский"). Только это плохое решение. Практика показала, что лучше использовать справочник. Что будет, если пол не определен? И будет вам счастье.
Учитесь программировать или, например, заплатите мне денег и я вам напишу
Ой, вот только не нужно перетаскивать одеяло на себя. А то холивар получится.
Какой? |
| Автор: Akina 8.4.2009, 22:40 |
| каментов нету |
| Автор: Laky 9.4.2009, 13:27 |
| Akina, bopoha спасибо большое за помощь спасибо за подсказку получилось все получилось и даже изменение лейбла главной по значению подчиненной, когда запись выбирается во второй подчиненной) можно не пытаться понять) |
| Автор: boeinfo 28.11.2015, 20:57 | ||
TwoFormsOnMain.zip Спасибо! |