Компонент Memo обладает рядом типичных для визуальных компонентов свойств

Лекция № 25

Компонент Memo (класс TMemo).

Пиктограмма: .

Компонент Memo представляет собой поле для отображения и редактирования текста. Текст можно загрузить из файла, набрать на клавиатуре, вставить из буфера обмена. Компонент имеет свойства для редактирования текста, что способствует его применению в простейших текстовых редакторах для просмотра (редактирования) текста.

Компонент Memo является окном редактирования многострочного текста. Оно так же, как и окно Edit, снабжено многими функциями, свойственными большинству редакторов. Как и в компоненте Edit, в нем предусмотрены типичные комбинации «горячих» клавиш для копирования, вырезания, вставки выделенных фрагментов текста.

Компонент Memo обладает рядом типичных для визуальных компонентов свойств.

Aligenment - текст в редакторе можно выравнивать по левому, правому краям и по центру.

WordWrap -отвечает за поведение редактора при достижении правой границы компонента во время набора текста. Если свойство равно True, то при этом происходит переход на новую строку. В случае False при достижении правой границы происходит горизонтальная прокрутка текста, и пользователь может продолжать набор. На новую строку можно перейти, нажав клавишу Enter.

Компонент Memo обладает также свойствами Font, ReadOnly, Height, Width, Left, Top.Смысл этих свойств такой же, как и у компонента Edit.

В отличие от компонента Edit компонент Memo может содержать несколько строк, которые задаются либо свойством Text, либо свойством Lines. Свойство Text используется для доступа ко всему содержимому компонента Memo. Например,для занесения символов в компонент, можно включить в цикл такой оператор присваивания:

 

Memo1.Text := Memo1.Text + S;

 

где S - строковая переменная. Свойство Lines используется для построчного доступа.

Свойство Lines в свою очередь является объектом класса TStrings, поэтому при работе с объектом Memo можно использовать методы доступные в классе TStrings.

TStrings – это многофункциональный абстрактный класс, предназначенный для работы с текстовми строками и связанными с ними объектами (любых потомков TObject). Он только описывает методы работы с наборами строк и сопутствующих им объектов, но как именно они хранятся, на его уровне не определено. Его потомки очень многочисленны; они играют основную роль в компонентах-списках (TListBox, TComboBox), редакторе (TMemo) и других компонентах. Обычно приходится иметь дело с TStrings как со свойством компонента. Часто экземпляры этого класса и порожденных от него классов называют наборами строк.

 

5.12.6. Свойства и методы класса Tstrings.

 

LoadFromFile('путь') –(загрузить из файла), где 'путь' – это путь к файлу.

Например, для загрузки файла c:My.txtв компонент Memo1 достаточно в соответствующий обработчик события включить инструкцию:

 

Memo1.Lines.LoadFromFile('c:My.txt');

 

Количество строк в компоненте можно узнать через свойство Count:

Memo1.Lines.Count,

 

Доступ к отдельной строке можно получить с помощью метода Strings[n] (класс Tstrings), где n– номер строки (нумерация начинается с 0). Например:

ShowMessage(Memo1.Lines.Strings[0]); // Показывает в диалоговом окне первую строку текста.

Фактически Strings - это массив строк, начинающихся со строки номер 0 и заканчивающийся строкой номер Count-1. Об этом следует помнить при написании подобных процедур доступа, иначе можно выйти за доступный предел массива, что вызовет ошибку в программе.
Для поочередного просмотра строк из компонента Memo1 можно использовать следующий обработчик.
procedure TForm1.Button1Click(Sender: TObject);
Var i:Integer; // объявление целочисленной переменной
begin
if Memo1.Lines.Count<>0 then // проверка ненулевого количества строк
for i:=0 to Memo1.Lines.Count-1 do // задается цикл, равный кол-ву строк
ShowMessage(Memo1.Lines.Strings[i]); // вывод строк в сообщение
end;

Clear (Очистка) – удаляет содержимое компонента , например,

 

Memo1.Lines.Clear.

 

Add(добавление) - добавляет строку, например,


Memo1.Lines.Add(St); где St– строковая константа или переменная.

Insert(n,St) вставляет строку Stна место строки номер n, где St– строковая константа или переменная, например,


Memo1.Lines.Insert(0,'вставляемая строка');

 

Delete(n) Удаление строки номер n, например,


Memo1.Lines.Delete(0); // удаляет первую строку

При применении процедуры удаления строк Delete помните, что сначала нужно проверять компонент TMemo на наличие строк вообще. Проверку можно осуществлять с помощью функции Count, которая возвращает количество строк.
Работа с выделенным текстом программно аналогична работе пользователя вручную. Если пользователь выберет процедуру вырезания выделенного текста в буфер или его удаление, то он пропадет. Выделение текста производится с помощью двух процедур.

Memo1.SelStart:=0; // установить начальное положение выделения
Memo1.SelLength:=15; // установить длину выделенного текста

Если необходимо всегда видеть выделенный текст, даже при переходе управления на другой элемент управления, то задайте свойству HideSelection значение false.
Работа с выделенным фрагментом текста

Memo1.ClearSelection; // удалить выделенный текст
Memo1.CutToClipboard; // вырезать в буфер обмена
Memo1.CopyToClipboard; // скопировать в буфер обмена
Memo1.PasteFromClipboard; // вставить из буфера обмена
Memo1.SelText; // эта функция возвращает текстовую строку выделенного текста

Отмена последнего изменения - процедура Memo1.Undo.

 

Замечание.Компонент Memo можно использовать для отображения на экране массива чисел. Если заносить в Memo числа с помощью оператора

Memo1.Text := Memo1.Text + S;

то при формировании таблицы надо точно устанавливать ширину поля (свойство Width). Если же использовать добавление строк (метод Add), например так

 

Form1.Memo1.Lines.Add(Sx + ' ' + Sy);

где Sx и Sy – символьные представления чисел,

то ширина поля не играет роли - каждая строка в данном случае будет содержать по два числа.

 

Пример:вывод массивов чисел в Memo.

Пусть необходимо рассчитать таблицу значений функции (например у=х*х). В качестве исходных данных будем задавать значения Xn, Dx и N - начальное значение аргумента, шаг и количество значений функции соответственно. Значения аргумента и функции будем заносить в массивы ХА и У соответственно. Выберем размер массивов равным 50 элементов. Вывод массивов будем делать в компонент Memo.

Таким образом форма должна содержать компонент Memo, поля Edit для ввода значений Xn, Dx, N и две кнопки: "Таблица" и "Закрыть". При щелчке на кнопке "Таблица" вычисляется массив значений функции У = Х * Х и выводится таблица ( значения Х и У ) в компонент Memo. При щелчке на кнопке "Закрыть" приложение закрывается. Проект формы показан на рис.5.25.1.

 

Рис.5.25.1.

 

Порядок создания.

1. Щелкнем по пиктограмме Memo и нарисуем прямоугольник в форме.

2. В инспекторе объектов откроем свойство Lines компонента Memo и удалим имеющийся там текст (его можно удалить и с помощью метода Clear).

3. Чтобы выводить таблицу из двух столбцов установим ширину компонента Memo равной 220 пикселей. Пусть таблица может содержать до 50 строк, то есть не помещается в поле компонента Memo. В этом случае надо предусмотреть полосу прокрутки по вертикали. Для этого установим для свойства ScrollBar значение ssVertical.

4. Создадим как и ранее кнопку с надписью " Таблица" (для расчета таблицы значений функции) и кнопку с надписью "Закрыть" (для эакрытия приложения).

В модуль формы добавим:

а) в раздел описания переменных

X,Xn,dX:Extended;

XА,Y : array [1..50] of Extended;

s1,s2 : String;

б) в обработчик кнопки "Таблица" добавим:

procedure TForm1.Button1Click(Sender: TObject);

Var

k:Integer;

begin

X:=StrToFloat(Edit1.Text); {Ввод исходных данных}

dx:=StrToFloat(Edit2.Text);

N:=StrToInt(Edit3.Text);

For k:=1 To N Do Begin {расчет массивов}

Y[k]:=X*X;

XА[k]:=X;

X:=X+dx;

end;

For k:=1 To 50 Do Begin {переход к символьному

представлению и построчная запись в Memo1}

Str(XА[k]:14,s1);

Str(Y[k]:14,s2);

Form1.memo1.Lines.Add(s1+' '+s2);

В результате полный текст модуля формы этого примера будет иметь вид.

unit Unimem;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

Label4: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

X,Xn,dx:Extended;

N:Integer;

XA,Y:array [1..50] of Extended;

S1, S2:String;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

Var K:Integer;

begin

X:=StrToFloat(Edit1.Text);

dx:=StrToFloat(Edit2.Text);

N:=StrToInt(Edit3.Text);

For k:=1 To N Do Begin {расчет массивов}

Y[k]:=X*X;

XA[k]:=X;

x:=x+dx;

end;

For k:=1 To N Do Begin {переход к символьному

представлению и построчная запись в Memo1}

Str(XA[k]:14,s1);

Str(Y[k]:14,s2);

Form1.memo1.Lines.Add(s1+' '+s2);

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Close;

end;

end.

5.12.7. Компонент StringGrid

Пиктограмма : .

