11.4. Компонент tdbRadioGroup
Компонент TDBRadioGroup служит для предоставления фиксированного набора возможных значений поля при помощи группы зависимых переключателей. Этот компонент обладает функциональностью компонента TRadioGroup, но источником данных и их приемником в этом случае служит поле НД.
Свойства
property DataSource : TDataSource;
property DataField: string;
property ReadOnly: Boolean;
аналогичны по назначению одноименным полям компонента TDBEdit.
Напомним, что число и названия вариантов возможных значений поля, содержащихся в TDBRadioGroup, определяются в его свойстве Items: TStrings.
Пример. Расширим пример, приведенный выше для компонента TDBCheckBox. Пусть в ТБД "TOV.DB" имеется поле Hranenie типа String, которое может принимать только 2 значения ("до 5 дней", "свыше 5 дней"). Для выбора одного из этих значений добавим в форму компонент DBRadioGroup1, связав его с DataSource 1 и указав в свойстве DataField на поле Hranenie (рис. 11.4):
Заметим, что индекс текущего выбора можно определить, используя свойство TDBRadioGroup.ItemIndex : Integer, которое возвращает номер выбранного значения в порядке, в котором они определены в TDBRadioGroup.Items; при этом отсчет ведется с 0. Например, для приведенного выше примера (товар "Колбаса краковская") DBRadioGroupl. ItemIndex = 0.
Свойство property Value: string; возвращает значение поля, связанного с компонентом TDBRadioGroup, в текстовом виде.
Свойство property Columns: Integer указывает, сколько назначено столбцов для вывода переключателей (в примере на рис. 11.4. Columns = 2
Событие property OnChange: TnotifyEvent наступает при изменении значения поля, связанного с компонентом TDBRadioGroup.
События property OnEnter: TNotifyEvent; property OnExit: TNotifyEvent; наступают при получении и утрате фокуса управления компонентом.
11.5. Компонент tdbListBox
Компонент TDBListBox применяется, когда нужно выбрать значение поля из предустановленного списка значений. Возможные значения содержатся в качестве строк компонента TDBListBox.
Свойства property DataSource : TDataSource; property DataField: string; property ReadOnly: Boolean; аналогичны по назначению одноименным свойствам компонента TDBEdit.
Свойство property Items: TStrings; содержит список возможных значений поля.
Пример. Пусть в ТБД "TOV.DB" имеется поле Hranenie типа String, которое может принимать только 2 значения ("до 5 дней", "свыше 5 дней"). Для выбора одного из этих значений добавим в форму компонент DBListBox1, связав его с DataSource1 и указав в свойстве DataField на поле Hranenie (рис. 11.5).
События property OnEnter: TNotifyEvent; property OnExit: TNotifyEvent; наступают при получении и утрате фокуса управления компонентом TDBEdit.
События property OnClick: TNotifyEvent; property OnDblClick: TNotifyEvent; наступают при одиночном и двойном щелчке мышью на компоненте TDBListBox
11.6. Компонент TDBComboBox
Этот компонент аналогичен компоненту TDBListBox, за исключением того, что в режиме dsBrowse текущее значение поля показывается аналогично TDBEdit, а в режимах добавления (dslnsert) и редактирования (dsEdit) при занесении значения в поле появляется "выпадающий список" (рис. 11.6.). Длина списка в строках определяется свойством property DropDownCount: Integer;
11.7. Компонент TDBLookupComboBox
Компонент TDBLookupComboBox применяется для выбора значений в поле одного набора данных (назовем его НД-1) из списка значений, источником которого выступают значения какого-либо поля из другого набора данных (НД-2). Наборы данных НД-1 и НД-2 связываются по полю связи. Это поле присутствует и в НД-1, и в НД-2 и имеет идентичный тип. Таким образом, НД-1 и НД-2 состоят в связи, как правило, "многие (НД-1) к одному (НД-2)". При этом реляционная связь может быть не оформлена при помощи первичного (НД-1) и внешнего (НД-2) индексов. Поэтому вхождения поля связи ни в текущий, ни в какой-либо иной индекс не требуется.
Разберем ключевые свойства и методы компонента TDBLookupListBox.
property DataSource: TDataSource; - указывает на компонент TDataSource, связанный с набором данных-1.
property DataField: string; - устанавливает поле НД-1, в которое будет помещаться значение из НД-2.
property ListSource: TDataSource; - указывает на компонент TDataSource НД-2.
property ListField: String; - устанавливает поле, значения которого будут показываться в списке выбора. Если значение не заполнено, берется значение свойства Key Field.
Можно указать несколько полей. Тогда все они будут показываться в списке выбора. Имена полей разделяются точкой с запятой.
property RowCount: Integer; - указывает, сколько строк показывается в выпадающем списке. При изменении размеров списка, например путем занесения нового значения в свойство Height, RowCount изменятся автоматически.
property KeyField: string; - устанавливает поле связи между наборами данных 1 и 2.
property KeyValue: Variant; - содержит текущее значение поля связи. Если во время выполнения программы его значение изменится, будет осуществлена попытка отыскать в НД-2 запись со значением, содержащимся в этом свойстве.
Пример. Пусть в ТБД "Сотрудники" (поле Doljnost) нужно вводить значения из списка, определяемого полем Doljnost ТБД "Должности, оклады". Для иллюстрации будем в списке показывать также значения поля Oklad ТБД "Должности, оклады".
С ТБД "Сотрудники" связан НД TeachersTable (TTable), с ТБД "Должности, оклады" - НД OkladyTable (TTable). С ними соответственно связаны компоненты TDataSource DS_Teachers и DS_Oklady.
Для ввода в поле Doljnost (НД TeachersTable) разместим в форме компонент DBLookupComboBox1 и установим такие значения его свойств:
DataSource DS_Teachers
DataField Doljnost
ListSource DS_Oklady
ListField OklaD;Doljnost
KeyField Doljnost
Тогда при занесении значения в поле Doljnost НД TeachersTable получим комбинированный список значений оклада и должности из НД OkladyTable (рис. 11.7).
В компоненте определены свойства property DropDownAlign : TAlign; property DropDownRows: Integer; property DropDownWidth: Integer; определяющие соответственно выравнивание, число строк в списке и его ширину, а также методы procedure DropDown; - раскрывает ("распахивает") список выбора;
procedure CloseUp; - сворачивает распахнутый список выбора.
11.8. Компонент TDBLookupListBox
Повторяет функциональность компонента TDBLookupComboBox, за исключением того, что выбор производится не из постоянно присутствующего на экране, а "раскрывающегося" (или "выпадающего") списка. Отсутствуют следующие свойства и методы компонента TDBLookupComboBox: DropDownAlign, DropDownRows, DropDown Width, DropDown и CloseUp.
11.9. Компонент TDBMemo
Компонент TDBMemo предназначен для показа мемо-полей (полей комментариев). Поля комментариев могут хранить многострочные тексты. Компонент TDBMemo является аналогом компонента TMemo с той лишь разницей, что источником данных в этом случае служит поле комментария набора данных.
При корректировке текста комментария в компоненте TDBMemo набор данных, к которому принадлежит поле комментария, автоматически переводится в состояние dsEdit.
Пример. Пусть в ТБД "TOV.DB" имеется поле комментария Komment. Расположим в форме компонент DBMemo1 и укажем в его свойстве DataSource имя компонента TDataSource, связанного с НД, к которому принадлежит поле
комментария После этого в свойстве DataField из выпадающего списка выберем имя поля Komment. Если нужно представлять текст комментария только для просмотра, установим в свойство ReadOnly компонента DBMemo1 значение True, а если текст может изменяться - значение False (рис. 11.8).
Свойство AutoDisplay : Boolean; в состоянии True указывает на необходимость того, чтобы любые изменения в поле НД автоматически отображались и в TDBMemo. В состоянии False подобные действия не производятся и обновление информации в TDBMemo необходимо производить программно.
Свойство Alignment; TAlignment; определяет выравнивание текста в TDBMemo - влево (taLeftJustify), вправо (taRightJustify), по центру (taCenter).
Свойство WordWrap : Boolean; в состоянии Тгие разрешает показывать с новой строки те слова, которые не умещаются в области показа (при этом свойство ScrollBars не должно определять линию горизонтальной прокрутки). В состоянии False этого не происходит(рис.11.9.а и б).
Свойство ScrollBars : TScrollStyle; определяет полосы прокрутки в окне TDBMemo. отсутствие полос прокрутки (ssNone), горизонтальную (ssHorizonlal), вертикальную (ssVertical) и обе (ssBoth).
Свойство Lines: TStrings; содержит строки поля комментария. Для работы с Lines допустимо (и рекомендуется) использовать свойства и методы класса TStrings. Приведем наиболее важные из них:
• Count: Integer; Возвращает общее число строк в Lines.
• Memol.Lines|i| : String; Позволяет обратиться к i-й строке. При этом i принадлежит к интервалу 0..Lines.Count -1.
Пример. Требуется строчные буквы всех строк в DBMemol заменить на заглавные. Для преобразования используем стандартную функцию AnsiUpperCase:
procedure TForm1 .ButtonlClick (Sender: T0bj]ect) ;
var i : Integer;
begin
TableI.Edit; //набор данных - в режим редактирования
WITH DBMemol do begin
FOR i := 0 TO Lines.Count - 1 do
Lines [i] := AnsiUpperCase(Lines[i]);
END; {with}Table1.Post;
end;
Нужно отметить, что того же эффекта можно добиться, обращаясь к содержимому поля комментария как к длинному текстовому полю с использованием его свойства property Text: String; Например:
procedure TForm1.Button2Click(Sender: TObject);
begin
Table1.Edit; //набор данных - в режим редактирования
DBMemol.Text := AnsiUpperCase(DBMemol.Text);
Table1.Post;
end;
Заметим, что изменение значения свойства Text или значения одного или нескольких строк Lines не переводит НД в режим редактирования и изменения внесенные в текст комментария в TDBMemo, в поле НД, с которым этот компонент связан, не переносятся Поэтому перед внесением изменений в значения свойств Lines или Te\f следует переводить набор данных в режим dsEdif, а затем запоминать изменения методом Post
Аналогичным по последствиям будет обращение к тексту комментария через свойство Value компонента TField, назначенного полю комментария
Table1.Edit; //набор данных - в режим редактирования
Table1.Komment.Value := AnsiUpperCase(Table1Komment.Value);
Table1.Post;
В некоторых случаях бывает полезным формировать содержимое комментария во временном компоненте TMemo и затем присваивать свойство Lines компоненту TDBMemo
Table1.Edit; //набор данных - в режим редактирования
DBMemol.Lines.Assign(TmpMemo1.Lines) ;
Table1.Post;
Такой же подход нужно применять и тогда, когда содержимое поля комментария изменяется построчно
Table1.Edit; //набор данных - в режим редактирования
DBMemol.Lines [i].Add('какое-то значение') ;
Table1.Post;
Часто производимый перевод НД из состояния dsBrowse в dsEdif и обратно способен существенно замедлить работу приложения Наоборот, работая со
свойством Lines компонента TMemo, мы всегда работаем только с оперативной памятью Впоследствии накопленные изменения запоминаются в поле комментария за один раз
function Index0f(const S: string): Integer; Возвращает индекс (начиная с 0) строки, совпадающей с S (если таковая есть), и -1, если такой строки нет
procedure Clear; Очищает Lines Значение свойства Count становится равным 0
function Add(const S: string): Integer; Добавляет строку в конец Lines и возвращает номер добавленной строки
procedure Insert (Index: Integer; const S: string); Вставляет строку S после строки с индексом Index
procedure Delete (Index: Integer); Удаляет строку с индексом Indev
Метод procedure LoadFromFile(const FileName: string); загружает в TDBMemo содержимое файла, имя которого определяется параметром FileName
Метод procedure SaveToFile(const FileName: string); записывает содержимое TDBMemo в файл FileName
Часто необходимо обеспечить поиск в тексте комментария вхождений какого-либо поискового контекста В этом случае с содержимым поля комментария работают не построчно (через свойство Lines), а как с единым целым (текстовой переменной) через свойство Text Для поиска используется символьная функция Роs, которая возвращает значение, отличное от 0, если поиск был удачен Свойства SelStart и SelLength используются для последующего выделения найденного вхождения Приведем пример простейшего контекстного поиска в поле комментария (реализован в обработчике события Find компонента FmdDialog)
procedure TForm1.FindDialog1Find(Sender: TObject);
var
ToFind: string; // строка, вхождение которой ищем
FindIn: string; // строка (Мемо), где ищем
Found: integer; // результат поиска
Index: integer; // начальная позиция (№ символа) найденного вхождения
FoundLen: integer; //длина найденного текста
begin
ToFind := FindDialog1.FindText; {Поисковая строка - из FmdDialog}
FoundLen := Length(FindDialog1.FindText); {Длина искомого фрагмента текста}
FindIn := MemoSee.DBMemol.Text; {Текст, где будем искать}
Found := Pos(ToFind, Findin) ;
IF Found > 0 then
begin {Отметим найденный фрагмент)
DBMemol.SelStart:= Found -1;
DBMemol.SelLength := FoundLen;
end
ElSE
MessageDIg('Такого вхождения нет!', mtlnformation, [mbOK], 0) ;
end;
11.10. Компонент TDBRichEdit
11.10.1. Назначение компонента
Компонент TDBRichEdit позволяет просматривать и корректировать информацию в поле форматированного комментария (рис. 11.10).
Форматированный комментарий располагается в поле комментария. Текст в нем может содержать фрагменты, набранные различным шрифтом, размером,
стилем, цветом и т.д. В отличие от компонента TDBMemo, который позволяет работать только с однородным (неформатированным) текстом, компонент TDBRichEdit умеет интерпретировать специальные символы разметки текста в формате RTF (Rich Text Format).
Свойства
property AutoDisplay: Boolean;
property DataField: string;
property DataSource: TDataSource;
ro property Field: TField;
property Lines: TStrings;
procedure LoadMemo; property ReadOnly: Boolean; аналогичны по назначению одноименным свойствам компонента TDBMemo.
Длина текста форматированного комментария в символах возвращается методом function GetTextLen: Integer;
Метод procedure Clear; полностью удаляет текст из компонента.
Метод procedure Print(const Caption: string); выводит текст комментария на печать. Параметр Caption определяет заголовок в очереди печати.
Свойство property HideScrollBars; определяет, следует автоматически убирать (True) или нет (False) полосы скроллинга из окна TDBRichEdit, если в их присутствии нет необходимости.
Свойство property HideSelection: Boolean; определяет, следует (True) или не следует (False) скрывать выделение текста в окне TDBRichEdit, если фокус управления перешел к другому компоненту.
При изменении размера шрифта наступает событие property OnResizeRequest: TRichEditResizeEvent; TRichEditResizeEvent = procedure (Sender: TObject; Rect: TRect) of object ; Параметр Rect содержит сведения о новых границах изменяемого текста (в экранных координатах).
При изменениии текста наступает событие property OnChange: TNotifyEvent; TNotifyEvent = procedure(Sender: TObject) of object;
