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

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

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

Глава 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