Delphi 4. Часть 4

Delphi 4. Часть 4 Очередную статью я бы хотел посвятить компонентам, с которыми приходится сталкиваться программисту, создающему прикладную программу со стандартным интерфейсом, т.е. содержащие меню, выпадающие меню, компоненты ввода/вывода и т.д.

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

Для создания меню необходимо нанести на форму проекта соответствующий компонент (TMainMenu).

Меню реализовано достаточно просто. Каждой команде соответствует определенный метод-обработчик, содержащий код для вызова необходимых процедур приложения. Для работы с компонентами во время разработки используется специальный диалог "Редактор Меню". Он активизируется при двойном клике по компоненту или при клике на кнопке свойства Items инспектора объектов. Для каждого выбранного в диалоге элемента инспектор объектов показывает значения его свойств, которые программист может редактировать. Чтобы добавить новую группу меню, достаточно заполнить последний пустой элемент и задать ему имя (Caption). В поле Caption можно задавать не только имя, но и "горячие клавиши", по которым группа (пункт) меню будет активизироваться. Для этого необходимо перед символом "горячей клавиши" поставить знак & (амперсанд). В качестве имени можно задать символ "-", который в меню отображается как разделитель. Чтобы преобразовать обычный пункт меню во вложенную группу, необходимо воспользоваться комбинацией клавиш <Ctrl>+<?>. В результате в элементе появляется знак вложенного меню, для которого пункты задаются обычным вышеописанным способом. Доступны разработчику и стандартные меню, используемые для работы с файлами, буфером обмена, справкой и др. Для этого необходимо воспользоваться файлами ресурсов. Достаточно выбрать команду всплывающего меню Insert From Resourсe. Часто используемые конфигурации меню можно сохранять в файлы шаблонов (Save As Template...).

Компонент TMainMenu имеет достаточно интересные и полезные свойства (табл. 1):


Табл. 1

Action:TBasicAction;

Определяет действие, связанное с элементом

Bitmap:TBtmap;

Содержит изображение, отображающееся рядом с элементом меню

Break:TMenuBreak

Управляет представлением элементов в панели меню

-MbNone

Элементы следуют друг за другом;

— MbBreak

Начиная с этого элемента, команды располагаются в соседнем столбце;

— MbBarBreak

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

Checked:Boolean;

Управляет флажком в элементе меню

Default:Boolean;

Управляет выделение элемента меню

Enabled:Boolean;

Управляет доступностью элемента меню

Items:TMenuItem

Список элементов меню

RadioItem:Boolean;

Управляет включением радиокнопки около пункта меню

Создание всплывающего меню практически ничем не отличается от создания меню формы. Для этого необходимо на форму нанести компонент TPopupMenu. После создания меню в уже знакомом нам редакторе меню его необходимо сопоставить объекту, которому оно соответствует. Для этого свойство объекта popupmenu следует установить в значение названия всплывающего меню. Среди свойств класса TPopupMenu можно наблюдать следующее (табл. 2):


Табл. 2

AutoPopup:Boolean;

Отвечает за активизацию меню при щелчке правой кнопкой мыши на элементе формы проекта

PopupComponent:TComponent;

Содержит указатель на компонент, использующий данное всплывающее меню

procedure Popup(X,Y)

Разворачивает данное всплывающее меню в точке с координатами X и Y

Рассмотрим теперь компонент ввода/вывода TEdit. Мы им уже пользовались при рассмотрении примеров в предыдущих статьях, при этом я использовал его свойства, не описав их Вам. В этот раз я хочу загладить свою вину. Итак, компонент предназначен для работы со строкой текста. Имеет очень простой и удобный для работы вид, что обусловило его широкое применение. Компонент Tedit автоматически поддерживает все операции с буфером обмена, поэтому нет необходимости создавать дополнительное всплывающее меню. Свойства класса приведены в следующей таблице (табл. 3):


