От Delphi 4 к Delphi 6

От Delphi 4 к Delphi 6 Цикл while.
Эта структура является одной из самых гибких программных конструкций. Цикл можно использовать для эмуляции многих синтаксических конструкций, включая все другие варианты встроенных циклов. Синтаксис цикла while с одним оператором имеет следующий вид:
while УсловиеИстинно do
Оператор;.
Синтаксис цикла while с несколькими операторами имеет следующий вид:
while УсловиеИстинно do
begin
Оператор1;
Оператор2;
...
ОператорM;
end;.
Цикл while начинается с зарезервированного слова while. После него следует условное выражение цикла. Данное выражение может быть любым булевым выражением, в том числе:
простая булева переменная или функция, например,
while Continue do ...
операция сравнения, например,
while (Numb <5) do ...
комбинация логических выражений низкого уровня с операторами or или and, например,
while (Numb > 5) and (Numb > 10) do ....
За условным булевым выражением цикла следует зарезервированное слово do. Выражение while — do составляет заголовок цикла. Содержимое цикла, называемое телом цикла, может содержать один оператор или несколько операторов, которые заключаются между ключевыми словами begin — end.
Необходимо отметить, что условие цикла while проверяется в начале каждого прохода, т.е. возможна такая ситуация, когда содержимое цикла не выполнится ни одного раза (в случае, если условное выражение равно False). Для цикла while не надо знать заранее, сколько итераций ему предстоит выполнить.
Рассмотрим пример использования цикла while. Возможно, вам может понадобиться использование чисел, выбранных случайным образом. Для создания приложения поместите на форму компонент ListBox, Edit и Button.
Запишите следующий программный код:
procedure TForm1.Button1Click (Sender: TObject);
var
I: Integer;
begin
ListBox1.Items.Clear;
Randomize;
I:= StrToInt(Edit1.Text);
while I < 1000 do
begin
I:= I + Random (100);
Listbox1.Items.Add ('Номер: ' + IntToStr (I));
end;
end;

end.
Если введете значение I меньше или равное 1000, то выполнятся операторы после условного выражения; если введете значение больше 1000, то произойдет только очистка компонента ListBox1. Следующий пример демонстрирует различие между циклом с фиксированным счетчиком и циклом с псевдослучайным счетчиком. Начните новый проект и поместите в его основную форму компонент список ListBox и две кнопки. Затем в метод обработки события кнопок OnClick можно добавить некоторый код. Первая кнопка содержит простой цикл for для отображения списка чисел. До выполнения этого цикла, который добавляет несколько строк в свойство Items списка, вы должны очистить содержимое самого списка:
procedure TForm1.Button1Click (Sender:TObject);
var
I: Integer;
begin
ListBoxl.Items.Clear;
for I:= 1 to 20 do Llstbox1.Items.Add ('String ' + IntToStr (I));
end;
Код, связанный со второй кнопкой, немного сложнее. Здесь присутствует цикл while, который основан на счетчике, увеличивающимся случайным образом. Для этого вызвана процедура Randomize, которая инициирует генератор случайных чисел, также использована и функция Random со значением диапазона, равным 100. Результатом выполнения этой функции является число от 0 до 99, выбранное случайным образом.
procedure TForm1.Button2Click (Sender: TObject);
var
I: Integer;
begin
ListBoxl.Items.Clear:
Randomize;
I:= 0;
while I < 1000 do begin
I:= I + Random (100);
Listbox1.Items.Add ('Random Number: ' + IntToStr (I));
end;
end;
При каждом щелчке по второй кнопке числа будут различными, так как они зависят от генератора случайных чисел.

Компонент RichEdit.
Редактирование форматированного текста.
Компонент RichEdit обеспечивает два вида форматирования: форматирование символов и форматирование абзацев.
Форматирование символов — это фактически установка атрибутов шрифта (название, размер, цвет, стиль и т.д.). Символьные атрибуты выделенного текста или (если текст не выделен) текущей позиции текстового курсора содержатся в свойстве SelAttributes, доступном из программы.
property SelAttributes: TTextAttributes; — это объект класса TTextAttributes, он имеет свойства Color, Name, Pitch, Size, Style, Height, идентичные одноименным свойствам объекта TFont.
Например, поместите на форму компонент RichEdit и две кнопки Button. Оставьте в компоненте RichEdit текстовое значение. Запишите для кнопок следующий программный код:
procedure TForm1.Button1Click (Sender: TObject);
begin
with RichEdit1.SelAttributes do
begin
Color:= clRed;
Height:= Height + 5;
end;
RichEdit1.Lines.Add('Этот текст будет красным по цвету');
end;

