Табличное представление данных
Компонент TDBGrid
Этот компонент инкапсулирует двумерную таблицу, в которой строки представляют собой записи, а столбцы — поля набора данных.
Компонент TDBGrid является потомком классов TDBCustomGrid И TCustomGrid.
От класса TCustomGrid наследуются все функции отображения и управления работой двумерной структуры данных. Класс TDBCustomGrid обеспечивает визуализацию и редактирование полей из набора данных, причем TDBGrid только публикует свойства и методы класса TDBCustomGrid, не добавляя собственных.
В компоненте TDBGrid можно отображать произвольное подмножество полей используемого набора данных, но число записей ограничить нельзя — в компоненте всегда присутствуют все записи связанного набора данных. Требуемый набор полей можно составить при помощи специального Редактора столбцов, который открывается при двойном щелчке на компоненте, перенесенном на форму, или кнопкой свойства columns в Инспекторе объектов.
Новая колонка добавляется при помощи кнопки Add New, после этого ее название появляется в списке колонок (рис. 15.2). Для выбранной в списке колонки доступные для редактирования свойства появляются в Инспекторе объектов. Колонки в списке можно редактировать, удалять, менять местами.
При помощи кнопки Add All Fields в сетку можно добавить все поля набора данных.
Каждая колонка компонента TDBGrid описывается специальным классом TColumn, а совокупность колонок доступна через свойство columns компонента, оно имеет тип TDBGridColumns и представляет собой индексированный список объектов колонок. Поле набора данных связывается с конкретной колонкой при помощи свойства FieldName класса TColumn. При этом в колонку автоматически переносятся все необходимые параметры поля, в частности заголовок поля, настройки шрифтов, ширина поля. После ручного изменения параметров первоначальные значения восстанавливаются методами соответствующих объектов Icolumn.
Рис. 15.2. Редактор колонок компонента TDBGrid
При метода метода DefaultDrawColumnCell и метода- обработчика OnDraw-CoiumnCell можно управлять процессом отображения данных в ячейках.
Метод DefauitorawDataCelll предназначен только для обеспечения обратной совместимости по коду с более ранними версиями.
Настройка параметров компонента TDBGrid, от которых зависит его внешний вид и некоторые функции, осуществляется при помощи свойства options (табл. 15.2). Текущая позиция в двумерной структуре данных может быть определена свойствами SelectedField, SelectedRows, Selectedlndex.
При необходимости разработчик может использовать разнообразные методы-обработчики событий. Среди них есть как стандартные методы, присущие всем элементам управления, так и специфические.
Например, при помощи метода-обработчика OnEditButtonClick можно предусмотреть вызов специализированной формы при щелчке на кнопке в ячейке:
procedure TForml.DBGridlEditButtonClick(Sender: TObject);
begin
if DBGridl.Selectedlndex = 2 then SomeForm.ShowModal;
end;
Примечание
Объект колонки TColumn имеет свойство ButtonStyle. Если ему присвоить значение cbsEllipsis, то при активизации ячейки этой колонки в правой части ячейки появляется кнопка.
Таблица 15.2. Свойства и методы компонента WBGrid
Объявление |
Тип |
Описание |
Свойства |
||
property Columns: TDBGridColumns; |
Pb |
Содержит коллекцию объектов TColumn, описывающих колонки компонента |
property DefaultDrawing: Boolean;
|
Pb |
Определяет способ визуализации данных в сетке. При значении True данные отображаются автоматически. При значении False используется метод-обработчик OnDrawColumnCell |
property FieldCount: Integer; |
Ro |
Возвращает число видимых колонок сетки |
property Fields [Index: Integer] : TField; |
Ro |
Массив объектов полей набора данных, отображаемых в компоненте |
TDBGridOption = (dgEditing, dgAlwaysShowEditor, dgTitles, dglndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgMultiSelect) ; TDBGridOptions = set of TDBGridOption; |
Pb |
Определяет особенности визуализации и поведения компонента:
|
property SelectedField: TField; |
Pu |
Содержит объект текущего поля |
property Selectedlndex: Integer; |
Pu |
Содержит номер текущей колонки в массиве свойства Columns |
property SelectedRows: TBookmarkList; |
Ro |
Набор закладок на записи набора данных, соответствующих выделенным строкам сетки |
property TitleFont: TFont; |
Pb |
Шрифт заголовков колонок |
property EditorMode: Boolean; |
Pu |
Показывает, можно ли редактировать текущую ячейку |
property FixedColor: TColor; |
Pb |
Цвет фона неподвижных ячеек сетки |
Методы |
||
procedure DefaultDrawColumnCell (const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) ; |
Pu |
Перерисовывает текст в ячейке колонки с номером DataCol. Ячейка задается прямоугольником Rect на канве сетки. Параметр state определяет состояние ячейки после перерисовки. Параметр Column содержит экземпляр класса колонки, которой принадлежит ячейка |
procedure DefaultDrawDataCell (const Rect: TRect; Field: TField; State: TGridDrawState); |
Pu |
Перерисовывает текст в ячейке колонки, определяемой параметром Field, содержащим связанный с колонкой объект поля. Ячейка задается прямоугольником Rect на канве сетки. Параметр State определяет состояние ячейки после перерисовки |
procedure Def aultHandler (var Msg); override; |
Pu |
Вызывает всплывающее меню для колонки, которой соответствуют текущие координаты мыши. Компонент должен обрабатывать сообщение WM RBUTTONUP |
function ExecuteAction (Action: TBasicAction): Boolean; override; |
Pu |
Выполняет действие, заданное параметром Action, по отношению к данному компоненту |
procedure ShowPopupEditor (Column: I TColumn; X: Integer = Low (Integer); Y: Integer = Low (Integer) ); dynamic; |
Pu |
Открывает набор данных, связанный с передаваемой параметром Column колонкой в новом окне. Работает только для типов данных абстрактный и набор данных. Параметры X и Y определяют положение нового окна |
function | ValidFieldlndex (Fieldlndex: Integer) : Boolean; |
Pu |
Возвращает значение True, если колонка с номером Fieldlndex связана с полем набора данных |
type TGridCoord = record X: Longint;Y: Longint; end; function MouseCoord(X, Y: Integer): TGridCoord; ; |
Pu |
Возвращает номера строки и столбца, соответствующие ячейке, которой принадлежат экранные координаты X и Y |
Методы-обработчики событий |
||
type TDBGridClickEvent = procedure (Column: TColumn) 1 of object; property OnCellClick: TDBGridClickEvent; |
Pb |
Вызывается при щелчке мышью на ячейке. Параметр Column содержит колонку, которой принадлежит ячейка |
property OnColEnter: TNotifyEvent; |
Pb |
Вызывается при переносе фокуса на новую колонку сетки |
property OnColExit: TNotifyEvent; |
Pb |
Вызывается перед переносом фокуса из текущей колонки |
type TMovedEvent = procedure (Sender: TObject; Froinlndex, Tolndex: Longint) of object; property OnColumnMoved: TMovedEvent ; |
Pb
|
Вызывается при переносе колонки в сетке на новое место при помощи мыши. Параметр Fromindex возвращает номер старого положения колонки. Параметр Tolndex возвращает номер нового положения колонки |
type TDrawColumnCellEvent = procedure (Sender: TObject; const Rect : TRect; DataCol : State: TGridDrawState) of object; property OnDrawColurnnCell : TDrawColumnCellEvent; |
Pb |
Вызывается при перерисовке ячейки. Параметр Rect определяет ячейку по координатам прямоугольника на канве. Параметр DataCol возвращает номер колонки в сетке. Параметр Column содержит объект колонки. Параметр State возвращает состояние колонки |
type TDrawDataCellEvent = procedure (Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState) of object; property OnDrawDataCell: TDrawDataCellEvent; |
Pb |
I Вызывается при перерисовке ячейки | перед обработчиком OnDrawCoiumnCell, если свойство Columns. State =csDefault. Этот метод лучше не применять, т. к. он используется только для обеспечения обратной совместимости с ранними версиями |
property OnEditButtonClick: TNotifyEvent; |
Pb |
1 Вызывается при щелчке мышью на кнопке в ячейке |
type TDBGridClickEvent = procedure (Column: TColumn) of object; property OnTitleClick: TDBGridClickEvent; |
Pb |
| Вызывается при щелчке мышью на заголовке колонки. Колонка определяется параметром Column |
В работе компонента TDBGrid важную роль играет класс TColumn, который инкапсулирует свойства колонки или столбца сетки (табл. 15.3). Его основным назначением является правильное отображение данных из поля набора данных, связанного с этой колонкой. Поэтому объект колонки обладает свойствами и методами, которые позволяют произвольным образом задавать параметры отображения данных (цвет, шрифт, ширину и т. д.). Первоначальные значения берутся из связанных с колонками полей. Измененные свойства можно восстановить при помощи группы специальных методов (DefauitColor, DefaultFont И др.).
Свойство Assignedvalues позволяет в любой момент определить, какие первоначальные настройки были изменены.
За отображение заголовка колонки отвечает свойство Title, представляющее собой ссылку на экземпляр объекта TColumnTitie. Здесь можно задать текст заголовка, параметры шрифта текста заголовка и цвет фона заголовка. По умолчанию текст заголовка берется из свойства DispiayLabel объекта TField (CM. гл. 13).
Каждой колонке можно придать список, который разворачивается при щелчке на кнопке в активной ячейке колонки. Выбранное в списке значение автоматически заносится в ячейку. Для реализации этой возможности применяется свойство pickList типа TStrings. Достаточно лишь заполнить список значениями во время разработки или выполнения (рис. 15.3).
Рис. 15.3. Список колонки в компоненте TDBGrid
Таблица 15.3. Свойства и методы класса TColumn
Объявление |
Тип |
Описание |
Свойства |
||
property Alignment: TAlignment; |
Pb |
Определяет выравнивание данных в колонке |
type TColumnValue = (cvColor, cvWidth, cvFont, cvAlignment, cvReadOnly, cvTitleColor, cvTitleCaption, cv'i'itleAlignment, cvTitleFont, cvImeMode, cvImeName) ; TColuinnValues = set of TColumnValue; property AssignedValues: TColuranValues ; |
Ro |
Возвращает набор атрибутов колонки, которые были изменены по сравнению с первоначальными
|
type TColumnButtonStyle = (cbsAuto, cbsEllipsis, cbsNone) ; property ButtonStyle: TColumnButtonStyle; |
Pb |
Задает способ редактирования данных в колонке:
|
property Color: TColor; |
Pb |
Цвет фона колонки |
property DisplayName: string; |
Pu |
Название колонки в списке Редактора столбцов |
property DropDownRows: Cardinal; |
Pb |
Определяет число строк разворачивающегося списка ячейки |
property Expandable: Boolean; |
Pu |
В значении True разрешает показ связанных с полем колонки дочерних полей абстрактного, ссылочного типов и массивов |
property Expanded: Boolean; |
Pb |
При значении True каждое дочернее поле отображается в новой колонке. При значении False дочерние поля отображаются через точку с запятой и не доступны для редактирования |
property FieldName: string; |
Pb |
Название поля, связанного с колонкой |
property Font: TFont; |
Pb |
Шрифт данных в колонке |
property Grid: TCustomDBGrid; |
Ro |
Определяет сетку, содержащую эту колонку |
property ParentColumn: TColumn; |
Ro |
Определяет колонку-владельца текущей колонки. Используется для дочерних полей |
property PickList: TStrings; |
Pb |
Содержит разворачивающийся список, используемый при редактировании данных |
property PopupMenu: TPopupMenu; |
Pb |
Связывает с колонкой всплывающее меню |
property Showing: Boolean; |
Ro |
Возвращает значение True, если колонка видима |
property Title: TColumnTitle; |
Pb |
Задает текст заголовка и его параметры |
property Visible: Boolean; |
Pb |
Задает видимость колонки |
property Width: Integer; |
pb |
Задает ширину колонки в пикселах |
Методы |
procedure Assign (Source: TPersistent); override; |
Pu |
Копирует колонку Source в текущую колонку |
function Def aultAlignment: TAlignment; |
Pu |
Возвращает первоначальное значение выравнивания колонки |
function DefaultColor: TColor; |
Pu |
Возвращает первоначальный фоновый цвет колонки |
function DefaultFont: TFont; |
Pu |
Возвращает первоначальный шрифт данных в колонке |
type TIraeMode = (imDisable, iraClose, imOpen, imDontCare, imSAlpha, imAlpha, imHira, imSKata, irnKata, imChinese, imSHanguel, imHanguel); function DefaultlmeMode: TImeMode; |
Pu |
Возвращает первоначальный способ ввода символов |
type TImeName = type string; function DefaultlmeName: TImeName; |
Pu |
Возвращает первоначальное имя редактора способа ввода символов |
function DefaultReadOnly: Boolean; |
Pa |
: Возвращает первоначальный режим редактирования данных |
function DefaultWidth: Integer; |
Pu |
Возвращает первоначальную ширину колонки в пикселах |
function Depth: Integer; |
Pu |
; Возвращает число непосредственных предков колонки |
procedure RestoreDefaults; virtual; |
Pu |
i Восстанавливает первоначальные настройки колонки |
При работе с компонентом TDBGrid все операции с отдельными колонками осуществляются при помощи экземпляра класса TDBGridColumns, который инкапсулирует список объектов колонок (свойство Columns компонента TDBGrid). Доступ к колонкам осуществляется при помощи свойства items. Нумерация колонок начинается с нуля.
При помощи свойств и методов класса TDBGridColumns можно изменять настройки полей компонента TDBGrid во время выполнения (табл. 15.4).
Свойство state определяет способ создания колонок. Его значение устанавливается автоматически. При создании колонок для всех полей сразу (кнопка Add All Fields Редактора столбцов) устанавливается значение csDefault.
При любом ручном изменении свойств устанавливается значение csCustomized. При программном изменении значения свойства во время выполнения все существующие колонки удаляются.
Все данные из существующих колонок можно сохранить в файле или потоке при помощи методов SaveToFile и saveToStream, а затем загрузить их обратно методами LoadFromFile И LoadFromStream.
Таблица 15.4. Свойства и методы класса TDBGridColumns
Объявление |
Тип |
Описание |
Свойства |
||
property Grid: TCustomDBGrid; |
Ro |
Возвращает ссылку на сетку, владеющую данным объектом |
property Items [Index: Integer] : TColumn default; |
Pu |
Индексный список объектов колонок сетки: |
type TDBGridColumnsState = (csDefault, csCustomized) ; property State: TDBGridColumnsState; |
Pu |
Определяет способ создания колонок сетки:
|
property Count: Integer; |
Pu |
Возвращает общее число колонок |
Методы |
||
function Add: TColumn; |
Pu |
Добавляет новый объект TColumn |
procedure LoadFromFile (const Filename: string); |
Pu |
Загружает данные в объект из файла FileName |
procedure LoadFromStream(S: TStream) ; |
Pu |
Загружает данные в объект из потока s |
procedure RebuildColumns; |
Pu |
Удаляет существующие колонки и создает новые, основываясь на параметрах полей набора данных |
procedure RestoreDefaults; |
Pu |
Восстанавливает первоначальные настройки колонок |
procedure SaveToFiie (const Filename: string); |
Pu |
Сохраняет данные из колонок в файле FileName |
procedure SaveToStream(S: TStream) ; |
Pu |
Сохраняет данные из колонок в потоке s |
Дело в том, что в его постановке и выводах произведена подмена, аналогичная подмене в школьной шуточной задачке на сообразительность, в которой спрашивается:
- Cколько яблок на березе, если на одной ветке их 5, на другой ветке - 10 и так далее
При этом внимание учеников намеренно отвлекается от того основополагающего факта, что на березе яблоки не растут, в принципе.
В эксперименте Майкельсона ставится вопрос о движении эфира относительно покоящегося в лабораторной системе интерферометра. Однако, если мы ищем эфир, как базовую материю, из которой состоит всё вещество интерферометра, лаборатории, да и Земли в целом, то, естественно, эфир тоже будет неподвижен, так как земное вещество есть всего навсего определенным образом структурированный эфир, и никак не может двигаться относительно самого себя.
Удивительно, что этот цирковой трюк овладел на 120 лет умами физиков на полном серьезе, хотя его прототипы есть в сказках-небылицах всех народов всех времен, включая барона Мюнхаузена, вытащившего себя за волосы из болота, и призванных показать детям возможные жульничества и тем защитить их во взрослой жизни. Подробнее читайте в FAQ по эфирной физике.