Страница Палитры компонентов Additional. Этот компонент предназначен для организации представления информации в виде таблицы. Компонент StringGrid берет на себя разбивку области на прямоугольные ячейки, добавление и удаление строк и столбцов, прокрутку, управление вводом данных и обработку всех поступающих сообщений.

Общий вид компонента приведен на рис.5.25.2.

 

Рис.5.25.2.

 

Таблица состоит из двух областей — фиксированной и подвижной. Фиксированную область (выделено на рис.5.25.2 серым цветом) обычно составляют верхняя строка и левый столбец. Ячейки этой области можно использовать, например, для вертикальных и горизонтальных заголовков. Они выделяются другим цветом и всегда видимы. Их нельзя сфокусировать и выделить. Кроме того, изменять ширину и высоту ячеек таблицы мышью во время проектирования можно только передвигая границы ячеек в фиксированной области. По умолчанию для этой области отведены один столбец и одна строка, но эти числа могут быть изменены. Все остальные ячейки перемещаются при прокрутке таблицы и составляют подвижную область.

Каждый элемент таблицы (включая и неподвижную область) определяется двумя индексами: первый индекс указывает номер столбца, а второй индекс - номер строки (это прямо противоположно общепринятой в математике нумерации элементов двумерного массива). Нумерация столбцов и строк начинается с нуля (рис.5.25.2).

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

StringGrid1.Cells[1,0] := 'аргумент Х'; .

Так как ячейки таблицы имеют строковый тип, то числа предварительно надо преобразовывать в символьную форму.

Свойства компонента StringGrid.

Кроме типичных свойств (Color, Name, Width и т.п.) имеется ряд полезных свойств, которые часто используются при создании таблиц:

RowCount - количество строк;

ColCount - количество столбцов;

DefaultColWidth - ширина колонки;

DefaultRowHeight - высота строки и др.

Для доступа к ячейкам таблицы со стороны клавиатуры надо в свойстве Option установить значение подсвойства GoEditing равным True.

Свойство Options является множеством, определяющим многие свойства таблицы: наличие разделительных вертикальных и горизонтальных линий в фиксированных (goFixedVertLine и goFixedHorzLine) и не фиксированных (goVertLine и goHorzLine) ячейках, возможность для пользователя изменять с помощью мыши размеры столбцов и строк (goColSizing и goRowSizing), перемещать столбцы и строки (goColMoving и goRowMoving) и многое другое.

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

Пример: Вывод таблицы чисел.

Создадим проект расчета таблицы значений функции аналогичный предыдущему примеру с компонентом Memo, но для представления резульратов будем использовать компонент StringGrid. Вид формы этого проекта приведен на рис.5.25.3.

 

Рис.5.25.3.

Первый фиксированный столбец будем использовати для вывода номера строки таблицы (переменная К).

Порядок создания проекта.

1. Откроем новый проект : File / New Applicanion.

2. Перейдем на страницу Additional палитры компонентов, щелкнем по птктограмме (StringGrid) и нарисуем в форме прямоугольник. Появится таблица содержащая по умолчанию 5 строк и 5 столбцов.

3. Установим значение свойства RowCount (количество строк) равным 50, а значение свойства ColCount равным трем. Снимем выделение - на экране будет таблица из трех столбцов.

4. Выделим таблицу и установим значение свойства DefaultColWidth (ширина столбцов) равным 120.

5. Создадим кнопку "Таблица" как и в предыдущем примере.

6. Двойной щелчек по кнопке - появится модуль формы. Добавим в модуль формы необходимый текст, в результате получим:

-----------------------------------------------

unit UniGrid;

{компонент StringGrid, пример таблица значений функции }

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Grids;

 

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Button1: TButton;

Button2: TButton;

Label4: TLabel;

StringGrid1: TStringGrid;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

X,Xn,dx:Extended;

N:Integer;

XA,Y:array [1..50] of Extended;

S1,S2,S3:String;

implementation

 

{$R *.DFM}

 

procedure TForm1.Button1Click(Sender: TObject);

Var K:Integer;

begin

X:=StrToFloat(Edit1.Text);

dx:=StrToFloat(Edit2.Text);

N:=StrToInt(Edit3.Text);

For k:=1 To N Do Begin {расчет массивов}

Y[k]:=X*X;

XA[k]:=X;

x:=x+dx;

end;

StringGrid1.Cells[1,0]:='X'; {заголовки столбцов}

StringGrid1.Cells[2,0]:='Y';

For k:=1 To N Do Begin

{преобразование чисел в строковое представление}

Str(XA[k]:14,s1);

Str(Y[k]:14,s2);

S3:=IntToStr(k);

StringGrid1.Cells[0,k]:= s3; {запись в таблицу}

StringGrid1.Cells[1,k]:= s1;

StringGrid1.Cells[2,k]:=s2;

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Close;

end;

end.