
- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования Pascal
- •Основные элементы языка
- •Переменные. Стандартные типы.
- •Операции отношения
- •Раздел описаний переменных
- •Выражения. Порядок выполнения операций.
- •Константы
- •Комментарии в программе
- •Операторы
- •2.1.7.1. Оператор присваивания
- •2.1.7.2. Операторы ввода/вывода
- •2.1.7.3. Операторы инкремента и декремента
- •Среда разработки Lazarus
- •Русский язык в консольных приложениях
- •Первая программа
- •Открытие существующего проекта
- •Другие способы создания консольных приложений
- •Типовой пустой проект
- •Операции с целыми числами
- •Вместо лирического отступления 2
- •Стандартные функции с целыми аргументами
- •Операции с вещественными числами (тип real).
- •Форматирование вывода
- •Одновременное использование вещественных и целых чисел.
- •Другие стандартные функции с вещественными аргументами
- •Булевы переменные
- •Условные операторы.
- •2.1.22.1 Оператор if …. then
- •2.1.22.2. Оператор if …then ... else
- •Операторы цикла
- •2.1.23.1. Оператор цикла с предусловием
- •2.1.23.2. Оператор цикла с постусловием
- •2.1.23.3. Оператор цикла с параметром.
- •2.1.23.4. Второй вариант оператора цикла с параметром
- •Оператор выбора case
- •Организация простейшего контроля ввода данных.
- •Вычисление сумм сходящихся рядов
- •Реализация некоторых алгоритмов главы 1.
- •Программа решения задачи о поездах и мухе
- •Программа вычисления определенного интеграла
- •Более сложные элементы языка
- •Общая структура Паскаль – программы
- •Процедуры и функции
- •3.1.1.1 Структура процедуры
- •3.1.1.2. Структура функции
- •3.1.1.3 Глобальные и локальные переменные
- •3.1.1.4 Способы передачи параметров
- •3.1.1.5 Процедуры завершения
- •Еще раз о типах данных
- •Классификация типов данных
- •3.2.1.1 Целый тип
- •3.2.1.2. Интервальный тип
- •3.2.1.3. Перечислимый тип
- •3.2.1.4. Множества
- •3.2.1.5. Логический тип
- •3.2.1.6. Вещественный тип
- •3.2.1.7. Указатели
- •Обработка символьной информации в Паскале
- •Символьные и строковые типы данных.
- •3.3.1.1. Тип Char
- •3.3.1.2. Функции для работы с символами
- •3.3.1.3. Тип String
- •3.3.1.4. Строковые процедуры и функции
- •Массивы
- •Динамические массивы
- •Программа решения системы линейных алгебраических уравнений методом Гаусса
- •3.4.1.1. Вариант 1 – с goto
- •3.4.1.2. Вариант 2 – без goto
- •3.4.1.3. Вариант 3 – наилучшая реализация
- •Модули в Паскале
- •Структура модуля
- •Системные модули
- •3.5.2.1. Модуль CRT
- •Файлы
- •Тип данных – запись
- •Файловые типы
- •Процедуры для работы с файлами
- •3.6.3.1. Общие процедуры для работы с файлами всех типов
- •3.6.3.2. Процедуры для работы с текстовыми файлами
- •3.6.3.3. Процедуры для работы с типизированными файлами
- •3.6.3.4. Процедуры для работы с нетипизированными файлами
- •3.6.3.5. Организация контроля ввода/вывода при работе файлами
- •3.6.3.6. Создание простой базы данных с типизированными файлами.
- •Алгоритмы сортировки
- •Обменная сортировка (метод "пузырька")
- •Сортировка выбором
- •Сортировка вставками
- •Метод быстрой сортировки
- •Алгоритмы поиска
- •Поиск в массивах
- •Вставка и удаление элементов в упорядоченном массиве
- •Динамические структуры данных
- •Представление в памяти компьютера динамических структур.
- •Реализация стека с помощью массивов
- •Указатели
- •Стандартные операции с линейными списками
- •Реализация динамических структур линейными списками
- •4.3.6.1. Реализация стека
- •4.3.6.2. Реализация очереди с помощью линейного списка
- •4.3.6.3. Реализация двоичного дерева с помощью линейного списка
- •Сортировка и поиск с помощью двоичного дерева
- •Три источника и три составные части ООП.
- •Классы и объекты.
- •Обращение к членам класса.
- •Инкапсуляция
- •Спецификаторы доступа.
- •Свойства.
- •Наследование
- •Полиморфизм
- •Раннее связывание.
- •Позднее связывание.
- •Конструкторы и деструкторы.
- •Элементы графического интерфейса
- •Различия между консольными и графическими приложениями
- •Визуальное программирование в среде Lazarus
- •Создание графического приложения
- •Форма и ее основные свойства
- •Компоненты
- •Обработчики событий
- •Простейшие компоненты
- •6.3.5.1. Компонент TLabel
- •6.3.5.2. Кнопки TButton, TBitBtn и TSpeedButton
- •6.3.6.1. Компонент TEdit
- •6.3.6.2. Компонент TLabeledEdit
- •6.3.7.1. Компонент TMaskEdit
- •Специальные компоненты для ввода чисел
- •Тестирование и отладка программы
- •Компоненты отображения и выбора данных
- •6.3.10.1. Компонент TMemo
- •6.3.10.2. Компонент TStringGrid
- •6.3.10.3. Компоненты выбора
- •Компонент TListBox
- •Компонент TComboBox
- •Компоненты выбора – переключатели
- •6.3.10.4. Компоненты отображения структурированных данных
- •Компонент TTreeView
- •Компонент TListView
- •Организация меню. Механизм действий - Actions
- •6.3.11.1. Компонент TMainMenu
- •6.3.11.2. Компонент TToolBar
- •6.3.11.3. Компонент TActionList
- •6.3.11.4. Создание приложений с изменяемыми размерами окон
- •Послесловие
- •Литература
- •Алфавитный указатель
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
str: string; begin
tfile:= TStringList.Create; tfile.LoadFromFile('List.txt'); str:= tfile.Text;
{$IFDEF WINDOWS}
str:= SysToUTF8(str);// преобразование в кодировку UTF-8
{$ENDIF}
with ListBox1 do begin
Items.Text:= str; end;
tfile.Free; ListBox1.MultiSelect:= true; ListBox2.Sorted:= true;
end; initialization
{$I unit1.lrs} end.
В компоненте можно отображать не только строки, но и изображения, на-
пример пиктограммы. Однако мы в этой книге эти вопросы рассматривать не будем.
Компонент TComboBox
Этот компонент расположен на странице Standard. Внешний вид компо-
нента показан на рис. 6.62.
626

Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Рис. 6.62. Компонент TComboBox
При нажатии на кнопку с треугольником появится раскрывающийся (гово-
рят еще выпадающий) список. Методы работы с таким списком практически не отличаются от TListBox. По сравнению с TListBox у него есть преимуще-
ство, заключающееся в том, что можно редактировать элементы списка, а также добавлять в список новые элементы. Кроме того, компонент позволяет сэконо-
мить пространство, когда на форме расположены много компонентов. Собст-
венно для этих целей он и используется. К недостаткам можно отнести то, что в нем нельзя выбрать одновременно несколько элементов. Основные свойства компонента:
Items – содержит элементы списка. Доступ к отдельным элементам воз-
можен по индексу, например Items[k] содержит элемент с номером (индек-
сом) k (нумерация начинается с нуля).
Style – стиль отображения данных в компоненте, имеет следующие значе-
ния:
1. csDropDown – раскрывающийся список с окном редактирования, позво-
ляющим пользователю редактировать или добавлять новые строки в список; 2. csDropDownList – раскрывающийся список. В этом режиме разрешено выбирать только существующие элементы списка. Редактировать или до-
бавлять строки в этом режиме нельзя;
3. csSimple – список всегда раскрыт, по существу совпадает с ListBox,
но имеется возможность редактирования и добавления новых строк;
4. csOwnerDrawFixed – раскрывающийся список со строками одинако-
вой высоты, в которых могут отображаться изображения и текст;
5. csOwnerDrawVariable – раскрывающийся список со строками разной
627

