Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват события подчиненной формы, связь главной и подчиненной 
V
    Опции темы
Laky
Дата 7.4.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



На главной форме [GL] существует подчиненная [F1]
Подчиненная форма выводит все данные из таблицы [T1] (имя, пол, возраст, место работы\учебы)
Для удобства в подчиненной все поля, кроме имени, скрыты
На главной соответственно сделаны 3 поля, которые выводят данные при выборе имени, то есть, например, поле возраст главной формы имеет источник записи как [Forms]![GL]![F1].[Form]![vozrast]
Вопрос: 1) например, поле пол в таблице булево, как сделать так, чтобы на главной форме специальный лейбл менял название мужской\женский в зависимости от значения поля в таблице
2) на первый вопрос и кучу таких же примитивных вопросов легко ответить, если знать, как перехватить тот момент, когда поле главной с прописанным источником данных, меняет свое значение. Есть ли такое событие? Прежде чем ответить, попробуйте сделать, ибо кажется, что должно сработать, вот прям точно, а не работает.
Если перехватить событие изменения контрола главной не имеется возможности, тогда покажите, как это сделать с помощью событий подчиненной.
Пример базы http://slil.ru/27381195
Заранее спасибо
PM   Вверх
Akina
Дата 7.4.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Базу качать не буду - сейчас некогда, но скажу кое-что.
Не насилуйте объектную модель - каждый объект должен отвечать только за себя, никто в его свойства/методы/события своими грязными руками влезать не должен. 
Если событие или изменение происходит в подчинённой форме - именно она должна обработать событие/изменение. Если необходимо оповестить о нём главную форму - пусть она вызовет соотв. метод или публичную процедуру/функцию главной формы или создаст соотв. событие для главной формы. 
И наоборот.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 7.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



А вообще использовать в качестве источника данных подчиненную форму это плохое решение. Лучше данные брать непосредственно из таблицы (с редактированием проблем не будет). А показывать данные только выбранной фамилии при помощи фильтра. При этом также стоит с главной формы вынести в подчиненную блок с данными о фамилии.

Если же очень хочется остатся на источнике данных в качестве формы, то стоит писать свою процедуру загрузки данных на главную форму при изменении позиции в подчиенной и тогда котролы станут редактируемыми (Увы, контролы с выражениями не редактируются) и можно будет обрабатывать события об изменениях. Но это гемор. Как это потом сопровождать?

Вот общая информация о событиях:
http://5codelines.net/events1/

Обрабатываеть события можно только объектов (формы, пользовательские классы). Увы от таблиц не получится. Поэтому можно обработать события поля формы.

Чтобы событие от элемента управления просиходило, необходимо контролу об этом сказать:
Код

Me.Control1.OnChange = "[Event procedure]"


Далее объявить ссылку на улемент управления:
Код

Dim WithEvents ctlControl1 as TextBox


И инициализировать ссылку, например при открытии формы
Код

Set ctl = me.SubForm.Form.Control1


А теперь объясните, зачем такие сложности? Мне очень любопытно.

PM MAIL WWW ICQ Skype GTalk   Вверх
Laky
Дата 7.4.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Я не понимаю, что вызывает у вас такое удивление, если честно)

Говорите, лучше данные брать непосредственно из таблицы?
я беру их не из таблицы, а через подчиненную, не потому, что боюсь каких-то проблем с редактированием
(к слову, редактировать мне ничего не нужно)
а потому, что так нагляднее

объясняю:
вы когда нибудь видели на одной главной форме две, связанные между собой подчиненные формы?
ну, первая подчиненная - список организаций, вторая - подробности каждой?
У меня получается практически так же с отличием в том, что вторую подчиненную я не делаю, перенеся ее функционал на главную.
Подчиненная форма вывела все имена.
Выбрали какое-то имя, кликнули, рядом в полях - все подробности.

Это удобно? Да.
А какую альтернативу вы можете предложить? Напишите. Может, ваше предложение действительно интереснее.

Вопрос состоял как раз в том, о чем сказал(а) Akina: 
"Если событие или изменение происходит в подчинённой форме - именно она должна обработать событие/изменение. Если необходимо оповестить о нём главную форму - пусть она вызовет соотв. метод или публичную процедуру/функцию главной формы или создаст соотв. событие для главной формы. 
И наоборот. "

