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

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

ru
Offline Offline

« : 23-06-2010 08:12 » 

Проблема с TDBCombobox - какой-то ненормальный элемент. Ну ладно, понял, что его  Items надо заполнять программно, типа:
while not DM.QO.eof do
   begin cbO.Items.Add(DM.QO.Fields[1].AsString); DM.QO.Next; end;
черт с этим, хотя ненормальная ситуация для фирменного компонента. Но ведь он после такого заполнения вообще не реагирует на события (ладно бы OnChange), но и на OnClick. Т.е., невозможно построить обработку события выбора какой-то записи из него, например, для построения фильтров. Слышал, что лучше вместо него использовать TDBLookUPComboBox.
« Последнее редактирование: 23-06-2010 17:56 от Sel » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 23-06-2010 11:10 » 

это два принципиально разных компонента.

TDbComboBox служит для внесения в поле значений, заранее введённых пользователем в Items. не обязательно делать это программно, всё прекрасно делается в дизайн-тайм. он не показывает все значения выбранного поля, он позволяет занести в поле одно из тех значений, которые вы перечислили.

TDbLookupComboBox - компонент, для отображения значений из другой таблицы по заданному ключу. например, у вас есть таблица Items с полями Id, Name и есть таблица Orders с полями Id, ItemId, Qty. в первой таблице список товаров, вторая таблица - накладная из этого списка (это всё упрощённо, конечно). Тогда вы можете использовать TDbLookupComboBox: настроить его на вторую таблицу, а ListSource и пр. - на первую, и вы сможете на форме выбирать из списка таблицы Items товары и заносить их во вторую таблицу. при этом фактически будет заносится только ItemId, хотя пользователь будет видеть наименование из таблицы Items полностью.

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

eugrita
Помогающий

ru
Offline Offline

« Ответ #2 : 23-06-2010 16:28 » 

Ну хорошо. Пусть их назначение именно такое как вы говорили.

Тогда вопрос как проще всего реализовать фильтр в подчиненной таблице по выбранному внешнему ключу
(foreign key)?

Т.е пусть tb1 - некоторая главная таблица -список-справочник а tb2 - подчиненная ей таблица, имеющая как foreign key) ключ главной tb1
Наиболее разумный и компактный подход - запихнуть этот справочник tb1 (хотя бы 1 поле в список лучше всего типа Combobox чтоб места на форме меньше занимал. Но только при этом 2 требования
1)этот combobox должен реагировать на событие выбора значения - а этого у TDBComboBox нет, а TLookUpCombobox вроде можно к этому применить
2)должен отображать все записи (информационное поле) таблицы tb1. Но этим опять же TDBComboBox не обладает без  написания программного кода.

Встречаясь с этим не 1-й раз ,плюнул на этj и использую обычный TCombobox без всяких db - там правда пахать надо - вставить процедурой чтения из рекордсета Items  (и рекордсет не закрывать или набор его ключей считать в динамический массив), зато хоть на события реагирует!!!
« Последнее редактирование: 23-06-2010 16:35 от eugrita » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 25-06-2010 07:58 » 

это всё можно сделать двумя способами.

1. использовать TDBLookupComboBox, который как раз для этого и предназначен
2. создать в таблице tb2 lookup-поле на таблицу tb1 и выводить его в грид. в этом случае при выборе этого поля грид сам будет отображать значения из lookup-таблицы.
Записан

eugrita
Помогающий

ru
Offline Offline

« Ответ #4 : 28-06-2010 18:07 » 

хорошо. Использую 2 TDBLookUpCombobox
Есть проблемка 2-й  TDBLookUpCombobox  не реагирует на выбор. точнее, реагирует но в видимое поле после раскрытия всегда стоит 1-й Item. В 1-м TDBLookUpCombobox все нормально
Разница меж ними в том, что при выборе в 1-м какого то значения (фильтр) динамически изменяется SQL-запрос 2-го
(закрывается, заменяется текст, вновь открывается)
Но при заполнении новыми значениями не зависимо от выбора пользователя визуально отображается всегда 1-й по счету Item
« Последнее редактирование: 28-06-2010 18:09 от eugrita » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 29-06-2010 09:11 » 

а зачем вы меняете запрос? не проще было бы настройить master-detail по этому ключу, и тогда при смене активной записи в главной таблице дочерняя таблица будет фильтроваться сама?
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines