Поставяне на компоненти в DBGrid

Поставяне на компоненти в DBGrid

Материално съдържание

Този съвет и придружаващият код показват колко лесно е да поставите който и да е компонент в клетка от мрежа с данни. Компонент в този контекст може да означава всеки видим контрол, от обикновен разгъващ се списък до сложен диалогов прозорец. Методите, описани по-долу, са приложими за почти всеки визуален компонент. Ако можете да го поставите във формуляр, вероятно можете да го поставите и в клетка на DBGrid.

Тук няма нови идеи, всъщност основната технология на работа е да се имитират-трансплантират външни компоненти в DBGrid. Идеята е да се поеме контрола върху решетката на таблицата. На практика DBGrid се състои от набор от TDBEdit компоненти. Като въвеждате данни в клетка, вие работите директно с TDBEdit. Останалите нефокусирани клетки наистина са статична картина в момента. В този съвет ще научите как да поставите визуален компонент, различен от TDBEdit, във фокусирана клетка.

Имате нужда от формуляр с DBGrid компонент върху него. Създайте нов проект и го поставете в главната DBGrid форма.

След това поставете TTable във формуляра, задайте Alias ​​​​на DBDEMOS, TableName на GRIDDATA.DB и задайте свойството Active на True. Поставете DataSource и препратете в свойството DataSet към Table1. Върнете се към DBGrid и задайте свойството DataSource на компонента DataSource1. Данните от GRIDDATA.DB трябва да се показват в решетката на таблицата.

Първият елемент, който ще поставим в DBGrid, е TDBLookupCombo, защото имаме нужда от втора справочна таблица. Поставете втората TTable върху формуляра. Задайте псевдонима на DBDEMOS, TableName на CUSTOMER.DB и задайте свойството Active на True. Поставете втори източник на данни и се обърнете къмсвойство DataSet на Table2.

Сега трябва да поставите компонента TDBLookupCombo от палитрата Data Controls навсякъде във формуляра - няма значение, т.к. обикновено ще бъде невидим или ще бъде имплантиран от нас в мрежата на масата. Задайте свойствата на компонента LookuoCombo, както следва:

но сега нека бъде CustNo)

Досега сме конфигурирали само компонентите. Сега нека създадем код.

Първото нещо, което трябва да направите, е да се уверите, че DBLookupCombo, който сте поставили във формуляра, остава невидим по време на стартиране на приложението. За да направите това, изберете Form1 в инспектора на обекти, отидете в раздела Събития и щракнете двукратно върху събитието onCreate. Delphi незабавно ще генерира и покаже скелета на кода на бъдещия манипулатор на събития onCreate:

процедура TForm1.FormCreate(Подател: TObject);

Задайте свойството Visible на False в LookupCombo, както следва:

процедура TForm1.FormCreate(Подател: TObject);

Сигурен съм, че много хора се чудеха защо не използвах Object Inspector, за да променя свойствата на компонента. Наистина може и така да е. Лично аз така инициализирам компоненти, чиито свойства могат да се променят, докато приложението работи. Промених статично свойство, което не се вижда по време на проектиране (с помощта на инспектора на обекти). Мисля, че това прави кода по-лесен за разбиране.

Сега трябва да "завинтим" компонента към нашата решетка на масата. Нашата цел е автоматично да показваме DBLookupCombo в клетката, когато получи фокус (или премести курсора). За да направите това, трябва да напишете код за два манипулатора на събития: OnDrawDataCell и OnColExit. Първо, нека се справим със събитието OnDrawDataCell. Кликнете два пъти върху реда OnDrawDataCellв инспектора на обекти и въведете следния код:

процедура TForm1.DBGrid1DrawDataCell(Подател: TObject; const Rect: TRect;

Поле: TField; състояние: TGridDrawState);

if (gdFocused in State) тогава

ако (Field.FieldName = DBLookupCombo1.DataField) тогава

DBLookupCombo1.Left := Rect.Left + DBGrid1.Left;

DBLookupCombo1.Top := Rect.Top + DBGrid1.top;

DBLookupCombo1.Width := Rect.Right - Rect.Left;

Скоро ще станат ясни причините за прекомерното използване на конструкции начало/край. Кодът "казва", че ако параметърът State е зададен на gdFocused, тогава тази клетка има фокус (в даден момент само една клетка в решетката на таблицата може да има фокус). Следва: ако това е избрана клетка и клетката има същото име на полето като полето с данни DBLookupCombo, DBLookupCombo трябва да бъде поставено над тази клетка и да стане видимо. Обърнете внимание на дефиницията на позицията на DBLookupCombo: тя е спрямо формата, а не към клетката. Така, например, позицията на лявата страна на LookupCombo трябва да вземе предвид позицията на мрежата (DBGrid1.Left) плюс позицията на съответната клетка спрямо мрежата (Rect.Left).

Сега, за забавление, стартирайте програмата. Спечелени? Веднага след стартиране преместете курсора до една от клетките на мрежата. Очаквахте ли нещо повече? да Ние сме едва по средата на пътя. Сега трябва да скрием LookupCombo, когато курсорът напусне колоната. Нека напишем манипулатора на събития onColExit. Трябва да изглежда нещо подобно:

процедура TForm1.DBGrid1ColExit(Подател: TObject);

Ако DBGrid1.SelectedField.FieldName = DBLookupCombo1.DataField тогава

Кодът използва свойството TDBGrids SelectedField, за да асоциира името на полето на клетката (FieldName) с нашия LookupCombo. Кодът „казва“: „Ако клетката беше в колона с DBLookupCombo(името на полето на клетката е същото като името на полето на DBLookupCombo), то трябва да бъде направено невидимо."

Сега стартирайте приложението отново. Усещате ли ефекта?

Сега всичко изглежда правилно, но забравихме за едно нещо. Опитайте да въведете нова стойност в един от LookupCombo. Проблемът е, че натискането на клавиша се обработва от DBGrid, а не от LookupCombo. За да коригираме това, трябва да напишем манипулатор на събития onKeyPress за решетката на таблицата. Трябва да изглежда нещо подобно:

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);

if (клавиш <> chr( 9 )) тогава

ако (DBGrid1.SelectedField.FieldName = DBLookupCombo1.DataField) тогава

SendMessage(DBLookupCombo1.Handle, WM_Char, word(Key), 0);

Този код "казва": ако натиснатият клавиш не е клавиш Tab (Chr(9)) и текущото поле в решетката на таблицата е LookupCombo, тогава задайте фокуса на LookupCombo и изпратете съобщение с кода на натиснатия клавиш към LookupCombo. Тук използвах функцията WIN API. Не е нужно да знаете как работи, достатъчно е просто да работи.

Стартирайте приложението си отново и опитайте да въведете нещо. Работи! Като експериментирате, ще видите, че с клавиша Tab можете да превключвате от режим на редактиране в режим на преместване на курсора и обратно.

Сега отидете на инспектора на обекти и променете свойството LookupDIsplay на компонента DBLookupCombo на Company. Тичай отново. Това ли очакваше?

КОМПОНЕНТ #2 - TDBCOMBO

Тук няма да обсъждам технологията за имплантиране DBCombo, тъй като тя е практически същата като тази, показана по-горе. Всичко написано в точка №1 важи и тук. Ето код стъпка по стъпка за вашия компонент.