Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1129816409
проходил_мимо_решил_зайти
2005-10-20 17:53
2005.11.13
Мемо и печать


3-1127905448
Dail
2005-09-28 15:04
2005.11.13
Как распечатать cxGrid???


2-1129229041
illy
2005-10-13 22:44
2005.11.13
Реестр


4-1126174606
jeka_t
2005-09-08 14:16
2005.11.13
Есть ли функция, которая возвращает "Описание" в "Имени компьютер


2-1130096590
redlord
2005-10-23 23:43
2005.11.13
ХЕШ код строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский