Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
osnovy_programmirovanija_v_srede_lazarus.pdf
Скачиваний:
185
Добавлен:
18.03.2015
Размер:
6.53 Mб
Скачать

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

____________________________________________________________________

Рис. 6.18. Список уже имеющихся обработчиков событий

Если вам нужно, чтобы ваше приложение реагировало на какое-то событие точно таким же образом, как и на некоторое другое событие, и обработчик это-

го события уже имеется, то вы можете просто выбрать из списка нужный вам обработчик события. В нашем примере для события OnDblClick вы можете выбрать обработчик FormClick или FormCreate. Этим можно избежать неоправданного дублирования кода.

6.3.5 Простейшие компоненты

Рассмотрим теперь некоторые компоненты библиотеки LCL Lazarus. Дос-

туп к компонентам в Lazarus организован через палитру компонентов, рис. 6.19.

Рис. 6.19. Палитра компонентов Lazarus

Палитра компонентов состоит из страниц или вкладок, в которых и нахо-

дятся компоненты, сгруппированные по некоторому признаку. На рисунке 6.19

показана страница Standard, в которой расположены наиболее часто исполь-

зуемые, так называемые стандартные компоненты. По названию страницы можно понять, какие компоненты находятся в той или иной вкладке. Например,

ясно, что на странице Dialogs находятся компоненты для организации диало-

484

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

____________________________________________________________________

га с пользователем.

В соответствии с предназначением книги, мы не будем рассматривать все компоненты (для этого необходимо писать новую книгу примерно такого же объема, что и эта!).

6.3.5.1. Компонент TLabel

Этот компонент, его еще называют меткой или надписью, позволяет ото-

бразить некоторый текст на экране. Основные свойства этого компонента:

Name – имя в приложении, используется для доступа к компоненту.

Caption – текст, который будет отображаться в поле компонента.

Color – цвет фона надписи.

Font – это свойство является составным. С помощью этого свойства можно настроить параметры шрифта, для отображения текста надписи: цвет букв

(Color), размер шрифта (Size), название шрифта (Name) и т.д.

Alignment – выравнивание текста надписи. Здесь taLeftJustify – по левому краю, taCenter – по центру, taRightJustify – по правому краю.

Height – высота надписи в пикселах.

Width – ширина надписи в пикселах.

AutoSize – автоматическое изменение размера надписи в зависимости от длины текста. True – вертикальный и горизонтальный размер надписи зависит от длины текста, False – размеры компонента устанавливаются вручную, вы-

равнивание текста производится свойством Alignment.

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

дится в одну строку.

Visible – определяет видимость компонента во время выполнения прило-

жения. По умолчанию имеет значение True, т.е. компонент виден в момент

485

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

____________________________________________________________________

выполнения приложения.

Таковы наиболее часто используемые свойства компонента TLabel. В ин-

спекторе объектов вы найдете еще множество свойств, разобраться с которыми вы можете самостоятельно.

Наиболее важными свойствами являются Name и, естественно Caption.

В Caption вы задаете текст надписи, а в Name имя, которое будет ис-

пользоваться вами для доступа к компоненту в программе.

Рассмотрим пример. Практически в любой книге посвященной программи-

рованию для начинающих рассматривается пример, которому даже присвоено имя – Hello World. Эта простейшая программа просто выводит текст при-

ветствия на экран. Не отступим от этой традиции и мы. Давайте напишем эту программу. Запустите Lazarus, создайте новый проект. Если вы в настройках окружения убрали галочку "Открывать последний проект при запуске", то но-

вый проект создастся автоматически. Перенесите на форму компонент TLabel.

Это делается очень легко и просто. В палитре компонентов на странице

Standard (по умолчанию открыта именно эта страница) найдите компонент

TLabel, рис. 6.20.

Рис. 6.20. Страница "Standard" палитры компонентов

Кроме того, если немного подержать указатель мыши над компонентом,

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

486

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

____________________________________________________________________

деленным, так что все его свойства будут доступны в инспекторе объектов.

Нажмите на свойство Caption, его значение (по умолчанию Label1) бу-

дет выделено синим цветом. Можете сразу набирать текст надписи. Наберите

"Hello, World!" Этот текст появится не только в окошке ввода свойства

Caption, но и сразу будет виден в поле текста компонента, рис. 6.21.

Рис. 6.21. Пример ввода текста надписи

Посмотрим, какие изменения произошли в коде по сравнению с програм-

мой с пустым окном (см. раздел 6.3.1). Мы видим, что Lazarus добавил в описа-

ние класса формы TForm1 экземпляр класса TLabel Label1, причем авто-

матически, без нашего участия! Как только мы добавляем на форму тот или иной компонент, Lazarus тут же добавит экземпляры классов соответствующих компонентов, формируя таким образом описание класса формы вашего прило-

жения. Нажмите клавишу F9. После компиляции и запуска вашего приложения на экран будет выведено окно с надписью "Hello, World!", рис. 6.22.

