Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизИспользование не DB компонента на DBCtrlGrid. Найти похожие ветки
← →
Fedia © (2005-09-18 05:32) [0]Доброго времени суток !
В БД находится справочник ves с полями id_ves (тип int(11)) и ves (тип Char(40)). Так же в БД имеется множество таблиц, содержащих поле id_ves. Необходимо организовать визуальный интерфейс для удобного заполнения поля id_ves в данных таблицах. Для этого я предполагаю использовать компонент DBCtrlGrid, на который будут помещены компоненты DBEdit и ComboBox. При нажатии на кнопку ComboBox-са должен появляться выпадающий список, в котором должны отображаться записи таблицы ves, в следующем виде: “id_ves + пробел + ves”. Пользователь выбирает из выпадающего списка нужную запись, после чего в компонент DBEdit заносится значение поля id_ves, а в компонент ComboBox – поля ves. Но в описанной выше компонентной связке существует один дефект, который я не могу устранить: значение свойства ComboBox.Text отображается только для текущей записи таблицы, отображаемой на DBCtrlGrid, в остальных оно отображается пустым. Вот с этой проблемой я прошу помочь мне справиться.
Сразу отмечу, что при использовании компонента DBComboBox такая схема работает, но для ее реализации в заполняемой таблице необходимо добавлять еще одно физическое поле ves, что крайне не желательно.
С уважением,
Федор.
← →
Fedia © (2005-09-19 05:28) [1]Попытаюсь уточнить вопрос.
У меня имеются два варианта для реализации описанного выше интерфейса. Может быть, кто-то сможет предложить другие варианты.
I. Использовать TComboBox. В этом случае значение ComboBox.text отображается только в текущей записи набора данных, а мне необходимо, чтобы это свойство отображалось у всех видимых на DBCtrlGrid записях таблицы. Причем значение этого свойства может быть различным, в зависимости от содержимого компонента DBEdit.
Я понимаю, что без изменения компонента TComboBox здесь не обойтись, но мне нужно знать хотя бы направление, в котором следует копать.
К примеру: 1. В конструкторе компонента TEdit прописываем:ControlStyle := ControlStyle + csReplicatable;
;
2. Подключаем DBCtrlGrid к набору данных;
3. Помещаем TEdit на DBCtrlGrid. Вопрос: Что нужно сотворить с компонентом TEdit (или TComboBox), чтобы значение свойства text отображалось в каждой строке DBCtrlGrid.
II. Использовать TDBComboBox. В этом случае проблем с отображением данных нет. Но для корректной работы с содержимым окна компонента TDBComboBox необходимо, чтобы компонент был связан с полем таблицы БД. Использовать в данном случае вычисляемое поле fkCalculated не получается, поскольку возникает запрет на редактирование содержимого TDBComboBox. Добавлять же в таблицу базы данных еще одно поле, ради реализации пользовательского интерфейса не целесообразно. Может быть имеется возможность “подсунуть” компоненту TDBComboBox какое-либо виртуальное поле (т.е. не находящееся в таблице БД), так, чтобы сохранилась возможно редактирования содержимого компонента TDBComboBox?
И в еще один вопрос. При работе с TDBCtrlGrid пока у меня пока глюков не возникало, но ходят слухи, что этот компонент не надежный и начиная с n-й версии Delphi не поддерживается разработчиками. Это правда?
Надеюсь, что на этот раз, у меня получилось понятно изложить вопрос :)
← →
Fedia © (2005-09-19 05:34) [2]Поправка:
ControlStyle := ControlStyle + [csReplicatable];
← →
ANB © (2005-09-19 10:31) [3]DBLookupComboBox делает то, что тебе нужно.
← →
Fedia © (2005-09-19 23:31) [4]>DBLookupComboBox делает то, что тебе нужно.
1. При помещении этого компонента на TDBCtrlGrid даже его свойство ListSourсe нельзя задать, т.к. при попытке это сделать TDBCtrlGrid сразу выдает сообщение: "Operation not allowed in a DBCtrlGrid".
2. Также как и в DBComboBox, для изменения содержимого окна DBLookupComboBox необходимо, чтобы этот компонент был связан с реально существующим полем таблицы БД.
← →
ANB © (2005-09-19 23:58) [5]Попробуй завести локаповое поле в дейтасете. Тогда оно и в обычном гриде комбобоксом редактироваться будет.
← →
Fedia © (2005-09-20 02:18) [6]Спасибо конечно за вариант, но поле fkLookup также ассоциировано с конкретным полем таблицы БД (свойство KeyFields) и поэтому, а также из-за отсутствия возможности редактирования, не подходит.
← →
ANB © (2005-09-20 08:28) [7]
> Fedia © (20.09.05 02:18) [6]
ну так засунь туда id_ves. Так все и делают. Или уходи на редактирование на отдельной форме, а отображай в гриде запросом по связке 2-х таблиц - основной и справочника (LEFT JOIN). Тогда вообще можно использовать обычные компоненты, только писать больше. Кстати, KeyFields в DBLookupComboBox заполнять не обязательно.
← →
Fedia © (2005-09-20 09:19) [8]>ANB © (20.09.05 08:28) [7]
>ну так засунь туда id_ves. Так все и делают.
Ты имеешь в виду в KeyFields. В стринговое поле типа fkLookup в свойство KeyFields подставить поле типа integer. Надеюсь, я тебя неправильно понял.
>Или уходи на редактирование на отдельной форме, а отображай в гриде
>запросом по связке 2-х таблиц - основной и справочника (LEFT JOIN)
Если бы все было так просто. У меня строго определенный заказ на интерфейс. Причет этот интерфейс продуман настолько удобно, что придраться не к чему. Я и сам двумя руками за него, еще бы и реализовать его без добавления лишнего поля в таблицу БД. А предлагать другой вариант, это все равно, что расписаться в собственном бессилии.
>Кстати, KeyFields в DBLookupComboBox заполнять не обязательно.
Конечно не обязательно. Только если его не указать, то DBLookupComboBox будет неактивным.
← →
ANB © (2005-09-20 11:33) [9]
> В стринговое поле типа fkLookup в свойство KeyFields подставить
> поле типа integer. Надеюсь, я тебя неправильно понял.
Нет, ты меня именно правильно понял. Менять надо ID, вот оно и ключевое, а на экран выйдет локаповое.
← →
Fedia © (2005-09-21 00:44) [10]>Нет, ты меня именно правильно понял. Менять надо ID, вот оно и ключевое, >а на экран выйдет локаповое.
Мысль понял. Спасибо за настойчивость :). Но я не могу использовать fkLookup, т.к. его значение нельзя редактировать вручную, а для решения моей задачи это является необходимым условием. Мне нужно организовать еще поиск по первым введенным в поле ComboBox символам: если в справочнике, в поле ves находим наименование объекта, у которого первые символы совпадают символами, введенными пользователем, то в поле id_ves заносим его код.
← →
ANB © (2005-09-21 00:57) [11]Тогда повесь обычный эдит и рядом кнопку. По кнопке вызовешь всплывающий справочник. И делай в нем, что хочешь.
← →
ANB © (2005-09-21 00:59) [12]Кистате, эхлибовский DBLockupCombo + fkLookup работают просто замечательно.
← →
Fedia © (2005-09-21 01:04) [13]>Тогда повесь обычный эдит и рядом кнопку. По кнопке вызовешь >всплывающий справочник. И делай в нем, что хочешь.
Про Edit я уже писал в [1].
>Кистате, эхлибовский DBLockupCombo + fkLookup работают просто >замечательно.
сейчас попробую.
← →
ANB © (2005-09-21 01:08) [14]
> Про Edit я уже писал в [1].
Делаешь локаповое поле, выводишь его в обычный дбэдит, а по кнопке меняешь ключевое к нему. И все.
← →
Fedia © (2005-09-21 01:12) [15]>Делаешь локаповое поле, выводишь его в обычный дбэдит, а по кнопке >меняешь ключевое к нему. И все.
В стандартном DBEdit также запрещено ручное редактирование поля fkLookup.
← →
Fedia © (2005-09-21 01:14) [16]Ну и к сожалению в DBLookupComboboxEh тоже.
← →
ANB © (2005-09-21 01:18) [17]
> Fedia © (21.09.05 01:12) [15]
- какое поле ты собрался редактировать ? Его же нету ! Ты видишь только текст из справочника, соответствующий твоему id_ves. Перехвати нажатие кнопок, если заказчику неймется и нажми програмно обычную кнопку рядом. А под кнопкой вызови форму справочник.
ЗЫ. А у меня элибовский нормально пахает. Ты его как настраивал ?
← →
ANB © (2005-09-21 01:20) [18]Или выводи на экран честно номер в едите, при OnExit проверяй, что такой номер в справочнике есть, если нету - выдавай справочник. Так раньше программы на Clipper работали.
← →
Fedia © (2005-09-21 01:40) [19]>какое поле ты собрался редактировать ? Его же нету ! Ты видишь только текст из справочника, соответствующий твоему id_ves.
Ну так а я тоже и имею ввиду :)
>Перехвати нажатие кнопок, если заказчику неймется и нажми програмно >обычную кнопку рядом.
При осуществлении поиска по совпадению первых введенных символов никакой список и не должен появляться. Поиск будет происходить после каждого введенного (удаленного символа). Если поиск пройдет успешно, то в поле DBEdit (оссоциированый с id_ves) будет занесено значение из справочника, и комбобоксе, едите или в чем угодно, должно отразиться значение из справочника (только поле ves). Кроме того, процесс ввода пользователем символов должен быть ему виден и отображаться на компоненте, с которым он работает. Я могу попробовать перехватывать нажатие кнопок, но как я содержимое набранного буфера буду пользователю показывать? Не рисовать же его содержимое на компоненте.
>ЗЫ. А у меня элибовский нормально пахает.
Т.е. он позволяет вводить данные с клавиатуры в свое окно, в случае если он настроен на поле fkLookup ?
>Ты его как настраивал ?
В наборе данных создал поле fkLookup.
В DBLookupComboboxEh в свойстве DataSource указал этот набор данных, а в свойстве DataField – название этого поля.
← →
ANB © (2005-09-21 07:59) [20]Ну так и сделай это все на отдельной форме. Можешь помещать ее в удобное для тебя место. DBCtrlGrid - вообще достаточно хитрый компонент. Например, все, что ты на него набросал существует только в единственном экземпляре для текущей записи. Все остальное - нарисовано.
ЗЫ. Задуманная тобой функциональность не очень удобна. А если пользователь захочет просто мышей или стрелками пролистать все значения справочника ? Плюс по первым символам может быть найдено совсем не то, что хотел пользователь. Оптимально - он набирает, а ты ниже показываешь список подходящих вариантов. И в любой момент он может стрелками или мышей выбрать подходящий. Имхо - тормозить на сетевой базе будет и сервер подгружать.
← →
Fedia © (2005-09-21 08:30) [21]>Ну так и сделай это все на отдельной форме.
Не могу я это сделать на отдельной форме, хотя задачу бы это упростило конечно.
>DBCtrlGrid - вообще достаточно хитрый компонент.
Эх. Если бы заставить DBCtrlGrid рисовать на простом ComboBox-се. Ладно, над этим я еще подумаю.
>ЗЫ. Задуманная тобой функциональность не очень удобна.
Справочники не маленькие, поэтому листать их ни у кого желания не возникает. Вводим n-е количество символов названия объекта, нажимаем на кнопку и выводятся по контекстному поиску нужные записи из справочника, дальше стрелками или мышкой выбираем нужный. Для наглядности на гриде отображается сразу пара: код и наименование объекта.
>Имхо - тормозить на сетевой базе будет и сервер подгружать.
Тут есть хитрые приемы, с учетом того, что справочники редактируются крайне редко. Так что не будет.
← →
ANB © (2005-09-21 09:13) [22]
> Не могу я это сделать на отдельной форме
- а кто мешает ? Можно сделать такую форму, что заказчик и не поймет, что это другая. А комбобоксы рисоваться на DBCtrlGrid ты никак не заставишь, я же уже писал, что он их сам рисует и чего не умеет, того не умеет.
← →
Fedia © (2005-09-21 23:29) [23]>- а кто мешает ?
Ты конечно прав. Но одно дело добавлять форму для удобства пользователя и совсем другое, если добавляешь ее, потому, что что-то не можешь реализовать на основной форме. Поэтому этот вариант я и откладываю на крайний случай.
В общем, думаю, что мне расклад сложившейся ситуации понятен. Потом, если не забуду, то напишу, какой из вариантов я выберу.
Большое тебе спасибо.
← →
Fedia © (2005-09-29 23:48) [24]>Потом, если не забуду, то напишу, какой из вариантов я выберу.
Не забыл...
Добавил в БД одну пустую таблицу с двумя полями: id_object и object (условно). Left join-ом присоединяю эту таблицу к другим и таким образом получаю дополнительное поле "наименование объекта", которое могу редактировать.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.357 c