Delphi предоставляет мощный компонент DBGrid для облегчения проектирования приложений баз данных. Но если мы используем только компонент DBGrid, каждый фокус (Grid) представляет собой простое поле редактирования текста, в которое пользователям неудобно вводить данные. Delphi также предоставляет некоторые другие компоненты данных для облегчения пользовательского ввода, такие как DBComboBox, DBCheckBox и другие компоненты, но эти компоненты не так мощны, как DBGrid. Может ли Delphi, как и Visual FoxPRO, разрешить сетке фокуса в DBGrid быть другими компонентами визуальных данных для удобства пользователей? Фактически, мы можем добиться этого, вставив в DBGrid другие визуальные компоненты.
Внутренний механизм Delphi для обработки DBGrid заключается в размещении компонента в сетке — компонента DBEdit. Сетка, в которую вы вводите данные, на самом деле представляет собой плавающий компонент DBEdit, а другие области, на которые не выделяется фокус, — это просто изображения. Таким образом, вставка других визуальных компонентов в DBGrid перемещает визуальный компонент в сетку. Поэтому в DBGrid можно вставить любой компонент, от простого DbCheckBox до сложного диалогового окна. Ниже приведен шаг по вставке компонента DBComboBox в DBGrid. Вы можете вставить другие компоненты, используя тот же метод.
1. Создайте новый проект в Delphi 4.0.
2. Перетащите четыре компонента DataSource и Table на плате компонента доступа к данным, а также DBGrid и DBComboBox на плате компонента Data Controls в Form1 соответственно.
3. Установите свойства каждого компонента следующим образом:
Установка атрибутов объекта rcf1
Надпись Form1 «Пример вставки компонента SpinEdit в DBGrid»
Источник данных1 Таблица набора данных1
Таблица 1. Имя базы данных DBDEMOS.
Имя таблицы 'учитель.DBF'
Активно Правда
DBGrid1 Источник данных DataSource1
DBComboBox1 Поле данных SEX
Источник данныхИсточник данных1
Видимое ложное
Струны «Мужские» |
Примечание. Здесь я использовал файл Teacher.dbf, который отражает пол преподавателей и сотрудников, который может быть только «мужским» или «женским».
4. Событие DrawDataCell предназначено для рисования ячеек. Если поле, соответствующее сетке с фокусом, соответствует полю, соответствующему полю со списком, переместите поле со списком в сетку с фокусом и
Сделайте поле со списком видимым, чтобы получить функцию отображения DBComboBox в указанном столбце DBGrid. Установите событие OnDrawDataCell для DBGrid1 следующим образом:
процедура TForm1.DBGrid1DrawDataCell (Отправитель: TObject; const Rect: TRect; Поле: TField; Состояние: TGridDrawState);
начинать
если (gdFocused в состоянии), то
начинать
если (Field.FieldName = DBComboBox1.DataField), то
начинать
DBComboBox1.Left := Rect.Left + DBGrid1.Left;
DBComboBox1.Top := Rect.Top + DBGrid1.top;
DBComboBox1.Width := Rect.Right - Rect.Left;
DBComboBox1.Height := Rect.Bottom - Rect.Top;
DBComboBox1.Visible := Истина;
конец;
конец;
конец;
5. DBComboBox не отображается, если указанная ячейка в DBGrid не получает фокуса. Установите событие OnColExit для DBGrid1 следующим образом:
процедура TForm1.DBGrid1ColExit (Отправитель: TObject);
начинать
Если DBGrid1.SelectedField.FieldName = DBComboBox1.DataField, то
начинать
DBComboBox1.Visible: = ложь;
конец;
конец;
6. Когда указанный столбец DBGrid получает фокус, событие DrawDataCell только рисует ячейку и отображает DBComboBox, но DBComboBox не получает фокуса, и ввод данных по-прежнему выполняется в ячейке. Вызовите функцию Windows API SendMessage в событии KeyPress DBGrid1, чтобы передать ввод данных в DBComboBox, тем самым обеспечив ввод данных в DBComboBox. Также установите событие KeyPress следующим образом:
процедура TForm1.DBGrid1KeyPress (Отправитель: TObject; Ключ var: Char);
начинать
если (ключ < > chr(9)) то
начинать
если (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField), то
начинать
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle, WM_Char, Word(Key), 0);
конец;
конец;
конец;
Программа прошла отладку под китайскими Windows 98 и Delphi 4.015. Я надеюсь, что эта статья позволит вам более удобно и быстро разрабатывать приложения баз данных.