487

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

____________________________________________________________________

Рис. 6.22. Окно графического приложения с компонентом TMemo

Рассмотрим еще одно интересное свойство, которое довольно часто при-

меняется. Это свойство Visible. С помощью этого свойства можно управлять видимостью компонента во время работы приложения.

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

Создайте новый проект. Перенесите на форму три компонента TLabel.

Компонент Label1 разместите в центре формы. Свойство Caption оставьте без изменения. Компонент Label2 разместите в правом верхнем углу формы,

примерно так, как показано на рисунке 6.23.

Рис. 6.23. Форма программы

Свойство Caption измените на "English". Компонент Label3 размес-

тите прямо на компонент Label2 так, чтобы он закрывал его (оказывается так можно делать!). Свойство Caption измените на "Русский". Выделите фор-

му. Проще всего это сделать в инспекторе объектов, рис. 6.24.

488

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

____________________________________________________________________

Рис. 6.24. Инспектор объектов. События формы

Откройте вкладку События, выберите событие OnCreate. Нажмите на кнопку с троеточием или дважды щелкните по полю с треугольником. Lazarus

тут же добавит в описание класса формы соответствующий метод, а в редакто-

ре исходного кода появится заготовка для реализации этого метода – обработ-

чика события, рис. 6.25.

Рис. 6.25. Заготовка обработчика события

Обработчик событий это обычная процедура. В обработчике события

OnCreate между операторами begin и end введите следующий код (для удобства привожу текст процедуры полностью:

489

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

____________________________________________________________________

procedure TForm1.FormCreate(Sender: TObject);

begin

Label1.Caption:= 'Привет, Мир!';

Label2.Visible:= true;

Label3.Visible:= false;

end;

Выделите компонент Label2, опять же проще будет через инспектор объ-

ектов. Во вкладке События, выберите событие OnClick. В его обработчике

введите код:

procedure TForm1.Label2Click(Sender: TObject); begin

Label2.Visible:= false;

Label3.Visible:= true;

Label1.Caption:= 'Hello, World!!';

end;

Теперь выделите компонент Label3, выберите событие OnClick. В его

обработчике введите код:

procedure TForm1.Label3Click(Sender: TObject);

begin

Label2.Visible:= true;

Label3.Visible:= false;

Label1.Caption:= 'Привет, Мир!';

end;

Запустите приложение, рис. 6.26.

490

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

____________________________________________________________________

Рис. 6.26. Окно приложения

Если нажать на надпись English, приветствие выведется на английском языке, а надпись изменится на Русский, рис. 6.27.

Рис. 6.27. Окно приложения после нажатия на надпись "English"

Если мы снова нажмем на надпись Русский, текст приветствия вновь вы-

ведется на русском языке, а текст надписи изменится на English.

Вам, наверное, приходилось видеть программы, в которых реализован мно-

гоязычный интерфейс. Переключение с одного языка на другой в них реализо-

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

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

жется, здесь нечего и улучшать. В общем-то, вы правы. Единственное замеча-

ние, которое можно сделать относится, скорее, к стилю программирования. Я

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

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

491

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

____________________________________________________________________

фиксы, например во многих наших программах для обозначения указателей мы использовали префикс " р "( pHead, pCurrent и т.д.). Исходя из этого, для переменных целого типа можно применять префикс " i ", для переменных ло-

гического типа префикс " b " и т.д.

Для компонентов тоже можно использовать префиксы, например для

TLabel уместно использовать префикс "lb".

Существуют и другие способы именования, тем более что есть немало и ярых противников венгерской нотации. Не стану их описывать. При желании вы можете найти все это в Интернете.

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

но и другим. Будете вы использовать префиксы, не будете использовать, это ваше дело. Основной принцип здесь – понятность, то есть все обозначения должны быть понятны и не только вам, но и другим.

Представьте себе, что вы написали какую-то достаточно большую про-

грамму. Через несколько месяцев, а, может быть лет, вам или кому-то другому

(конечно, с вашего разрешения!) понадобилось ее модернизировать. Если в ва-

шей программе будут обозначения, типа "ааа" или "х123", то в вашей про-

грамме будет трудно разобраться не только тому другому, но и вам самому!

Кхорошему стилю также относится наличие в программе комментариев.

Издесь не должно быть крайностей. Сухие односложные комментарии типа

"х – это переменная" одна крайность. Многочисленные, многословные ком-

ментарии чуть ли не после каждого оператора другая крайность. Важно найти золотую середину!

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

мы. Во всех наших программах этой книги мы использовали отступы и ком-

ментарии.

Вернемся к нашей программе. Здесь используются три компонента

TLabel. Lazarus присвоил им по умолчанию имена Label1, Label2 и

492

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

____________________________________________________________________

Label3. Понятно, что это надписи. Поэтому применение слова Label вполне логично и оправдано. Но дальше идет простая нумерация! А если в программе

10, 20, 100 надписей? Очень скоро вы запутаетесь, что означает, например

Label5 и, например, Label12.

Поэтому при небольшом числе одинаковых компонентов вполне допусти-

мо использовать имена по умолчанию, но все же лучше, особенно если количе-

ство одинаковых компонентов больше трех, выбирать информативные имена,

которые отражают суть того или иного объекта. При этом не бойтесь придумы-

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

граммисту. Хотя, если вы будете работать, ну скажем, в Microsoft, то за этот идентификатор вас слегка пожурят и попросят изменить на другое, более по-

нятное им имя!

Исходя из этих рассуждений, перепишем нашу программу в виде:

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, LResources, Forms, Controls,

Graphics, Dialogs, StdCtrls, Windows;

type

{ TForm1 }

TForm1 = class(TForm)

L_Hello: TLabel; // здесь будет выводиться само приветствие

L_English: TLabel; // для переключения на английский язык

L_Russian: TLabel; // для переключения на русский язык procedure FormShow(Sender: TObject);

procedure L_EnglishClick(Sender: TObject);

493

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

____________________________________________________________________

procedure L_RussianClick(Sender: TObject); private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; implementation { TForm1 }

procedure TForm1.FormShow(Sender: TObject); begin

L_Hello.Caption:= 'Привет, Мир!'; end;

procedure TForm1.L_EnglishClick(Sender: TObject); begin

L_English.Visible:= false;

L_Russian.Visible:= true;

L_Hello.Caption:= 'Hello, World!';

end;

procedure TForm1.L_RussianClick(Sender: TObject); begin

L_English.Visible:= true;

L_Russian.Visible:= false;

L_Hello.Caption:= 'Привет, Мир!';

end; initialization

494

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

____________________________________________________________________

{$I unit1.lrs}

end.

Повторяю, вы вольны выбирать любые имена для своих объектов в про-

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

тов, более логичные, информативные и понятные с вашей точки зрения. Этот пример лишь иллюстрация к тому, что было сказано выше.

Имеются ли различия при создании собственных классов в программах с графическим интерфейсом по сравнению с консольными приложениями?

Давайте реализуем последний пример из главы V с конструкторами и вир-

туальными функциями в виде GUI-приложения. Для этого создайте новый про-

ект и поместите на форму четыре компонента TLabel. Код программы:

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls, Unit2;

type

{ TForm1 }

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

procedure FormShow(Sender: TObject); private

{ private declarations }

495

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

____________________________________________________________________

public

{ public declarations } end;

type

TStudent = class(THuman) private

group: string; public

constructor Create(gr: string); function GetData: string; function Status: string; override;

end;

type

TProfessor = class(THuman) private

kafedra: string; public

constructor Create(kaf: string); function GetData: string; function Status: string; override;

end; var

Form1: TForm1; Student: TStudent; Professor: TProfessor; fname: string;

496

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

____________________________________________________________________

implementation

function TStudent.Status: string; begin

Result:= ' – студент'; end;

constructor TStudent.Create(gr: string); begin

inherited Create('Андрей', 'Аршавин'); group:= gr;

end;

function TStudent.GetData: string; begin

Result:= inherited GetData + ', группа ' + group; end;

constructor TProfessor.Create(kaf: string); begin

inherited Create('Алексей', 'Попов'); kafedra:= kaf;

end;

function TProfessor.Status: string; begin

Result:= ' - преподаватель'; end;

function TProfessor.GetData: string; begin

497

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

____________________________________________________________________

Result:= inherited GetData + ', кафедра ' + kafedra; end;

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject); begin

Student:= TStudent.Create('"Арсенал"'); fname:= Student.GetData; Label1.Caption:= 'Это: ' + fname;

Professor:= TProfessor.Create('"Телеканал Россия 2"'); fname:= Professor.GetData;

Label2.Caption:= 'Это: ' + fname; Student.name:= 'Виталий'; Student.fam:= 'Петров'; Student.group:= '"ПОВТАС-1/09"'; fname:= Student.GetData; Label3.Caption:= 'Это: ' + fname; Professor.name:= 'Иван'; Professor.fam:= 'Иванов';

Professor.kafedra:= '"Программирование"'; fname:= Professor.GetData; Label4.Caption:= 'Это: ' + fname; Student.Free;

Professor.Free;

end; initialization

{$I unit1.lrs}

498

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

____________________________________________________________________

end.

unit Unit2;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils; type

{ THuman }

THuman = class private

Fname: string;

Ffam: string;

procedure Setname(const AValue: string); procedure Setfam(const AValue: string);

public

property name: string read Fname write Setname; property fam: string read Ffam write Setfam; constructor Create(n, f: string);

function GetData: string;

function Status: string; virtual; abstract; end;

implementation { THuman }

constructor THuman.Create(n, f: string); begin

Fname:= n;

499

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]