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

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

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

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

____________________________________________________________________

TActionList содержит список названий действий и связанных с ними имен обработчиков, которые эти действия реализуют. Чтобы связать какой-то ком-

понент с нужным действием, достаточно раскрыть в Инспекторе объектов спи-

сок в свойстве Action и выбрать нужное название. При этом все свойства этого действия и обработчик автоматически перенесутся в данный компонент,

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

вающая подсказка.

Поместите на форму компоненты TActionList и TImageList. Занеси-

те в TImageList несколько пиктограмм. В свойстве Images компонента

TActionList укажите имя компонента TImageList. Дважды щелкните по компоненту TActionList на форме. Появится редактор списка действий. Для того чтобы добавить новое действие вы можете:

Нажать на кнопку с изображением знака плюс. В правом окне редактора появится новое действие со стандартным именем Action1;

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

брать "Новое действие" или "Новое стандартное действие";

Рис. 6.97. Редактор списка действий

741

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

____________________________________________________________________

В редакторе списка действий щелкните правой клавишей мыши. Появит-

ся контекстное меню, рис. 6.98;

Рис. 6.98. Добавление нового действия

И наконец, вы можете использовать клавишу Ins для ввода нового действия или нажать Ctrl+Ins для ввода нового стандартного действия.

Теперь, что такое стандартное действие. Разработчиками Lazarus созданы специальные классы, реализующие типовые, наиболее часто встречающиеся действия, так что для них даже не требуется писать обработчики! Если вы вы-

берете "Новое стандартное действие", появится окно со списком стандартных действий, рис. 6.99.

На рисунке вы видите, что стандартные действия разбиты на категории.

Там же вы видите имена соответствующих классов. Все остальные действия (по терминологии Lazarus unknown – неизвестные) относятся к классу TAction.

Но лучше говорить просто действия или нестандартные действия.

742

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

____________________________________________________________________

Рис. 6.99. Стандартные действия

Выберем, например стандартное действие TFileOpen, рис. 6.100, 6.101.

Рис. 6.100. Свойства

Рис. 6.101. Добавление стандартного действия

743

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

____________________________________________________________________

Мы видим, что в Инспекторе объектов автоматически заполнились свойст-

ва Caption, Hint, ShortCut. Задайте необходимое значение свойству

ImageIndex. В редакторе списка действий рядом с именем действия тут же появится соответствующее изображение, рис. 6.102.

Рис. 6.102. Добавление пиктограммы

Раскрыв свойство Dialog, вы можете настроить свойства стандартного диалога открытия файла. При этом обратите внимание, мы на форму компонент

TOpenDialog не переносили! Он уже реализован в классе TFileOpen.

При добавлении нестандартного действия вам необходимо будет заполнить свойства этого действия, в частности, упомянутые выше свойства Caption,

Hint, ShortCut. И обязательно написать обработчик OnExecute, реали-

зующий нужное действие. Это событие возникает, когда пользователь иниции-

ровал действие, например, нажал на кнопку. Кроме этого события для каждого действия определены еще два события OnHint и OnUpdate. Событие OnHint

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

разом:

744

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

____________________________________________________________________

procedure FileOpen1Hint(var HintStr: string;

var CanShow: Boolean);

Вы можете заменить текст подсказки Hint, указав новый текст в параметре

HintStr.

Событие OnUpdate возникает, когда пользователь "ничего не делает". Вы можете использовать это событие для выполнения каких-то подготовительных операций.

В заключение отметим, что в стандартных действиях диалогов, требующих выбора (категории Search, Dialog, File) отсутствуют события

OnExecute и OnUpdate. Вместо них введены события BeforeExecute

(возникает перед вызовом диалога), OnAccept (возникает, если пользователь произвел выбор) и OnCancel (возникает, если пользователь в диалоге выбор не произвел).

Например, для того чтобы получить имя файла, выбранного пользователем в стандартном действии FileOpen1 надо в обработчике OnAccept записать

Fname:= FileOpen1.Dialog.FileName;

Напишем теперь программу метода наименьших квадратов с применением механизма действий, заодно определим порядок или методику разработки та-

ких приложений.

Прежде всего, необходимо продумать и определить список тех действий

(на бумаге), которые мы будем реализовывать. Записывается это в свободной форме, так, чтобы было понятно самому себе.

Итак, мы знаем, что экспериментальные данные содержатся в текстовом файле. Поэтому первое действие очевидно. Необходимо предоставить пользо-

