11. Визуальные компоненты для работы с текущей записью набора данных

 

 

11.1. Компонент TDBText *

11.2. Компонент TDBEdit *

11.3. Компонент TDBCheckBox *

11.4. Компонент TDBRadioGroup *

11.5. Компонент TDBListBox *

11.6. Компонент TDBComboBox *

11.7. Компонент TDBLookupComboBox *

11.8. Компонент TDBLookupListBox *

11.9. Компонент TDBMemo *

11.10. Компонент TDBRichEdit *

11.10.1. Назначение компонента *

10.11.2. Работа с абзацем *

11.10.3. Сохранение комментария в файле и считывание комментария из файла *

11.10.4. Работа с выделенным текстом *

11.10.5. Поиск фрагмента текста *

11. Визуальные компоненты для работы с текущей записью набора данных

11.1. Компонент TDBText

Компонент TDBText применяется для показа значения текстового поля текущей записи НД. Изменять значение, показываемое при помощи TDBText, нельзя. Компонент является аналогом компонента TLabel, за исключением того, что значение для отображения берется из текущей записи НД.

Для использования компонента TDBText нужно:

• указать в свойстве property DataSource: TDataSource; имя соответствующего компонента TDataSource, связанного с НД;

• указать в параметре property DataField: String; имя поля. При заполненном свойстве DataSource в инспекторе объектов, когда мы устанавливаем значение свойства DataField, появляется список:

- имен полей, определенных в редакторе полей;

- имен всех полей НД, на который ссылается соответствующий компонент TDataSource, ест редактор полей не применялся.

Пример. Пусть имеем ТБД "TOV.DB", в состав записи которой входят поля GrNum (номер группы товаров) и Tovar (наименование товара). Требуется в компоненте TDBGrid показывать только наименования товаров, а внизу, под TDBGrid - номер группы для текущей записи в НД.

Расположим в форме компоненты DataSourcel, Table1 (указывающий на ТБД "TOV.DB") и DBGridI, связанные между собой стандартным образом. Расположим также в форме компоненты Label 1 (свойство Caption = 'Номер группы текущей записи - ') и DBTextl (рис. 11.1).

Назначим в инспекторе объектов свойства DBTexlt.DalaSource = DataSourcel и DBTextl. DataField = GrNum. Тогда во время выполнения приложения DBTextl будет показывать содержимое поля GrNum текущей записи.

11.2. Компонент TDBEdit

Компонент TDBEdit позволяет редактировать значение строкового поля текущей записи НД. Он повторяет функциональность компонента TEdit (позволяющего корректировать значение переменной), но источником данных и их приемником в этом случае служит поле НД. Поэтому для TDBEdit необходимо указывать свойства

property DataSource: TDataSource; - имя компонента DataSource, определяющего НД; *

property DataField: string; - имя редактируемого поля;

property ReadOnly: Boolean; - если содержит True, значение поля доступно только для чтения, если False - значение поля можно изменять.

Пример. Пусть необходимо корректировать, изменять, удалять текущую запись в НД, связанном с ТБД "TOV.DB" (товары), в состав записи которой входят поля GrNum (номер группы товаров) и Tovar (наименование товара).

Поместим в форму компоненты Table1 (связанный с ТБД "TOV.DB") и DataSource 1, указывающий на Table I. Пусть группа кнопок реализует перевод НД в режимы dslnsert, dsEdit, а также обращение к методам Delete, Post, Cancel. Поместим в форму компоненты DBEdit1 (указывает на поле GrNum) и DBEdit2 (указывает на поле GrNazv). При добавлении новой записи или при изменении существующей необходимо вводить и корректировать значения полей в компонентах DBEdit1 и DBEdit2 (рис. 11.2).

При вводе значения в TDBEdit приложение автоматически отслеживает, чтобы введенное значение было совместимо по формату с полем набора данных, с которым связан данный компонент TDBEdit. Ввод неверных значений блокируется. Например, если в компонент TDBEdit, связанный с полем типа даты и времени, попытаться поместить строковое значение, будет возбуждено исключение.

