Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Мансуров. Основы программирования в среде Lazarus. 2010

.pdf
Скачиваний:
45
Добавлен:
27.04.2021
Размер:
6.3 Mб
Скачать

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

нены все операторы текущей строки (поэтому рекомендуется располагать в строке строго по одному оператору, чтобы иметь возможность контролировать выполнение каждого оператора в отдельности). Каждое последующее нажатие клавиши F7 вызовет выполнение оператора в следующей строке. Выполняемый в данный момент оператор будет выделен серым цветом, а ее номер помечен зеленой стрелкой, рис. 6.35. Если в коде встречается вызов процедуры или функции, то будут выполнены все операторы тела этой процедуры (функции)

также в пошаговом режиме.

Пошаговое выполнение в обход. При каждом нажатии клавиши F8 также будут выполнены все операторы текущей строки. Если в коде встречается вы-

зов процедуры или функции, то будут выполнены все операторы тела процеду-

ры (функции) без входа, т.е. "сразу" и указатель будет установлен на следую-

щей после вызова подпрограммы строке.

Окно наблюдений. Пожалуй, самый главный и полезный инструмент от-

ладки. В этом окне можно наблюдать за текущими значениями переменных в процессе выполнения программы. Это средство поможет вам проследить за жизненным циклом интересующих вас переменных и увидеть, как изменяются их значения после выполнения того или иного оператора. Открыть это окно можно командой меню Вид-> Окна отладки ->Окно наблюдений. Еще про-

ще открыть комбинацией клавиш <Ctrl+Alt+W>. Вид окна наблюдений пока-

зан на рисунке 6.36. Чтобы добавить новую переменную щелкните правой кла-

вишей в окне наблюдений, в открывшемся диалоговом окне введите имя пере-

менной или выражение, рис. 6.37. Можно назначить постоянное местоположе-

ние окна наблюдений в настройках окружения, например, так как показано на рис. 6.35. Окно наблюдений имеет такую же ширину, что и инспектор объектов и частично его перекрывает. Это логично, так как в момент отладки инспектор объектов нам не нужен и окно наблюдений не мешает нам работать в редакторе исходного кода. Увидеть значение переменной можно также просто наведя мышь на эту переменную в редакторе исходного кода. На рисунке 6.37. показан

551

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

момент, когда мышь была наведена на переменную n в 56 строке редактора ко-

да.

Рис. 6.35. Пошаговое выполнение приложения

Рис. 6.36. Окно списка наблюдений

Рис. 6.37. Окно добавления новой переменной в список наблюдения

Принято считать, что отладка предшествует тестированию. То есть про-

граммист, разрабатывая программу, сначала отлаживает ее (обнаруживает и

"убивает" всех "жучков"), затем приступает к тестированию. Но, вообще гово-

552

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

ря, тестирование и отладка взаимосвязанные процессы. Зачастую при тестиро-

вании обнаруживаются ошибки, которые исправляются…отладкой, и наоборот,

во время отладки обнаруживаются многие алгоритмические ошибки. Поэтому это словосочетание практически всегда употребляют вместе – тестирование и отладка.

В принципе, тестирование начинается тогда, когда ваше приложение стала вполне работоспособной, то есть перестала "вылетать", "зависать", "зацикли-

ваться" и так далее и стала выдавать результаты. Правильные ли это результаты выявляются тестированием. Но, кроме правильности получаемых результатов,

во время тестирования очень важно проверять "недопустимые", "невозможные"

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

ству, этим и занимались!

6.3.10 Компоненты отображения и выбора данных

Эта группа компонентов позволяет в наглядном виде отображать информа-

цию, а также легко осуществлять выбор нужных данных. Информация в этих компонентах содержится в виде списка (набора) строк. Для работы со списками строк разработан специальный класс TStrings. Этот класс является абстракт-

ным и инкапсулирует методы для работы с наборами строк. От этого класса на-

следуются специализированные классы в компонентах отображения и выбора данных, которые обеспечивают доступ и обработку набора строк в соответст-

вии с функциональностью компонента. Поскольку методы добавления и удале-

ния строк в классе TStrings не реализованы и объявлены как абстрактные,

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