Табл. 3
AutoSelect:Boolean;
При получении фокуса обеспечивает выделение текста;
AutoSize:Boolean;
Если свойство установлено в True, то при изменении высоты шрифта высота компонента увеличивается автоматически;
BorderStyle:TBorderStyle;
Отвечает за обрамление компонента
-bsNone;
Обрамление отсутствует;
-bsSingle;
Обрамление одинарной линией;
CharCase:TeditCharCase;
Отвечает за представление текста в компоненте
-ecNormal;
Символы отображаются так, как их вводит пользователь;
-ecUpperCase;
Символы автоматически переводятся в заглавные;
-ecLowerCase;
Символы автоматически переводятся в прописные;
CanUndo:Boolean;
Если присвоено значение True, то сделанные изменения текста могут быть отменены методом Undo;
HideSelection:Boolean;
При переносе фокуса выделение текста в компоненте снимается (значение True);
MaxLength:Integer;
Ограничивает количество символов в строке. По умолчанию значение равно 0 (нет ограничений);
Modified:Boolean;
Если текст был изменен, то свойство возвращает True;
OEMConvert:Boolean;
При обработке текстов в формате MS-DOS возникает потребность в преобразовании символов из кодировки OEM в ANSI и обратно. Для реализации данной функции свойству необходимо присвоить значение True;
PasswordChar:Char;
Содержит символ, на который будут заменяться вводимые пользователем символы пароля;
ReadOnly:Boolean;
Отвечает за возможность изменения строки. В значении True изменение невозможно;
SelLength:Integer;
Содержит длину выделенного текста;
SelStart:Integer;
Содержит номер первого выделенного символа;
SelText:String;
Содержит выделенную строку.

Компонент TEdit имеет собственные методы (табл. 4):


Табл. 4

procedure Clear

Очищает строку;

procedure ClearSelection

Удаляет выделенный фрагмент;

procedure ClearUndo

Очищает буфер Undo;

procedure CopyToClipboard

Копирует выделенный фрагмент в буфер обмена;

procedure CutToClipboard

Вырезает выделенный фрагмент в буфер обмена;

procedure PastFromClipboard

Вставляет выделенный фрагмент из буфера обмена;

procedure SelectAll

Выделяет всю строку;

procedure Undo

Возвращает текст в состояние до последнего изменения.


У компонента TEdit есть свои методы-обработчики событий. Среди них можно выделить OnChange, OnEnter, OnKeyPress, OnExit . Обработчик события OnChange вызывается при всяком изменении строки. OnKeyPress — при нажатии какой-либо клавиши. Обработчик OnKeyPress удобен программисту тем, что позволяет отслеживать ввод символов. Благодаря ему разработчик может легко блокировать ввод некоторых нежелательных символов. Событие OnEnter вызывается при получении компонентом фокуса ввода, OnExit — при потере фокуса.

Но использование строкового компонента неудобно в тех случаях, когда необходимо вывести список данных (массив), многострочный документ и т.д. Для этого необходимы более мощные средства для работы с текстом. Далее речь пойдет о компонентах TMemo и TReachEdit.


TMemo
представляет собой многострочный редактор. Содержимое редактора представлено как объект TString, содержащий набор строк:


Lines:TString;


Основные действия с текстом доступны именно через это свойство. Как и в любом текстовом редакторе, компонент TMemo имеет возможность простого сохранения текста и загрузки его с использованием файлов. Это достигается путем использования операторов:


Memo.Lines.SaveToFile(NameOfFile);

Memo.Lines.LoadFromFile(NameOfFile);


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


...

procedure
TForm1.Button1Click(Sender: TObject);


begin

if
savedialog1.execute then AssignFile(F, SaveDialog1.filename) else exit;

memo1.lines.savetofile(SaveDialog1.filename);


end
;


...


При этом необходимо установить значение свойства ofOverWritePrompt группы свойств SaveDialog1.Options в значение True, чтобы приложение "попросило" пользователя подтвердить перезапись файла.

При необходимости получения доступа к тексту как к массиву символов следует воспользоваться следующими методами:



function
GetTextBuf(Buffer: PChar; BufSize: Integer): Integer;

копирует весь текст из компонента Tmemo в Buffer.

Метод



function
GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer; virtual ;

копирует только выделенный текст из компонента Tmemo в Buffer.