Свойство property Text: string; хранит текущее содержимое поля НД в текстовом виде.

Событие property OnChange: TNotifyEvent; наступает при изменении значения поля.

События property OnEnter: TNotifyEvent; property OnExit: TNotifyEvent; наступают при получении и утрате фокуса управления компонентом TDBEdit.

11.3. Компонент TDBCheckBox

Компонент TDBCheckBox позволяет "отметить" и "снять отметку" с логического поля в составе текущей записи НД.

Он обладает функциональностью компонента TCheckBox, но источником данных и их приемником в этом случае служит поле НД.

Свойства property DataSource: TdataSource; property DataField: string;. property ReadOnly: Boolean; имеют такое же назначение, как и аналогичные свойства компонента TDBEdit.

Пример. Расширим пример, приведенный выше для компонента TDBEdit. Пусть в ТБД "TOV.DB" имеется поле Uzenka (тип Boolean). Значение True в этом поле означает, что товары данной группы подлежат уценке, значение False - не подлежат.

Добавим в форму компонент DBCheckBox1 (свойство DataSource = DataSource1, свойство DataField = Uzenka). Тогда в процессе работы можно устанавливать в данное поле значения True или False, делая или не делая отметки DBCheckBox1 (рис. 11.3).

ЗАМЕЧАНИЕ. При показе содержимого НД Table1 в TDBGrid в столбце Uzenka для тех записей, у которых поле Uzenka содержит True, выводится символ '+', а для тех записей, у которых поле Uzenka содержит False - ничего не выводится. Такая функциональность реализуется в следующем обработчике события OnGetText для поля Uzenka (компонент Table1 Uzenka).

procedure TForm1.Table1UzenkaGetText(Sender: TField;

var Text: string;

DisplayText: Boolean);

begin

IF DisplayText and Table1Uzenka.Value THEN Text := '+' ;

end;

Напомним, что событие OnGetText наступает перед показом содержимого поля каждой записи в визуальных компонентах.

Свойство

property Checked : Boolean;

позволяет определить, отмечено поле, на которое ссылается TDBCheckBox (значение True) или не отмечено (False).

Свойство

property State: TCheckBoxState;

возвращает состояние поля. Возможные значения:

cbUnchecked- поле не отмечено;

cbChecked - поле отмечено;

cbGrayed - промежуточное состояние, когда поле не отмечено, но в нем показывается серый символ отметки. Он означает, что поле не содержит ни True, ни False, а содержит пустое значение. Именно это состояние присуще компоненту DBCheckBoxl при добавлении записей в приводившемся выше примере. Добиться того, чтобы во вновь добавляемых записях поле Uzenka по умолчанию содержало значение False можно в обработчике события OnNew Record компонента Table1 (событие наступает всякий раз при добавлении новой записи):

procedure TForm1.Table1NewRecord(DataSet: TDataSet) ;

begin

Table1Uzenka.AsBoolean := False;

end;

Компонент TDBChechBox можно связывать и не с логическим, а с символьным полем. В этом случае необходимо установить значения приводимых ниже свойств.

Свойство

property ValueChecked: string;

устанавливает значения поля, при которых TDBCheckBox переходит в состояние cbChecked. При наличии нескольких значений они разделяются точкой с запятой:

DBCheckBox1.ValueChecked := 'True;Yes;On;Дa;Д';

Свойство

property ValueUnchecked: string;

устанавливает значения поля, при которых TDBCheckBox переходит в состояние cbUnchecked. При наличии нескольких значений они разделяются точкой с запятой:

DBCheckBoxl.ValueUnchecked := 'False;No;Off; Нет;Н';

События

property OnEnter: TNotifyEvent;

property OnExit: TNotifyEvent;

наступают при получении и утрате фокуса управления компонентом.

Событие

property OnClick: TNotifyEvent;