553

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

использовать компонент TMemo.

6.3.10.1. Компонент TMemo

Окно компонента ведет себя как обычный текстовый редактор типа

"Блокнот", т.е. доступны все стандартные функции редактирования (выделение,

копирование, вставка, удаление и пр.).

Информация в TMemo содержится в виде совокупности (массива) строк типа TStrings. Каждый элемент массива содержит ровно одну строку. Дос-

туп к отдельной строке осуществляется с помощью свойства Lines по ее но-

меру (индексу). Индекс указывается, как и положено для массивов, в квадрат-

ных скобках. Нумерация строк начинается с нуля. Общее количество строк со-

держится в свойстве Lines.Count.

Если строка не умещается целиком в окне, то можно установить свойство

WordWrap= true и тогда не уместившаяся часть строки будет автоматически перенесена на следующую строку.

Можно также установить полосы прокрутки свойством ScrollBars.

Возможные значения свойства:

ssNone – установлено по умолчанию, полосы прокрутки отсутствуют.

ssVertical – установить вертикальную полосу прокрутки.

ssHorizontal – установить горизонтальную полосу прокрутки.

ssBoth – установить и вертикальную и горизонтальную полосы.

ssAutoVertical – вертикальная полоса в окне компонента видна, но не доступна, пока окно не заполнится по вертикали.

ssHorizontal – горизонтальная полоса в окне компонента видна, но не доступна, пока окно не заполнится по горизонтали.

ssAutoBoth – объединяет два предыдущих значения.

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

ReadOnly=true.

554

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

Добавление новой строки при вводе данных с клавиатуры осуществляется нажатием клавиши Enter, при этом свойство WantReturns должно быть ус-

тановлено равным true. Если WantReturns= false, то для перехода на новую строку необходимо нажать Ctrl+Enter.

Свойство SelStart указывает начало выделенного текста, а SelLength

длину выделенного текста (количество символов).