6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
высоты, в которых могут отображаться изображения и текст.
Text – содержит выбранный элемент списка или вновь введенную строку;
ItemIndex – содержит индекс выбранного элемента. По умолчанию в мо-
мент проектирования ItemIndex = -1. Если вы запустите приложение с та-
ким значением ItemIndex, то в окне ComboBox ничего не будет отображено.
Особенно если вы используете свойство Style = csSimple, да к тому же,
забудете увеличить высоту Height компонента. В этом случае пользователю будет выведено маленькое пустое окошко без кнопки раскрытия! Поэтому же-
лательно либо во время проектирования, либо программно, например, при соз-
дании формы (OnCreate) устанавливать значение ItemIndex. Чаще всего устанавливают ItemIndex = 0, в этом случае в окно ComboBox будет выве-
ден первый элемент списка. Но можно присвоить ItemIndex и другое значе-
ние (естественно внутри допустимого диапазона индексов элементов списка).
Например, того элемента, который должен быть выбран по умолчанию.
Во время выполнения приложения значение ItemIndex может принимать значение -1. Это происходит в том случае, если в окне компонента производи-
лось редактирование текущего элемента, т.е. по значению ItemIndex = -1
можно узнать, что редактирование проводилось и предпринять соответствую-
щие действия, см. пример ниже;
DropDownCount – задаѐт количество элементов списка, выводимых без
полосы прокрутки.
DroppedDown – указывает состояние компонента.
При DroppedDown= true, список раскрыт.
Рассмотрим несколько примеров.
Создайте новый проект, поместите на форму компоненты TComboBox,
TLabel и TButton, как показано на рис. 6.63.
628

Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Рис. 6.63. Форма программы
Установите свойство Style компонента ComboBox1 равным csDropDownList. В свойстве Items введите любые три фамилии, напри-
мер, как на рисунке 6.64. Пусть это будут фамилии некоторых студентов.
Рис. 6.64. Диалог ввода строк в компонент
В обработчик события OnClick введите следующий код:
procedure TForm1.Button1Click(Sender: TObject); begin
with ComboBox1 do case ItemIndex of
0:ShowMessage('Это отличник');
1:ShowMessage('Это двоечник');
2:ShowMessage('А этот середняк'); else
629
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
ShowMessage('Никто не выбран');
end;
end;
При запуске программы в окне ComboBox1 не будет отображена фамилия студента. Пользователь должен раскрыть список. Как мы уже говорили, это не совсем удобно. Сделаем так, чтобы при запуске программы отображалась пер-
вая фамилия. Кроме того, пусть сообщение выводится сразу после выбора нужного элемента в списке ComboBox1, т.е. обойдемся без кнопки. Для этого используем событие OnSelect.
И еще, во многих случаях в окно ComboBox1 выводится значение, кото-
рое должно быть принято как значение по умолчанию. Если пользователя это значение устраивает, то, обычно, ему достаточно просто нажать клавишу
Enter. Реализуем такую функциональность нашего приложения. Итак, код программы (не забудьте удалить из формы кнопку):
unit Unit1;
{$mode objfpc}{$H+} interface
uses
Classes, SysUtils, FileUtil, LResources, Forms,
Controls, Graphics, Dialogs, StdCtrls, LCLType;
type
{ TForm1 }
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
procedure ComboBox1KeyPress(Sender: TObject; var Key: char); procedure ComboBox1Select(Sender: TObject);
630
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
procedure FormCreate(Sender: TObject); private
{private declarations } public
{public declarations } end;
var
Form1: TForm1; implementation { TForm1 }
procedure TForm1.ComboBox1Select(Sender: TObject); begin
with ComboBox1 do case ItemIndex of
0:ShowMessage('Это отличник');
1:ShowMessage('Это двоечник');
2:ShowMessage('А этот середняк');
else
ShowMessage('Никто не выбран'); end;
end;
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: char);
begin
if Key = #13 then ComboBox1Select(Sender); end;
procedure TForm1.FormCreate(Sender: TObject); begin
ComboBox1.ItemIndex:= 0;
631