вателю возможность в диалоге открыть файл с экспериментальными данными.

Назовем это действие "Открыть файл". Заодно отмечаем для себя, что проще всего для этого использовать стандартное действие. Второе действие - выпол-

745

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

____________________________________________________________________

нить необходимые вычисления, согласно алгоритму метода наименьших квад-

ратов. Пусть это действие будет называться "Вычисления". Затем, необходимо дать пользователю возможность просмотреть график, построенный по задан-

ным экспериментальным точкам. Назовем это действие "Построение графика по заданным экспериментальным точкам". И, наконец, необходимо построить совмещенный график. График по экспериментальным точкам и график подоб-

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

вмещенного графика". Предусмотрим еще одно стандартное действие – выход из программы. После того, как список действий составлен, уже более или менее ясно, как будет выглядеть главное меню нашей программы. Отмечаем для себя,

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

же обязательно отметьте, какие пункты меню и кнопки инструментальной па-

нели должны быть вначале доступны, а какие нет. И когда следует недоступные пункты и кнопки сделать доступными.

Конечно, при разработке больших и сложных программ невозможно все заранее предусмотреть и учесть. По мере продвижения работы над программой будут добавляться новые действия и, быть может, удаляться некоторые старые.

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

боты совершенно необходимо. Это позволит вам мысленно обозреть общую структуру вашей будущей программы и значительно поможет вам в дальней-

шей работе.

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

вий создайте следующие действия, рис. 6.103.

746

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

____________________________________________________________________

Рис.6.103. Список действий

Перенесите на форму компонент TMainMenu. Создайте пункт меню

"Файл". Присвойте ему имя Menu_File. Создайте подпункт. Присвойте имя

Menu_Open. Другие свойства пока не заполняйте! Рис. 6.104.

Рис. 6.104. Создание меню приложения

Теперь в свойстве Action раскройте список и выберите действие FileOpen1. Свойство Caption Menu_Open вместо New Item2 автоматически изменилось на "Открыть…", рис. 6.105, 6.106.

747

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

____________________________________________________________________

Рис. 6.105. Создание меню приложения

Рис. 6.106. Свойства

Кроме того, автоматически заполнились свойства Hint, ImageIndex и ShortCut! Нам теперь осталось написать обработчик для действия

FileOpen1. Поскольку это стандартное действие – открытие файла, нужно написать обработчик события OnAccept.

procedure TForm1.FileOpen1Accept(Sender: TObject);

// процедура выбора, открытия и чтения файла данных var

f: TextFile; i: integer; Fname: string;

begin

Fname:= FileOpen1.Dialog.FileName;

Fname:= UTF8ToSys(Fname); //преобразование в системную кодировку

AssignFile(f, Fname);

Reset(f);

748

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

____________________________________________________________________

// отключение контроля ошибок ввода/вывода

{$I-}

// чтение количества экспериментальных точек

Readln(f, n);

if IOResult <> 0 then

begin

ShowMessage('Ошибка при чтении из файла!');

exit;

end;

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

SetLength(x, n);

SetLength(y, n);

for i:= 0 to n - 1 do begin

read(f, x[i]);

if IOResult <> 0 then begin

ShowMessage('Ошибка при чтении из файла!'); exit;

end;

end;

for i:= 0 to n - 1 do begin

read(f, y[i]);

if IOResult <> 0 then begin

ShowMessage('Ошибка при чтении из файла!'); exit;

end;

749

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

____________________________________________________________________

end;

{$I+}

CloseFile(f);

A_Calculate.Enabled:= true;

end;

Обработчик практически совпадает с обработчиком Menu_OpenClick

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

ем. А имя файла мы получаем с помощью свойства FileName класса TFileOpen. Во-вторых, чтобы сделать доступными пункт меню "Вычислить" и

соответствующую кнопку на панели инструментов в предыдущей программе в обработчике Menu_OpenClick мы вынуждены были записывать два операто-

ра

MCalculate.Enabled:= true;

TB_Calculate.Enabled:= true;

А здесь достаточно написать один

A_Calculate.Enabled:= true;

Сформируйте теперь остальные пункты меню и назначьте им соответст-

вующие действия из TActionList. Напишите требуемые обработчики.

Теперь поместите на форму TToolBar. Добавьте необходимые кнопки и точно так же для каждой кнопки в свойстве Action установите соответствую-

щие действия.

Окончательный код программы будет следующим:

750