какое событие происходит?
то есть к какой-то записи в подчиненной форме пришел фокус
но подчиненная форма имеет ленточную структуру
запись подчиненной формы получает 1 раз, при загрузке
значит, дело не в этом

изменилась текущая запись?
ну да, нужно отследить, что пользователь в подчиненной форме тыкнул на вторую\пятую\десятую запись
вот тут, каким событием отслеживается изменение текущей записи в подчиненной форме, у меня и возник вопрос


еще мне подумалось, что можно пойти другим путем
и не ловить то, что происходит в подчиненной

а поймать тогда, когда полю главной будет присвоено новое значение
и опять же не известно мне, каким событием это можно отследить


Что касается высказывания про "влезание своими грязными руками", то хотелось бы уточнить, действительно ли вы считаете присвоение полю какого-то значения через конструктор, а не исключительно программным способом, "влезанием", и всегда ли вы считаете, что у программистов "грязные руки"?

Не просто так приложена была база,
она абсолютно не нагруженна лишними деталями
зато тут же ставит все на свои места и становится понятнее, что собственно нужно, где и как.
Уж кому, как не вам знать, что объяснение словами бывает запутаннее, чем суть на самом деле.

Заранее спасибо!
PM   Вверх
bopoha
Дата 8.4.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(Laky @  7.4.2009,  17:38 Найти цитируемый пост)
вы когда нибудь видели на одной главной форме две, связанные между собой подчиненные формы?


Я даже так делаю.

Цитата(Laky @  7.4.2009,  17:38 Найти цитируемый пост)
А какую альтернативу вы можете предложить? Напишите. Может, ваше предложение действительно интереснее.

Я изложил выше. Взаимодействие 3-х форм. 1-а главная, 2-е подчиненные.

Цитата(Laky @  7.4.2009,  17:38 Найти цитируемый пост)
вот тут, каким событием отслеживается изменение текущей записи в подчиненной форме, у меня и возник вопрос

Событие так и называется Текущая запись или Current.

Цитата(Laky @  7.4.2009,  17:38 Найти цитируемый пост)
Уж кому, как не вам знать, что объяснение словами бывает запутаннее, чем суть на самом деле.

Ни слова, ни база не показали мне то, что хотите вы получить. 

Чтобы не быть голословным и показать насколько вы усложняете, я выложу пример чуть позже.
PM MAIL WWW ICQ Skype GTalk   Вверх
bopoha
Дата 8.4.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Вот пример, как обещал.
Обратите внимание, что подчиненные формы ничего не знают о друг друге и главной форме. Только главная форма разруливает события!

Добавлено через 1 минуту и 22 секунды
При этом подчиненные формы можно использовать повторно не зависимо друг от друга.

Это сообщение отредактировал(а) bopoha - 8.4.2009, 16:29

Присоединённый файл ( Кол-во скачиваний: 36 )
Присоединённый файл  TwoFormsOnMain.zip 18,11 Kb
PM MAIL WWW ICQ Skype GTalk   Вверх
Laky
Дата 8.4.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



все замечательно
за исключением 2 моментов:
1) вы прекрасно показали, как можно организовать фильтр через главную
и формы подчиненные друг о друге ничего не знают
это конечно здорово
только фильтр мне совершенно ни к чему
у меня по сути просто выводится вся таблица, без всяких заморочек
да и хвататет у меня сложных мест, чтобы еще вот с простым выводом изощряться
поэтому ваш пример мне не полезен в поиске ответа на мой вопрос (потому что вопрос в другом заключался)

2) мне на будущее: баг у вас в программе, вот от него как прикажете избавляться?

теперь, возвращаясь к моим баранам, попрошу вас на своем (то есть на вашем) примере поразмыслить:
пусть, как только вы выбрали Фирму 1, Label0 на второй подчиненной форме поменяет цвет шрифта, если же другую - вернется к черному (или любой другое свойство свое поменяет)
как только получится - тогда будет мне счастье, ибо вы найдете ответ на мой вопрос


PM   Вверх
Akina
Дата 8.4.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Код

