Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Использование не 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.038 c
14-1130154210
Nic
2005-10-24 15:43
2005.11.13
Разработка форума


14-1129899414
ilya39
2005-10-21 16:56
2005.11.13
сайт по ASP.NET


3-1127822146
VitGun
2005-09-27 15:55
2005.11.13
База Paradox и DOS-приложение


1-1129903716
SANEK_10289
2005-10-21 18:08
2005.11.13
DDE связь...


1-1130081331
TStas
2005-10-23 19:28
2005.11.13
Интерфейсные объекты