Метод


procedure
SetTextBuf(Buffer: PChar);

копирует текст из буфера Buffer в компонент Tmemo.

Метод


procedure
SetSelTextBuf(Buffer: PChar);

заменяет текст, выделенный в Tmemo, на текст, содержащийся в буфере Buffer.

В компоненте Tmemo можно менять шрифты и их свойства, но эти изменения коснутся всего текста компонента в целом, а не только выделенного фрагмента. Tmemo, как и компонент Tedit, автоматически поддерживает команды вставки, копирования, вырезания текста, поддерживает методы CopyToClipboard, CutToClipboard, SaveToClipboard. При вводе текста пользователь может воспользоваться клавишами <Tab> и <Enter>. Как Вы могли подметить, эти же кнопки используются для передачи фокуса. Чтобы определить, что в данном случае желает разработчик, ему предоставлены в пользование свойства


WantReturns:Boolean;

WantTabs:Boolean;


Если они установлены в False, то эти клавиши служат для управления фокусом. В этом случае для управления текстом можно воспользоваться комбинациями клавиш <Ctrl>+<Enter> или <Ctrl>+<Tab>. Если же эти свойства установлены в True, то — для управления вводом.

Свойство


type
TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth);


property
ScrollBars: TScrollStyle;

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

Свойства BorderStyle, HideSelection, MaxLength, OEMConvert, ReadOnly выполняют те же функции, что и одноименные свойства компонента Tedit.

Следующим компонентом, на который я бы хотел обратить Ваше внимание, является TrichEdit . Как и Tmemo, данный компонент представляет собой многострочный текстовый редактор. Однако его возможности намного шире. С его помощью можно изменять такие свойства отдельных фрагментов текста, как шрифт, цвет, стиль, размер и т.д. TRichEdit позволяет вести работу с файлами формата RTF. Но это все слова, а теперь рассмотрим все эти возможности отдельно.

Итак, у компонента присутствуют уже знакомые нам методы CopyToClipboard, CutToClipboard, SaveToClipboard. Появился метод Undo, который отсутствовал у компонента Tmemo. Для хранения информации о форматировании текущего абзаца, а именно: данных о выравнивании, отступах, выделении начала абзаца специальным символом и т.д., предназначено свойство


property
Paragraph: TParaAttributes;

Оно содержит следующие варианты:

TParaAttributes.Aligment — выравнивание строк;

TParaAttributes.Numbering — управляет видимостью символа " ": значение nsNone означает, что перед параграфом символа нет, а значение nsBullet — что символ есть;

TParaAttributes.FirdtIndent — задает величину отступа начала параграфа в пикселях;

TParaAttributes.LeftIndent — задает величину отступа основного текста слева в пикселях;

TParaAttributes.RightIndent — задает величину отступа справа в пикселях.

Однако свойство Paragraph можно использовать только для чтения. В инспекторе объектов оно не доступно.

Для задания атрибутов шрифта для всего текста используется свойство


property
DefAttributes: TTextAttributes;

Для задания атрибутов шрифта выделенному фрагменту следует воспользоваться свойством


property
SelAttributes: TTextAttributes;

Опишем также другие не менее важные свойства и методы класса TrichEdit:


PlainText:Boolean —
при значении False (по умолчанию) текст в редакторе при сохранении или загрузке будет представлен в формате RTF, иначе — как простой текст;


Lines:Tstrings
— содержит набор строк текста. Так же как в компоненте Tmemo, через это свойство можно считывать и записывать содержимое редактора в файл или в буфер обмена;


SelStart:Integer
— указывает номер символа от начала текста, перед которым располагается курсор. Если это выделение, то номер первого символа выделения. Нумерация символов начинается с нуля;


SelText:String —
содержит выделенный текст. При замене содержимого SelText новое содержимое вставляется вместо выделенного фрагмента. Если выделения не было, то вставка происходит в позицию курсора.


Procedure Clear
— удаляет текст;


function GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer; override —
копирует выделенные символы в буфер и возвращает количество скопированных символов;


procedure Print —
форматирует текст по страницам и печатает на используемом по умолчанию принтере.