procedure TForm1.Button2Click (Sender: TObject);
begin
RichEdit1.DefAttributes.Color:= clBlue;
RichEdit1.DefAttributes.Style:= [fsBold, fsItalic];
end;
Щелчок по кнопке Button1 обеспечивает цвет текста красным и увеличивает размер на 5 пикселей. Щелчок по кнопке Button2 обеспечивает цвет текста голубым и устанавливает значения шрифта текста, заданного в компоненте по умолчанию.
Класс TTextAttributes имеет также доступное только по чтению свойство ConsistentAttributes. Оно представляет собой множество флагов, показывающих, какие из атрибутов форматирования являются сплошными для выделенного текста, а какие нет.
type
TConsistentAttribute = (caBold, caColor, caFace, caItalic, caSize, caStrikeout, caUnderline, caProtected); TConsistentAttributes = set of TConsistentAttribute;
property ConsistentAttributes: TConsistentAttributes;
CaBold определяет для символов значение полужирное или не полужирное.
CaColor определяет цвет символьного шрифта.
CaFace определяет шрифт символов.
CaItalic определяет наличие или отсутствие курсива для символов.
CaSize определяет размер символьного шрифта.
CaStrikeout определяет, имеют символы зачеркнутый стиль или нет.
CaUnderline определяет, имеют символы подчеркнутый стиль или нет.
CaProtected определяет, защищен текст или нет.
Форматирование абзацев включает: выравнивание абзаца (по левому краю, по правому краю, по центру), установку отступов абзаца (включая отступ слева, отступ справа и отступ первой строки), установку позиций табуляции и маркировку жирными точками. Атрибуты выделенных абзацев или (если текст не выделен) абзаца, в котором находится текстовый курсор, содержатся в свойстве Paragraph.
property Paragraph: TParaAttributes; свойство доступно программно и является объектом класса TParaAttributes. Свойство TParaAttributes — Alignment, Leftlndent, Rightlndent, Firstlndent, Numbering, TabCount и массив Tab содержат информацию о выравнивании, отступах, маркировке и позициях табуляции.
Программный код, показанный ниже, поясняет использование свойства Paragraph.
procedure TForm1.FormCreate (Sender: TObject);
begin
with TRichEdit.Create(Self) do
begin
Parent:= Self;
Align:= alClient;
Lines.Clear;
// set numbering компонент RichEdit генерирует событие OnSelectionChange. Обработчик этого события должен устанавливать компоненты панели инструментов в состояния, соответствующие атрибутам выделенного текста. Нетрудно сообразить, что в результате последнего компоненты генерируют события и форматирование выполняется снова. Избежать повторного форматирования позволяет обычная булевская переменная (назовем ее Atribute), которая запрещает установку атрибутов на время работы метода обработки события OnSelectionChange.
10. Итак, определите в классе формы булевское поле Atribute:
type TForm1 = class(TForm)
...
private
Atribute: Boolean;
...
Инициализация поля может не выполняться, так как по своему обыкновению конструктор объекта обнуляет все поля. Для булевского поля Atribute это эквивалентно установке в значение False.
11. Когда пользователь вводит имя шрифта, в выпадающем списке генерируется событие OnChange. Обработчик этого события будет устанавливать имя шрифта в атрибутах выделенного текста:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if Atribute then Exit;
RichEdit1.SelAttributes.Name:= Combobox1.Text;
end;
Вы можете ввести имя шрифта вручную или выбрать его из выпадающего списка. В последнем случае было бы очень удобно, чтобы после выбора шрифта фокус ввода автоматически передавался управляющему элементу RichEdit. Для этого достаточно определить следующий обработчик для события OnClick компонента ComboBox1:
procedure TForm1.ComboBox1Click(Sender: TObject);
begin
RichEdit1.SetFocus;
end;
12. Когда вы вводите размер шрифта, используя компонент Edit, генерируется событие OnChange. Запишите метод обработки этого события, устанавливающий размер шрифта в атрибутах выделенного текста:
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Atribute then Exit;
RichEdit1.SelAttributes.Size:= StrToInt(Edit1.Text);
end;
13. Установка эффектов шрифта (полужирный, курсив, подчеркнутый) выполняется с помощью кнопок В, I, U. Чтобы щелчок по этим компонентам вызывал установление соответствующих атрибутов выделенного текста, определите следующие методы обработки события OnClick для компонентов BoldButton, ItalicButton, UnderlineButton:
procedure TForm1.BoldButtonClick (Sender: TObject);
begin
if Atribute then Exit;
if BoldButton. Down then
with RichEdit1.SelAttributes do Style:= Style + [fsBold]
else
with RichEdit1. SelAttributes do Style:= Style — [fsBold];
end;

