Използване на не-DB компонент на DBCtrlGrid
Добър ден !
Базата данни съдържа директорията ves с полета id_ves (тип int (11)) и ves (тип Char (40)). Също така в базата данни има много таблици, съдържащи полето id_ves. Необходимо е да се организира визуален интерфейс за удобно попълване на полето id_ves в тези таблици. За това предполагам да използвам компонента DBCtrlGrid, върху който ще бъдат поставени компонентите DBEdit и ComboBox. Когато кликнете върху бутона ComboBox, трябва да се появи падащ списък, в който трябва да се покажат записите на таблицата ves в следната форма: “id_ves + space + ves”. Потребителят избира необходимия запис от падащия списък, след което стойността на полето id_ves се въвежда в компонента DBEdit, а полетата ves - в компонента ComboBox. Но има един дефект в горното свързване на компоненти, който не мога да поправя: стойността на свойството ComboBox.Text се показва само за текущия запис на таблицата, показана в DBCtrlGrid, в останалата част тя се показва празна. Тук ви моля да ми помогнете да се справя с този проблем.
Веднага забелязвам, че когато използвате компонента DBComboBox, тази схема работи, но за да я приложите в попълнената таблица, трябва да добавите още едно физическо поле, което е крайно нежелателно.
Ще се опитам да изясня въпроса.
Имам две възможности за внедряване на горния интерфейс. Може би някой може да предложи други опции.
I. Използвайте TComboBox. В този случай стойността ComboBox.text се показва само в текущия запис на набора от данни и имам нужда това свойство да се показва за всички записи на таблици, видими в DBCtrlGrid. Освен това стойността на това свойство може да е различна, в зависимост от съдържанието на компонента DBEdit.
Разбирам, че тук не можете да промените компонента TComboBox, но трябва да знам поне посоката, в която да копая.
Например: 1. В конструктора на компоненти TEdit напишете:
ControlStyle: = ControlStyle + csReplicatable;
2. Свържете DBCtrlGrid към набора от данни;
3. Поставете TEdit в DBCtrlGrid. Въпрос: Какво трябва да се направи с компонента TEdit (или TComboBox), така че стойността на текстовото свойство да се показва на всеки ред от DBCtrlGrid.
II. Използвайте TDBComboBox. В този случай няма проблеми с показването на данни. Но за правилната работа със съдържанието на прозореца на компонента TDBComboBox, компонентът трябва да бъде свързан с полето на таблицата на базата данни. В този случай не е възможно да се използва изчисленото поле fkCalculated, тъй като е забранено редактирането на съдържанието на TDBComboBox. Не е препоръчително да добавяте още едно поле към таблицата на базата данни с цел прилагане на потребителския интерфейс. Може да е възможно да "подхлъзнете" компонента TDBComboBox виртуално поле (т.е. не в таблицата на базата данни), така че да е възможно да редактирате съдържанието на компонента TDBComboBox?
И още един въпрос. Докато работя с TDBCtrlGrid, все още не съм имал проблеми, но има слухове, че този компонент не е надежден и тъй като n-тата версия на Delphi не се поддържа от разработчиците. Вярно е?
Надявам се, че този път успях ясно да заявя въпроса:)
Корекция: ControlStyle: = ControlStyle + [csReplicatable];
DBLookupComboBox прави това, от което се нуждаете.
> DBLookupComboBox прави това, от което се нуждаете.
1. Когато поставяте този компонент в TDBCtrlGrid, дори неговото свойство ListSourсe не може да бъде зададено, тъй като когато се опитвате да направите това, TDBCtrlGrid незабавно показва съобщението: "Операцията не е разрешена в DBCtrlGrid".
2. Както и в DBComboBox, за промяна на съдържанието на прозореца DBLookupComboBox е необходимо този компонент да е свързан с реално поле на таблицата на базата данни.
Опитайте се да създадете поле за заключване в набора от данни. Тогава той ще бъде редактиран в обикновена мрежа от комбобокс.
Благодаря за опцията, разбира се, но полето fkLookup също е свързано със специфично поле на таблицата на базата данни (свойство KeyFields) и поради това, а също и поради липсата на възможности за редактиране, не е подходящо.
> добре поставете id_ves там. Това правят всички.
Имате предвид в KeyFields. В низово поле от тип fkLookup заменете цяло число в свойството KeyFields. Надявам се, че съм ви разбрал погрешно.
> Или отидете за редактиране в отделен формуляр и покажете в мрежата
> заявка за връзка от 2 таблици - основната и препратката (НАЛЯВО ПРИСЪЕДИНЯВАНЕ)
Само да беше толкова просто. Имам строго определен ред за интерфейса. Освен това този интерфейс е обмислен толкова удобно, че няма от какво да се оплаквате. Аз самият го правя с две ръце, все пак бих го приложил, без да добавям допълнително поле към таблицата на базата данни. И предлагането на друга възможност е като да подпишете собствената си импотентност.