наступает, если на компоненте TDBCheckBox щелкнуть мышью. Поскольку именно таким образом происходит снятие отметки или отметка компонента, данное событие может использоваться для оценки изменения значения свойства Checked.

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;

10.11.2. Работа с абзацем

Текущим в тексте форматированного комментария считается абзац, на котором находится курсор.

Свойство property Paragraph: TParaAttributes; определяет характеристики параграфа. Рассмотрим свойства компонента TParaAttributes:

• property Alignment: TAlignment; определяет выравнивание параграфа. Значения:

taLeftJustify - влево;

laCenier - по центру;

taRightJustify - вправо.

• property Firstlndent: Longint; определяет в пикселах абзацный отступ (первой строки параграфа) относительно левого края.

• property Leftlndent: Longint; определяет в пикселах отступ всех строк параграфа от левого края.

• property Numbering: TNumberingStyle; определяет отметку параграфов. Значения:

nsNone - отметка не производится.

nsBullet - отметка производится символом '•'.

• property Rightlndent: Longint; указывает в пикселах отступ от правого края.

Пример. Определим кнопку, реализующую выравнивание текущего абзаца и напишем обработчик события нажатия этой кнопки:

procedure TFormI.SpeedButton3Click(Sender: TObject) ;

begin

DBRichEdit1.Paragraph.Alignment := taCenter;

end;

11.10.3. Сохранение комментария в файле и считывание комментария из файла

Форматированный комментарий может быть записан в файл и считан из него. Для этой цели применяются методы свойства Lines, procedure SaveToFUe(const FileName: string); procedure LoadFromFile(const FileName: string);

Свойство property PlainText: Boolean; указывает (True), что нужно игнорировать разметку текста (шрифт, цвет и т.д.) при записи из файла в компонент или из компонента в файл. В этом случае текст представляется в виде обычного текстового файла. Значение False (по умолчанию) указывает на необходимость принимать во внимание разметку текста. Например,

RichEdit1.PlainText := True;

RichEdit1.Lines.LoadFromFile(Path);

RichEdit2.PlainText := False;

11.10.4. Работа с выделенным текстом

Фрагмент текста форматированного комментария выделяется так же, как и в популярном текстовом процессоре WinWord; для выделения необходимо установить указатель мыши на начало выделяемого фрагмента, нажать левую кнопку мыши и, не отпуская кнопки, установить указатель мыши на конец фрагмента, после чего кнопку отпустить. Есть и другой способ (при помощи клавиатуры): следует переместить курсор на начало выделяемого фрагмента, нажать кнопку с изображением стрелки влево (вправо) и одновременно - кнопку Shift; движение курсора следует остановить на конце выделяемого фрагмента.

Следующие свойства позволяют определить параметры выделенного фрагмента в тексте комментария:

property SelLength: Integer; возвращает число выделенных символов. property SelStart: Integer; возвращает номер первого выделенного символа в тексте. property SelText: string; возвращает выделенный текст.

Программное изменение одного из указанных свойств изменяет границы выделенного фрагмента.

Весь текст комментария может быть выделен вручную - нажатием на клавиатуре комбинации Ctrl+A, и программно - путем выполнения метода procedure SelectAll;

Свойство property SelAttributes: TTextAttributes; позволяет установить характеристики выделенного текста. Свойства компонента TTextAttributes: . -

• property Color: TColor; определяет цвет выделенного текста;

• property Height: Integer; определяет высоту в пикселах выделенного текста;

• property Pitch: TFontPitch; определяет, имеют ли литеры выделенного текста одинаковую ширину.

Значения:

fpDefault- определяется используемым шрифтом;

fpFixed - одинаковая ширина;

fp Variable - переменная ширина.

• property Protected: Boolean; определяет (True), что текст защищен от изменения пользователем. В случае, если пользователь пытается изменить защищенный текст, вызывается обработчик события OnProtectChange.

В этом обработчике можно снять защиту. Если обработчик указанного события не определен, защищенный текст доступен только на чтение.

• property Size: Integer; определяет высоту в пикселах выделенного текста.