Всвойстве Text весь набор строк представляется в виде одной строки с разделителями возврат каретки и перенос строки (#13#10) между строками.

Посмотрим, как программно заполнять поле ввода компонента. Чтобы до-

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

function Add(const S: string): integer; – добавляет строку S

в конец набора строк TMemo и возвращает ее индекс.

procedure Append(const S: string); – просто добавляет строку S

в конец набора строк.

Чтобы добавить целый набор строк, например, из другого компонента

TMemo, можно применить методы:

procedure AddStrings(TheStrings: Tstrings); – где TheStrings набор строк типа TStrings, добавляет этот набор строк к сущест-

вующему.

procedure Assign(Source: TPersistent); – полностью очищает содержимое TMemo и загружает новый набор строк из Source.

Для вставки строки в произвольное место списка строк существует метод

procedure Insert(Index: integer; const S: string); –

где Index номер (индекс) строки куда вставляется строка S. При этом старая строка не исчезает, а сдвигается вниз вместе со всеми нижележащими строками

(их индексы автоматически увеличиваются на единицу).

Заменить содержимое какой-либо строки можно простым оператором присваивания, например, чтобы заменить содержимое строки с индексом к дос-

555

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

таточно записать оператор:

Memo1.Lines[k]:='Содержимое заменяемой строки';

Добавлять строки оператором присваивания тоже можно, но при одном ус-

ловии, нельзя применять этот способ во время создания формы, т.е. в обработ-

чике OnCreate формы.

И, наконец, чтобы удалить строку применяется метод

Delete(Index: integer);

Давайте применим полученные знания на простом примере. Создайте но-

вый проект. Положите на форму два компонента TMemo, две надписи и кнопку примерно так, как показано на рисунке 6.38.

Рис. 6.38. Форма с компонентами TMemo

В обработчик OnCreate формы введите код:

procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.Lines.Append('Это длинная строка, '+ // метод Append

'не умещающаяся в окне Memo1');

Memo1.Lines.Add('А это короткая строка'); // метод Add

end;

556

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

В обработчик OnClick кнопки введите код:

procedure TForm1.Button1Click(Sender: TObject);

var

 

i: integer;

 

begin

 

Memo1.Lines[2]:= 'Акинфеев';

// добавление строк

Memo1.Lines[3]:= 'Аршавин';

// оператором присваивания

Memo1.Lines.Delete(2);

// удаление строки

Memo1.Lines.Insert(2, 'Гус Иванович');// вставка строки

Memo2.Clear; // очистка набора строк Memo2

for i:= 0 to Memo1.Lines.Count - 1 do// добавление строк

Memo2.Lines.Append(Memo1.Lines[i]);// в цикле

//Memo2.Lines.Add(Memo1.Lines[i]);// можно применить Add

{добавление всего содержимого Memo1}

Memo2.Lines.AddStrings(Memo1.Lines);// 1-й способ

Memo2.Lines.Assign(Memo1.Lines);// 2-й, с очисткой

end;

Поэкспериментируйте с вводом текста при разных значениях свойств

WordWrap, WantReturns, ReadOnly и ScrollBars.

Для установки параметров шрифта имеется свойство Font. В нем имеются такие подсвойства, как Name – название шрифта, Size – размер, Color

цвет, Style – стиль начертания шрифта и другие.

Свойство Aligment – служит для выравнивания текста в окне TMemo.

Оно имеет значения:

taLeftJustify – выравнивание по левому краю. taCenter – выравнивание по центру. taRightJustify – выравнивание по правому краю.

557

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

Свойство Font также доступно в программе. Для предыдущего примера добавьте на форму еще одну кнопку, как показано на рис. 6.39.

Напишите для этой кнопки следующий обработчик:

procedure TForm1.Button2Click(Sender: TObject);

begin

Memo2.Font.Size:= 12;

Memo2.Font.Color:= clBlue;

end;

Рис. 6.39. Форма приложения

После запуска приложения и нажатия на кнопку "Изменить шрифт" текст в

Memo2 изменит свой размер и цвет.

Возникает вопрос, а нельзя ли предоставить самому пользователю право изменять атрибуты шрифта? Для этого существует специальный компонент вы-

бора свойств шрифта TFontDialog. Он расположен на странице Dialogs

палитры компонентов. Компонент является не визуальным, так как во время выполнения пользователь увидит не сам компонент, а стандартный диалог, вы-

558

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

зываемый при обращении к этому компоненту. Поэтому его можно располо-

жить в любом месте формы. Показ диалога инициируется специальным мето-

дом компонента Execute. Это функция, которая возвращает true, если в ре-

зультате диалога пользователь в действительности выбрал какие-то параметры шрифта. Выбранные параметры запоминаются в свойствах компонента TFontDialog. Если же пользователь ничего не выбрал и нажал на кнопку Отмена

или клавишу Esc, то функция возвращает false.

Таким образом, для вызова диалога необходимо записать:

if FontDialog1.Execute then

Memo1.Font.Assign(FontDialog1.Font);

Создайте новое приложение. Перенесите на форму компонент TMemo,

TFontDialog, две кнопки и две надписи, как показано на рис. 6.40.

Рис. 6.40. Форма приложения с дополнительным компонентом TFontDialog

В обработчик кнопки "Изменить шрифт" введите код:

procedure TForm1.Button1Click(Sender: TObject);

begin

if FontDialog1.Execute then

Memo1.Font.Assign(FontDialog1.Font);

559

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

Label2.Caption:= Memo1.Font.Name + ', '

+ IntToStr(Memo1.Font.Size);

Memo1.SetFocus;

end;

В обработчик кнопки "Установить шрифт по умолчанию" введите код:

procedure TForm1.Button2Click(Sender: TObject);

begin

Memo1.Font.SetDefault;

Label2.Caption:= Memo1.Font.Name + ', '

+ IntToStr(Memo1.Font.Size);

end;

И, наконец, в обработчик OnCreate формы введите код:

procedure TForm1.FormCreate(Sender: TObject);

begin

Label2.Caption:= Memo1.Font.Name + ', '

+ IntToStr(Memo1.Font.Size);

end;

Теперь пользователь может сам по своему усмотрению устанавливать па-

раметры шрифта, рис. 6.41, 6.42.

560