Delphi 3 и создание приложений баз данных


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;




- Начало -  - Назад -  - Вперед -