
Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
ких-либо действий, команд и процедур. В палитре компонентов имеются две разновидности кнопок. На странице Standard имеется компонент TButton,
а на странице Additional компонент TBitBtn.
Рассмотрим свойства, присущие только кнопке. Такие его свойства, как
Name, Left, Top, Height, Width, Font, Visible и др. имеют тот же смысл,
что и для рассмотренного ранее компонента TLabel.
Caption – текст, отображаемый на кнопке.
Enabled – признак доступности кнопки. По умолчанию имеет значение
True, то есть кнопка доступна. Если False, то кнопка в данный момент не-
доступна. Надпись на кнопке имеет блеклый вид, нажатие на кнопку не приво-
дит ни к каким действиям, даже если имеется обработчик события OnClick.
Default – если установлено значение True, то нажатие клавиши Enter
будет эквивалентно щелчку по кнопке мышью.
Cancel – если установлено значение True, то нажатие клавиши Esc бу-
дет эквивалентно щелчку по кнопке мышью.
Компонент TBitBtn отличается от TButton тем, что на нем можно ото-
бражать пиктограммы. Перечисленные выше свойства для TButton имеют ме-
сто и для TBitBtn. Кроме этого, этот компонент имеет и свои особые свойст-
ва.
Kind – задает тип кнопки. Имеются несколько предопределенных типов кнопки с готовой пиктограммой и текстом:
bkAbort – с текстом "Прервать".
bkAll – с текстом "Все".
bkCancel – с текстом "Отмена".
bkClose – с текстом "Закрыть".
bkCustom – произвольный текст, устанавливается программистом.
bkHelp – с текстом "Справка".
bkIgnore – с текстом "Пропуск".
501
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
bkNo – с текстом "Нет".
bkNoToAll – с текстом "Нет для всех".
bkOK – с текстом "ОК".
bkRetry – с текстом "Повтор".
bkYes – с текстом "Да".
bkYesToAll – с текстом "Да для Всех".
Glyph – если вас не устраивают предлагаемые рисунки, вы можете выбрать другие. Будет открыто диалоговое окно, необходимо указать путь к этому ри-
сунку.
Margin – задает расстояние от края кнопки до рисунка (в пикселах). По умолчанию -1. В этом случае рисунок и текст располагаются в центре.
Layout – определяет положение рисунка на кнопке. Можно выбрать:
blGlyphLeft – слева.
blGlyphRight – справа.
blGlyphBottom – снизу.
blGlyphTop – сверху.
Spacing – задает расстояние в пикселах между рисунком и текстом кноп-
ки.
Рассмотрим пример. Положите на пустую форму две кнопки TButton и
одну TBitBtn. Для кнопки Button1 установите свойство
Caption="Показать кнопку", для кнопки Button2 установите свойство Caption="Сделать доступной". Для кнопки BitBtn1 установите свойство
Kind= bkClose, Enabled= False, Visible= False, рис. 6.28.
502

Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Рис. 6.28. Форма приложения
В обработчик события OnClick для Button1 введите код:
procedure TForm1.Button1Click(Sender: TObject);
begin
BitBtn1.Visible:= true;
end;
В обработчик события OnClick для Button2 введите код:
procedure TForm1.Button2Click(Sender: TObject);
begin
BitBtn1.Enabled:= true;
end;
Откомпилируйте и запустите приложение. Вы видите, что кнопка
BitBtn1 сразу после запуска не видна. Нажмите на кнопку "Показать кнопку". Кнопка BitBtn1 станет видна, но будет недоступна. Теперь на-
жмите на кнопку " Сделать доступной". Кнопка BitBtn1 станет доступ-
на. Закройте с ее помощью приложение.
Кнопки TSpeedButton (она находится на странице Additional)
обычно используются в качестве быстрых кнопок в панелях инструментов. На
503
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
них также можно поместить некоторое изображение. Разумеется, их можно ис-
пользовать и как обычные кнопки. Отличительной особенностью этих кнопок является возможность фиксации нажатого состояния. Для этого используются свойства GroupIndex и AllowAllUp.
По умолчанию свойство GroupIndex имеет значение 0. В этом случае кнопка ведет себя как обычная кнопка. Если значение GroupIndex > 0, то при нажатии на кнопку она останется в нажатом состоянии. Если свойству
AllowAllUp присвоить значение = true, то при повторном нажатии на кнопку она возвратится в нормальное состояние.
Если присвоить свойствам GroupIndex нескольких кнопок одинаковое значение > 0, то при нажатии следующей кнопки она останется в нажатом состоянии, а предыдущая кнопка вернется в обычное отжатое состояние (свой-
ство AllowAllUp должно иметь значение = true для всех этих кнопок).
Узнать в каком состоянии находится кнопка (нажатом или отжатом) можно по свойству Down. Если Down = true, то кнопка в нажатом состоянии.
6.3.6 Организация ввода данных. Однострочные редакторы TEdit, TLa-
beledEdit
Любая программа в своей работе использует какие-то исходные данные.
Чаще всего эти данные вводятся пользователем с клавиатуры.
Для организации ввода используются компоненты TEdit, TLabeledEdit и др. Сигналом завершения ввода и начала обработки вве-
денных данных служит обычно нажатие пользователем кнопки. Для заверше-
ния ввода также часто используется клавиша Enter.
6.3.6.1. Компонент TEdit
С помощью этого компонента можно вводить и редактировать некоторый
504

Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
текст. Этот компонент носит также название однострочный редактор.
Text – вводимое значение содержится в этом свойстве в виде строки сим-
волов. По умолчанию содержит строку "Edit1".
AutoSelect – если установлено значение True, то при передаче фокуса на компонент, весь текст в поле редактирования будет выделен.
ReadOnly – если установлено значение True, то текст в поле редактиро-
вания доступен только для чтения, при этом сохраняется возможность копиро-
вания текста в буфер обмена.
Рассмотрим пример, консольный вариант которого мы рассматривали в разделе 3.3.1.3. Сделаем этот же пример в виде графического приложения. Как вы помните, в примере имитировался случай авторизации пользователя для входа в систему.
Перенесите на форму компонент TEdit, очистите свойство Text. Также нам понадобятся кнопка и надпись. Расположите их на форме так, как показано на рисунке 6.29, соответственно изменив свойства Caption формы, надписи и кнопки.
Рис. 6.29. Форма приложения
В редакторе исходного кода в обработчик события OnCreate формы введите следующий код:
procedure TForm1.FormCreate(Sender: TObject);
begin
passw:= '1234';
505
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
n:= 1;
end;
А в обработчик OnClick кнопки следующий код:
procedure TForm1.Button1Click(Sender: TObject); begin
if passw <> Edit1.Text then begin
Edit1.SetFocus; if n = 1 then begin
ShowMessage('Неправильный пароль!'); inc(n);
end else begin
if n = 3 then begin
ShowMessage('Вам отказано в доступе');
Close();
end else begin
Stroka:= 'Вы ' + IntToStr(n) + ' раза ввели неправиль-
ный пароль';
Stroka:= Stroka + ' После 3-й попытки вам будет отказано в
доступе';
ShowMessage(Stroka);
506
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
inc(n);
end
end
end
else
begin
ShowMessage('Вы успешно авторизовались!');
Close();
end;
end;
В разделе описания переменных модуля, добавьте следующие описания переменных:
var
Form1: TForm1;
passw: string[4];
Stroka: string;
n: integer;
Обратите внимание – чтобы введенные нами переменные были доступны в обработчиках, мы поместили их объявления в разделе interface.
Запустите приложение и поэкспериментируйте с вводом различных паро-
лей. Правильный пароль "1234".
В программе мы использовали функцию IntToStr(n), которая перево-
дит целое число в ее строковое представление и стандартную процедуру
ShowMessage, для вывода сообщения с кнопкой ОК. Единственным парамет-
ром этой процедуры является строка символов.
Можно ли улучшить программу?
Многие пользователи привыкли завершать ввод в однострочном редакторе
507
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
нажатием клавиши Enter. Для того чтобы реализовать эту возможность про-
сто установите у кнопки свойство Default равным True в инспекторе объектов. Однако учтите, если у вас в программе несколько кнопок, то сработа-
ет та кнопка, которая имеет в этот момент фокус ввода. Отслеживать фокус при большом числе компонентов становится делом довольно обременительным.
Выход заключается в написании обработчика в компоненте Edit1 на событие
OnKeyPress. В этом обработчике имеется параметр Key, которому система передает код нажатой клавиши. Код клавиши Enter равен #13 (см. табл. 3.4. в
разделе 3.3.1). Отсюда обработчик будет выглядеть следующим образом:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
if Key <> #13 then exit;
if passw <> Edit1.Text then begin
Edit1.SetFocus; if n = 1 then begin
ShowMessage('Неправильный пароль!'); inc(n);
end else begin
if n = 3 then begin
ShowMessage('Вам отказано в доступе');
Close();
end
508
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
else begin
Stroka:= 'Вы ' + IntToStr(n)+ ' раза ввели неправильный
пароль';
Stroka:= Stroka + ' После 3-й попытки вам будет отказано в
доступе';
ShowMessage(Stroka);
inc(n); end
end end else begin
ShowMessage('Вы успешно авторизовались!');
Close();
end;
end;
От обработчика Button1Click код отличается лишь одним первым оператором
if Key <> #13 then exit;
К сожалению, здесь имеет место почти полное дублирование кода. Чтобы избежать этого создадим процедуру и в обработчиках будем просто ее вызы-
вать. Окончательно программа будет иметь вид:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
509
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Classes, SysUtils, FileUtil, LResources, Forms,
Controls, Graphics, Dialogs,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: char);
procedure FormCreate(Sender: TObject); procedure avtorization;
private
{private declarations } public
{public declarations } end;
var
Form1: TForm1; passw: string[4]; Stroka: string; n: integer;
implementation { TForm1 }
510