Private Sub m_frmKlientSpis_OnKlientSelect(ByVal lK_KLIENT As Long)
    Dim stFilter As String
    
    stFilter = "K_KLIENT = " & lK_KLIENT
    
    With Me.f_klient_edit_.Form
        .Filter = stFilter
        .FilterOn = True
        Select Case lK_KLIENT
        Case 1
            .Controls("label1").ForeColor = RGB(255, 0, 0)
        Case 2
            .Controls("label1").ForeColor = RGB(0, 255, 0)
        Case 3
            .Controls("label1").ForeColor = RGB(0, 0, 255)
        Case Else
            .Controls("label1").ForeColor = RGB(0, 0, 0)
        End Select
    End With
End Sub
?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Laky
Дата 8.4.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Akina, это не общее решение
а если у вас 11000 записей?
а поменять цвет текста лейбла вам надо только тогда, когда название будет заканчиваться на "а" например?

в чем у меня состоял вопрос:
If pol.value = True Then Label.caption = "мужской" Else Label.caption = "женский"

эту строчку надо было прописать в правильном событии
и была нужда в вашей помощи в поиске этого события, а если его не существует, то в написании оном

только в такие моменты понимаешь всю серьезность и сложность труда специалистов, ориентированных на написание ТЗ...
PM   Вверх
Akina
Дата 8.4.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Laky @  8.4.2009,  21:56 Найти цитируемый пост)
Akina, это не общее решение
а если у вас 11000 записей?
а поменять цвет текста лейбла вам надо только тогда, когда название будет заканчиваться на "а" например?

Так Вам ещё и разжевать, как по индексу записи получить её содержимое? Неужели нельзя самостоятельно сделать такую простую вещь? 
А суть везде одна и та же - сообщить главной форме о событии в подчинённой, чтобы она выполнила необходимые действия в другой подчинённой. А будет там IF или CASE, одно простое условие или десяток навороченных - какая разница?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 8.4.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Laky, нет слов одни эмоции. Научитесь четко и ясно выражать свои мысли, а именно задавать вопросы. Только сейчас дошло, что вам нужно.

А теперь к делу.

Цитата(Laky @  8.4.2009,  20:56 Найти цитируемый пост)
эту строчку надо было прописать в правильном событии

Дело не в событии. Access еще и выражения поддерживает. Например, Iif, который можно использовать в источнике данных.
Получается для поля в источнике данных можно написать так: = Iif([pol];"мужской";"женский"). Только это плохое решение. Практика показала, что лучше использовать справочник. Что будет, если пол не определен?

И будет вам счастье.

Цитата(Laky @  8.4.2009,  20:56 Найти цитируемый пост)
поменять цвет текста лейбла вам надо только тогда, когда название будет заканчиваться на "а" например?

Код

'-- ...
If Right(Me.T_KLIETN, 1) = "а" Then
     .Controls("label1").ForeColor = RGB(255, 0, 0)
End If
'-- ...


Учитесь программировать или, например, заплатите мне денег и я вам напишу smile.
Цитата(Laky @  8.4.2009,  20:56 Найти цитируемый пост)
только в такие моменты понимаешь всю серьезность и сложность труда специалистов, ориентированных на написание ТЗ... 

Ой, вот только не нужно перетаскивать одеяло на себя. А то холивар получится.

Цитата(Laky @  8.4.2009,  19:15 Найти цитируемый пост)
2) мне на будущее: баг у вас в программе, вот от него как прикажете избавляться?

Какой?
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 8.4.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



 smile 
Цитата(bopoha @  8.4.2009,  22:30 Найти цитируемый пост)
Какой?

каментов нету


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Laky
Дата 9.4.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Akina, bopoha 
спасибо большое за помощь

спасибо за подсказку
получилось
все получилось
и даже изменение лейбла главной по значению подчиненной, когда запись выбирается во второй подчиненной)
можно не пытаться понять)

Это сообщение отредактировал(а) Laky - 9.4.2009, 15:34
PM   Вверх
boeinfo
Дата 28.11.2015, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 28.11.2015

Репутация: нет
Всего: нет



Цитата(bopoha @ 8.4.2009,  16:28)
Вот пример, как обещал.
...
При этом подчиненные формы можно использовать повторно не зависимо друг от друга.

 TwoFormsOnMain.zip
Спасибо! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.