* property Style: TFontStyles; определяет стиль выделенного шрифта. Множество Style может состоять из одного или нескольких значений:

fsBold - жирный;

fsltalic - наклонный;

fs Underline - подчеркнутый;

fsStrikeout - зачеркнутый.

Пример. Установить шрифт, цвет, размер и стиль выделенного текста аналогичными параметрам шрифта, выбранного посредством компонента TFontDialog:

IF FontDialog1.Execute THEN begin

WITH DBRichEditl.SelAttributes do begin

Color := FontDialogl.Font.Color;

Size := FontDialogl.Font.Size;

Name := FontDialogl.Font.Name;

Style := FontDialogl.Font.Style;

END;//with

END;//if

Пример. Сделать выделенный фрагмент текста защищенным:

DBRichEditI.SelAttributes.Protected := True;

Событие

property OnProtectChange: TRichEditProtectChange;

TRichEditProtectChange = procedure(Sender: TObject; StartPos, EndPos: Integer; var AllowChange: Boolean) of object;

наступает, если пользователь пытается изменить защищенный текст. Параметры StartPos и EndPos содержат границы защищенного текста. Установка в True изменяемого параметра AllowChange разрешает изменять защищенный текст.

Пример. В случае, если пользователь пытается изменить символ, ранее помеченный как защищенный, запрашивается подтверждение; если пользователь подтверждает изменение защищенного символа, тот изменяется; если не подтверждает, изменение символа отвергается.

procedure TForm1.DBRichEdit1ProtectChange(Sender: TObject;

StartPos,

EndPos: Integer; var AllowChange: Boolean);

begin

IF MessageDIg('Изменяемый текст являются защищенным. ' + 'Желаете все-таки его изменить?',mtConfirmation,

[mbYes,mbNo],0) = mrYes THEN AllowChange := True;

end;

Выделенный фрагмент текста может быть удален методом procedure ClearSelection;

Метод procedure CopyToClipboard; копирует выделенный текст в буфер обмена Windows.

Метод procedure CutToClipboard; вырезает выделенный текст и вставляет его в буфер обмена Windows.

Метод procedure PasteFromCUpboard; вставляет содержимое буфера обмена Windows в текст комментария, начиная с текущей позиции курсора.

Пример. Определим кнопки "Копировать в буфер обмена", "Вырезать в буфер обмена", "Вставить из буфера обмена" и напишем обработчики события нажатия этих кнопок:

// кнопка "Копировать в буфер обмена"

procedure TForm1.SpeedButton6Click(Sender: TObject);

begin

DBRichEditI.CopyToClipboard;

end;

// кнопка "Вырезать в буфер обмена"

procedure TFormI.SpeedButton7Click(Sender: TObject);

begin

DBRichEditI.CutToClipboard;

end;

// кнопка "Вставить из буфера обмена"

procedure TForm1.SpeedButtonSClick(Sender: TObject);

begin

DBRichEdit1. PasteFromCUpboard;

end;

11.10.5. Поиск фрагмента текста

Метод function FindText(const SearchStr: string; StartPos, Length: Integer; Options: TSearchTypes): Integer; ищет в тексте комментария строку SearchStr. Поиск производится во фрагменте текста начиная с позиции StartPos и заканчивая StartPos + Length -1. Первый символ текста комментария имеет номер 0.

Если поиск успешен, возвращается номер символа, начиная с которого SearchStr входит в текст комментария. В противном случае возвращается -1.

Параметр Options представляет собой множество, в который могут входить такие элементы:

stWholeWord- поиск ведется целыми;

stMatchCase - игнорируется разница в высоте букв.

Пример. Произвести поиск во всем тексте DBRichEdit1. Поисковая строка находится в Edit1.Text. Если фрагмент найден, выделить его.

procedure TForm1.FindButtonClick(Sender: TObject) ;

begin

WITH DBRichEditl do begin

SelStart := FindText(Editl.Text,0,GetTextLen,[]) ;

SelLength := Length(Edit1.Text) ;

END;//with

end;