6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
end;
initialization
{$I unit1.lrs}
end.
Сделаем более полезную программу. Предположим, в некоторых тексто-
вых файлах содержатся списки нескольких групп студентов. Пусть для опреде-
ленности групп будет три. Необходимо, в зависимости от выбора пользователя,
выводить список студентов выбранной группы. Список группы будем выводить в TListBox. В новом проекте сформируйте вид окна вашего приложения, рис.
6.65.
Рис. 6.65. Форма приложения
В свойстве Items введите любые три названия групп, например, как на рисунке 6.66.
Рис. 6.66. Диалог ввода строк в компонент
632
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Создайте три текстовых файла с именами List1.txt, List2.txt и List3.txt с фамилиями студентов. Заполнять TListBox содержимым файла мы уже умеем, для простоты предположим, что файлы находятся в той же пап-
ке, что и наше приложение. Код программы:
unit Unit1;
{$mode objfpc}{$H+} interface
uses
Classes, SysUtils, FileUtil, LResources, Forms,
Controls, Graphics, Dialogs, StdCtrls, LCLType;
type
{ TForm1 }
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Label2: TLabel;
ListBox1: TListBox;
procedure ComboBox1KeyPress(Sender: TObject; var Key: char);
procedure ComboBox1Select(Sender: TObject); procedure FormCreate(Sender: TObject); procedure LoadListGroup(namefile: string);
private
{private declarations } public
{public declarations } end;
var
633
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Form1: TForm1; implementation { TForm1 }
procedure TForm1.LoadListGroup(namefile: string); var
tfile: TStringList; str: string;
begin
tfile:= TStringList.Create; tfile.LoadFromFile(namefile); str:= tfile.Text;
{$IFDEF WINDOWS}
str:= SysToUTF8(str); // преобразование в кодировку UTF-8
{$ENDIF}
with ListBox1 do begin
Items.Text:= str; end;
tfile.Free; ListBox1.Sorted:= true;
end;
procedure TForm1.ComboBox1Select(Sender: TObject); begin
with ComboBox1 do begin
Label2.Caption:='Список группы ' + Text; case ItemIndex of
0: LoadListGroup('List1.txt');
634
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
1:LoadListGroup('List2.txt');
2:LoadListGroup('List3.txt'); else
ShowMessage('Группа не выбрана'); end;
end;
end;
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: char);
begin
if Key = #13 then begin
ComboBox1Select(Sender);
Key:=#0;
end;
end;
procedure TForm1.FormCreate(Sender: TObject); begin
ComboBox1.ItemIndex:= 0;
ComboBox1.Style:= csDropDownList;
end; initialization
{$I unit1.lrs} end.
Загрузку в TListBox содержимого текстового файла мы оформили в виде процедуры, в которую в качестве параметра передается имя файла, соответст-
вующее выбранной группе.
В заключение рассмотрим пример, как в TComboBox реализуются коррек-
635

