![](/user_photo/_userpic.png)
Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
нены все операторы текущей строки (поэтому рекомендуется располагать в строке строго по одному оператору, чтобы иметь возможность контролировать выполнение каждого оператора в отдельности). Каждое последующее нажатие клавиши F7 вызовет выполнение оператора в следующей строке. Выполняемый в данный момент оператор будет выделен серым цветом, а ее номер помечен зеленой стрелкой, рис. 6.35. Если в коде встречается вызов процедуры или функции, то будут выполнены все операторы тела этой процедуры (функции)
также в пошаговом режиме.
Пошаговое выполнение в обход. При каждом нажатии клавиши F8 также будут выполнены все операторы текущей строки. Если в коде встречается вы-
зов процедуры или функции, то будут выполнены все операторы тела процеду-
ры (функции) без входа, т.е. "сразу" и указатель будет установлен на следую-
щей после вызова подпрограммы строке.
Окно наблюдений. Пожалуй, самый главный и полезный инструмент от-
ладки. В этом окне можно наблюдать за текущими значениями переменных в процессе выполнения программы. Это средство поможет вам проследить за жизненным циклом интересующих вас переменных и увидеть, как изменяются их значения после выполнения того или иного оператора. Открыть это окно можно командой меню Вид-> Окна отладки ->Окно наблюдений. Еще про-
ще открыть комбинацией клавиш <Ctrl+Alt+W>. Вид окна наблюдений пока-
зан на рисунке 6.36. Чтобы добавить новую переменную щелкните правой кла-
вишей в окне наблюдений, в открывшемся диалоговом окне введите имя пере-
менной или выражение, рис. 6.37. Можно назначить постоянное местоположе-
ние окна наблюдений в настройках окружения, например, так как показано на рис. 6.35. Окно наблюдений имеет такую же ширину, что и инспектор объектов и частично его перекрывает. Это логично, так как в момент отладки инспектор объектов нам не нужен и окно наблюдений не мешает нам работать в редакторе исходного кода. Увидеть значение переменной можно также просто наведя мышь на эту переменную в редакторе исходного кода. На рисунке 6.37. показан
551
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F552x1.jpg)
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
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F556x1.jpg)
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
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F558x1.jpg)
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
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F559x1.jpg)
Глава 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