Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Нв семинар.doc
Скачиваний:
5
Добавлен:
10.08.2019
Размер:
119 Кб
Скачать
☆

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;