Для работы с файлами RTF и текстовыми файлами Windows достаточно воспользоваться соответствующими фильтрами при настройке диалогов открытия и закрытия файлов. Что касается текстовых фалов DOS, то, в отличие от Tmemo, в компоненте TrichEdit нет свойства OEMConvert и данный компонент для такой работы не приспособлен. Однако есть способы перекодировки текста из DOS в WIN1251 при открытии и обратно в кодировку DOS при закрытии следующим образом:


...

var


Memstr:TmemoryStream;


Begin


Memstr:=TmemoryStream.create;

Memstr.LoadFromFile('filename.ext');

OEMToCharBuff(Memstr.Memory, MemStr.Memory, Memstr.Size);

RichEdit1.lines.loadFromStream(MemStr);

Memstr.Clear;


...


RichEdit1.Lines.SaveToStream(MemStr);

CharToOEMBuff(Memstr.Memory, MemStr.Memory, Memstr.Size);

MemStr.SaveToFile('filename2.ext');

MemStr.Free;


End;

...


Итак, мы рассмотрели основные компоненты ввода/вывода текста, их свойства, методы, методы-обработчики событий. Теперь отметим основные функции для работы со строковыми переменными. Их я изложил в следующей таблице (табл. 5):


Табл. 5

Length(S:string):integer;

Функция возвращает количество символов в строке S типа String или количество элементов массива. S — строка типа String, Pchar или массив;

SetLength(var S; NewLength:integer);

Устанавливает длину строки или динамического массива S;

StringWidth(s:string):integer;

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

StrToInt(s:string):integer;

Преобразует строковое значение в целое число типа Integer. Если строка не может быть преобразована в целое число, возникает сообщение об ошибке EconvertError;

StrToIntDef(s:string; Default:integer):integer;

Преобразует строковое значение в целое число типа Integer. Если строка не может быть преобразована в целое число, функция возвращает число, заданное параметром Default;

StrToDate(s:string):TdateTime;

Преобразует строку в формат даты. Порядок обозначения месяца, дня и года определен в глобальной переменной ShortDateFormat и допускает следующие варианты: m/d/y, d/m/y, y/m/d;

StrPCopy(Dest:Pchar; Source:string):Pchar;

Функция копирует строку Source в строку Dest. Буфер, в который производится копирование, должен вмещать, как минимум, Length(Source)+1 символ;

StrPLCopy(Dest:Pchar; Source:string; MaxLen: Cardinal):Pchar;

Функция копирует фрагмент строки Source до символа MaxLen включительно в строку Dest. Строка Dest возвращается как результат выполнения функции;

StrPos(Str1,Str2:Pchar):Pchar;

Функция возвращает указатель на первое местонахождение строки Str2 в строке Str1. Если строка Str2 не включена в строку Str1, то данная функция возвращает нуль;

StrScan(str:Pchar; Chr:Char):Pchar;

Функция возвращает указатель на позицию, в которой первый раз встретился символ Chr в строке;

StrRScan(str:Pchar; Chr:Char):Pchar;

Функция возвращает указатель на позицию, в которой последний раз встретился символ Chr в строке;

StrCat(Dest, Source:Pchar):Pchar;

Функция добавляет копию строки Source в конец строки Dest и возвращает результат сложения строк;

StrLCat(Dest, Source:Pchar; MaxLen:Cardinal):Pchar;

Функция добавляет количество символов строки Source в конец строки Dest и возвращает строку Dest;

StrLower(Str:Pchar):Pchar;

Функция преобразует все символы строки Str в строчные и возвращает строку Str в качестве результата;

StrUpper(Str:Pchar):Pchar;

Функция преобразует все символы строки Str в прописные и возвращает строку Str в качестве результата;

По материалам П.Дарахвелидзе, Е. Маркова, Ж. Хрюшкина.
Подготовил Станислав Лаптенок
Last@tut.by

(c) компьютерная газета


Компьютерная газета. Статья была опубликована в номере 50 за 2000 год в рубрике программирование :: delphi

©1997-2024 Компьютерная газета