6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
тировка и добавление элементов в список. Создайте форму, рис. 6.67.
Рис. 6.67. Форма приложения
Теперь уже установите свойство Style компонента ComboBox1 рав-
ным csDropDown. В свойстве Items введите любые данные. В обработчи-
ке OnSelect в переменной oldItemIndex мы запоминаем индекс выбран-
ного элемента. Если нажата кнопка "Изменить", то оператор
ComboBox1.Items[oldItemIndex]:= ComboBox1.Text;
изменит выбранный элемент новым содержимым. Если пользователь нажмет
кнопку "Добавить", то оператор
ComboBox1.Items.Add(ComboBox1.Text);
добавит новую запись в список.
unit Unit1;
{$mode objfpc}{$H+} interface
uses
Classes, SysUtils, FileUtil, LResources, Forms,
Controls, Graphics, Dialogs, StdCtrls;
636
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ComboBox1Select(Sender: TObject); procedure FormCreate(Sender: TObject);
private
{private declarations } public
{public declarations } end;
var
Form1: TForm1; oldItemIndex: integer;
implementation { TForm1 }
procedure TForm1.ComboBox1Select(Sender: TObject); begin
oldItemIndex:= ComboBox1.ItemIndex; end;
procedure TForm1.FormCreate(Sender: TObject); begin
ComboBox1.ItemIndex:= 0;
ComboBox1.Style:= csDropDown;
end;
637