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

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

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

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

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

____________________________________________________________________

Ffam:= f; end;

procedure THuman.Setname(const AValue: string); begin

if Fname=AValue then exit; Fname:=AValue;

end;

procedure THuman.Setfam(const AValue: string); begin

if Ffam=AValue then exit; Ffam:=AValue;

end;

function THuman.GetData: string; begin

Result:= name + ' ' + fam + Status; end;

end.

Мы видим, что практически никакой разницы нет, за исключением того,

что реализации методов классов следует помещать в раздел implementation

модуля.

6.3.5.2. Кнопки TButton, TBitBtn и TSpeedButton

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

ких-то действий или команд. Щелчок по кнопке мышью вызывает событие

OnClick в обработчике которого программист и инициирует выполнение ка-

500