Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 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