procedure TForm1.ItalicButtonClick (Sender: TObject);
begin
if Atribute then Exit;
if ItalicButton. Down then
with RichEdit1.SelAttributes do Style := Style + [fsItalic]
else
with RichEdit1. SelAttributes do Style := Style - [fsItalic];
end;

procedure TForm1.UnderlineButtonClick(Sender: TObject);
begin
if Atribute then Exit;
if UnderlineButton. Down then
with RichEdit1.SelAttributes do Style := Style + [fsUnderline]
else
with RichEdit1. SelAttributes do Style:= Style — [fsUnderline];
end;
14. Чтобы обеспечить выравнивание абзацев при выборе соответствующих кнопок на панели инструментов, определите следующие обработчики события: OnClick для компонентов LeftButton, CenterButton, RichtButton:
procedure TForm1.LeftButtonClick(Sender: TObject);
begin
if Atribute then Exit;
RichEdit1.Paragraph.Alignment:= taLeftJustify;
end;
procedure TForm1.CenterButton Click(Sender: TObject);
begin
if Atribute then Exit;
RichEdit1.Paragraph.Alignment:= taCenter;
end;

procedure TForm1.RightButtonClick(Sender: TObject);
begin
if Atribute then Exit;
RightEdit1.Paragraph.Alignment:= taRightJustify;
end;
15. Управляющие элементы на панели инструментов должны отражать текущее форматирование текста при любом перемещении текстового курсора. Чтобы решить эту задачу, определите для компонента RichEditl метод обработки события OnSelectionChange, который устанавливает свойства управляющих элементов согласно атрибутам выделенного текста.
procedure TForm1.RichEdit1Change (Sender: TObject);
begin
Atribute:= True;
with RichEdit1 do
try
if caFace in SelAttributes.ConsistentAttributes then
ComboBox1.Text := SelAttributes.Name
else
ComboBox1.Text := ' ';
if caSize in SelAttributes.ConsistentAttributes then
Edit1.Text := IntToStr(SelAttributes.Size)
else
Edit1.Text := ' ';
BoldButton.Down := (fsBold in SelAttributes.Style) and
(caBold in SelAttributes.ConsistentAttributes);
ItalicButton.Down := (fsItalic in SelAttributes.Style) and
(caItalic in SelAttributes.ConsistentAttributes);
UnderlineButton.Down:= (fsUnderline in SelAttributes.Style) and
(caUnderline in SelAttributes.ConsistentAttributes);
case Paragraph.Alignment of
taLeftJustify: LeftButton.Down := True;
taCenter: CenterButton.Down := True;
taRightJustify: RightButton.Down := True;
end;
finally
Atribute := False;
end;

end;
Несмотря на внушительный размер, метод на самом деле прост, и вы с ним разберетесь сами. Имеется лишь одно замечание по поводу использования свойства ConsistentAttributes. Форматирование выделенного текста может быть не сплошным. Например, только его часть может быть написана курсивом. В этом случае свойство ConsistentAttributes имеет значение False. Так вот, при корректировке значений в компонентах метод проверяет, принадлежит ли соответствующий атрибут к множеству сплошных атрибутов. Если атрибут выделенного текста не сплошной, то состояние соответствующего компонента панели управления считается неопределенным: имя и размер шрифта — пустые, кнопки управления эффектами шрифта — отпущены.
16. Пример почти готов, но остался неразрешенным один мелочный вопрос. Необходимо проинициировать свойства всех компонентов. Лучше всех это сделает только что написанный метод RichEditlChange, поэтому вам остается поместить его вызов в метод обработки события формы OnShow (событие OnCreate для этого не подходит, поскольку оно возникает в тот момент, когда Windows еще не подготовила структуры данных управляющего элемента RichEdit):
procedure TForm1.FormShow (Sender: TObject);
begin
RichEdit1Change(RicHEdit1);
end;
17. Запустите проект на компиляцию, теперь вы можете набирать свой текст, производить его редактирование. Теперь это приложение вы можете внедрять в более масштабный проект с возможностью работы над текстом.

Владимир Скуратов



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

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