Управление TDBGrid во время выполнения
Объект DBGrid может быть полностью реконфигурирован во время выполнения программы. Вы можете прятать и показывать колонки, изменять порядок показа колонок и их ширину.
Вы можете использовать свойство Options объекта DBGrid, чтобы изменить ее представление. Свойство Options может принимать следующие возможные значения:
DgEditing | Установлен по-умолчанию в true, позволяет пользователю редактировать grid. Вы можете также установить свойство ReadOnly grid в True или False. | |
DgTitles | Будут ли видны названия колонок. | |
DgIndicator | Будут ли видны небольшие иконки слева. | |
DgColumnResize | Может ли пользователь менять размер колонки. | |
dgColLines | Показывать ли линии между колонками. | |
dgRowLines | Показывать ли линии между строками. | |
dgTabs | Может ли пользователь использовать tab и shift-tab для переключения между колонками. |
Как объявлено в этой структуре: TDBGridOption = (dgEditing, gdAlwaysShowEditor, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs);
Например Вы можете установить опции в Runtime написав такой код: DBGrid1.Options := [dgTitles, dgIndicator];
Если Вы хотите включать и выключать опции, это можно сделать с помощью логических операций. Например, следующий код будет добавлять dgTitles к текущему набору параметров: DBGrid1.Options := DBGrid1.Options + [dgTitles];
Пусть есть переменная ShowTitles типа Boolean, тогда следующий код позволяют включать и выключать параметр одной кнопкой: procedure TForm1.Button3Click(Sender: TObject); begin if ShowTitles then DBGrid1.Options := DBGrid1.Options + [dgTitles] else DBGrid1.Options := DBGrid1.Options - [dgTitles]; ShowTitles := not ShowTitles; end;
Если Вы хотите скрыть поле в run-time, то можете установить свойство visible в false: Query1.FieldByName('CustNo').Visible := False; Query1CustNo.Visible := False;
Обе строки кода выполняют идентичную задачу. Чтобы показать поле снова, установите видимый в true: Query1.FieldByName('CustNo').Visible := True; Query1CustNo.Visible := True;
Если Вы хотите изменить положение колонки в Runtime, можете просто изменить индекс, (первое поле в записи имеет индекс нуль): Query1.FieldByName('CustNo').Index := 1; Query1CustNo.Index := 2;
По-умолчанию, поле CustNo в таблице Customer является первым. Код в первой строке перемещает это поле во вторую позицию, а следующая строка перемещает его в третью позицию. Помните, что нумерация полей начинается с нуля, так присвоение свойству Index 1 делает поле вторым в записи. Первое поле имеет Index 0.
Когда Вы изменяете индекс поля, индексы других полей в записи изменяются автоматически.
Если Вы хотите изменить ширину колонки в Runtime, только измените свойство DisplayWidth соответствующего TField. Query1.FieldByName('CustNo').DisplayWidth := 12; Query1CustNo.DisplayWidth := 12;
Величина 12 относится к числу символов, которые могут быть показаны в видимом элементе.
Программа DBGR_RT показывает как работать с DBGrid в Runtime. Программа достаточно проста, кроме двух небольших частей, которые описаны ниже. Первая часть показывает, как создать check box в Runtime, а вторая показывает, как изменить порядок пунктов в listbox в Runtime.
При создании формы (событие OnCreate) ListBox заполняется именами полей, далее создается массив объектов CheckBox, соответствующий полям в таблице. Сперва все CheckBox'ы выбраны и все поля в таблице видимы. Программа узнает через TTable1 имена полей и присваивает их свойству Caption соответствующего CheckBox. Кроме того, обработчику события OnClick всех CheckBox'ов присваивается процедура ChBClick, которая и включает/выключает поля в DBGrid. procedure TForm1.FormCreate(Sender: TObject); var i : Word; R : Array[0..49] of TCheckBox; begin {Fill ListBox} ListBox1.Clear; for i:=0 to Table1.FieldCount-1 do ListBox1.Items.Add(Table1.Fields[i].FieldName); {Make CheckBoxes} for i:=0 to Table1.FieldCount-1 do begin R[I] := TCheckBox.Create(Self); R[I].Parent := ScrollBox1; R[I].Caption := Table1.Fields[i].FieldName; R[I].Left := 10; R[I].Top := I * CheckBox1.Height + 5; R[I].Width := 200; R[I].Checked := True; R[I].OnClick := ChBClick; end; end;
Большая часть кода в этом примере выполняет относительно простые задачи, типа назначения имен и положений check boxes. Вот две ключевых строки: R[I] := TCheckBox.Create(Self); R[I].Parent := ScrollBox1;
Первая строки создает CheckBox с заданным Owner (Владельцем). Вторая строки назначает Parent (Родителя) для CheckBox. Чтобы понять различия между Родителем и Владельцем, посмотрите соответствующие свойства в online-help.
Программа содержит ListBox, который показывает текущий порядок полей в DataSet. Для изменения порядка полей в DataSet (а, следовательно, в DBGrid) используются две кнопки. При нажатии на одну из кнопок, выбранное в ListBox'е поле перемещается на одну позицию вверх или вниз. Синхронно с этим меняется и порядок полей в DBGrid. Код, показанный ниже, изменяет Index поля для Table1, изменяя, таким образом, позицию поля в DBGrid. Эти изменения касаются только визуального представления DataSet. Физически данные на диске не изменяются. procedure TForm1.downButtonClick(Sender: TObject); var i : Integer; begin with ListBox1 do if (ItemIndex<Items.Count-1)and(ItemIndex<>-1) then begin i := ItemIndex; {move ListBox item} Items.Move(i, i+1); ItemIndex := i+1; {move Field} Table1.Fields[i].Index:=i+1; end; end;
Последняя строка в примере как раз та, которая фактически изменяет индекс колонки, которую пользователь хочет переместить. Две строки кода непосредственно перед ней перемещают текущую строку в ListBox на новую позицию.
Внешний вид программы DBGR_RT показан на рис.4
Рис.4: Программа DBGR_RT