Програмиране под Линукс. Въведение за начинаещи.
Съдържание:
Въведение в статията
Инсталация и подготовка на системата за работа
Кратко въведение в Lazarus
Нашата първа програма - Hello World
Изработка на Прост текстов редактор
Добавяне на нови компоненти към Lazarus. Добавяне на достъп до база данни чрез инсталиране на TDbf.
Изработка на Личен телефонен указател
Работа с Timer и графика в режим на изпълнение
Въпроси и отговори
Въведение в статията
Динамичната среда на софтуерната индустрия изисква гъвкави, стабилни, многофункционални и приятни за окото продукти. Важно напоследък преимущество е възможността на програмите да се стартират на разнообразни операционни системи. Разработването на такъв софтуер е често сложно, трудоемко и отнема повече време.
В тази статия, ще се опитам да ви предоставя решение на този проблем. Статията е изключително подходяща за хора работещи с Delphi, както и за тези занимаващи се с езика Паскал. Ще ви запозная с прекрасната среда за програмиране Lazarus и възможностите които предоставя тя. Статията може да се използва и от начинаещи в програмирането с елементарни познания на езика Паскал. Имате възможност да се запознаете с една от най-интересните среди за програмиране на Linux, Windows и Mac OS приложения.
Инсталация и подготовка на системата за работа
Официалния сайт на Lazarus е http://lazarus.freepascal.org ;
За да работи успешно Lazarus изисква да имате инсталирани FreePascal и FreePascal Sources. Необходимите пакети може да свалите от: http://sourceforge.net/project/showfiles.php?group_id=89339 ;
Свалете следните файлове:
> fpc-2.0.0-0.i586.rpm – Последна версия на FreePascal;
> fpcsrc-2.0.0-0.i386.rpm – Това е source кода на всички пакети към FreePascal;
> lazarus-0.9.8-fpc_2.0.0_0.i386.rpm – Последна стабилна версия на Lazarus.
След като вече сте свалили пакетите, пристъпваме към тяхното инсталиране. Отворете терминал и преминете в режим на root. Ако не знаете как, просто напишете “su” и въведете root паролата. Преминете в директорията на пакетите. Ако не знаете как, използвайте командата “cd” за избиране на директория и “ls” за списък на съдържанието на директорията. Така например ако сте свалили файловете на Desktop-а на потребител MyUser стъпките, който предприемате са следните:
>su
Enter Password: *****
>cd /
> cd /home/MyUser/Desktop/
Пристъпвате към инсталиране на пакетите по следния начин:
rpm -i fpc-2.0.0-0.i586.rpm
rpm -i fpcsrc-2.0.0-0.i386.rpm
rpm -i lazarus-0.9.8-fpc_2.0.0_0.i386.rpm
Ако получите съобщение, че липсват необходими пакети е необходими да ги инсталирате и да повторите инсталацията. В SuSe може да инсталирате липсващите пакети чрез YaST, в други дистрибуции с помощта на “apt-get” или предоставения от тях софтуер за работа с пакети.
Поздравления! Преминахте през най-трудната част, а именно инсталирането :)
Кратко въведение в Lazarus
Lazarus е проект, който има за цел да изработи интегрирана среда за разработване на софтуер, възможно най-близка до световно известния продукт Delphi. Разграничава се от другите подобни продукти с леснотата и бързината за изработване на програми с база данни и програми, за които графичния интерфейс е от голямо значение. Интересно е това, че веднъж написаният софтуер на Lazarus може да се компилира на Linux, Windows и Mac OS без да се налага промяна на source кода.
Фиг. 1
Нека стартираме Lazarus. Може да го намерите лесно в менюто на KDE(фиг. 1). Ако сте ползвали някога Delphi, ще установите, че с Lazarus си приличат много. Ще опиша набързо най-важните части от интерфейса. Горе на екрана виждате основния прозорец на програмата(фиг. 2-а). Тук е менюто, всички бутони за управление, както и палитрата с така наречените LCL(Lazarus Component Library). От ляво се намира така наречения “Object Inspector”(фиг. 2-б). Тук можете да настройвате обектите, да прикачите към тях различни задачи за изпълнение и др. Останалото което виждате е прозореца, който редактирате(фиг. 2-в), а под него е редактора на source-а(фиг. 2-г).
Фиг. 2
Вече може да преминем към изработването на примерни програми. Ще изработим следните програми:
HelloWorld;
Прост текстов редактор;
Личен телефонен указател( демонстрира използването на база данни).
2D демо(графики в режим на изпълнение и Timer);
Нашата първа програма - Hello World
Всяка среда за програмиране и всеки самоучител, за
който и да е език започва с изработването на най-простата програма. В нашия
случай ще изработим малко прозорче с един бутон. При натискане на бутона ще се
появява съобщение “Hello World”. Ще обясня
изработването на стъпки:
1)
Стартираме Lazarus и създаваме нов
проект от меню File-New… и после
Project->Application;
2)
Избираме TButton от лентата с компоненти
(LCL) и го поставяме чрез натискане на празния
прозорец (Form1);
3)
Маркираме новосъздадения бутон и от “Object
Inspector” променяме “Caption” на
“Click Me”;
4)
Щракаме два пъти на бутона за да създадем процедура, която ще се изпълни
при натискането му;
5)
Отваря ни се “Source Editor”. Въвеждаме:
Showmessage(‘Hello World’);
Цялата процедура на бутона
изглежда така:
procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage(‘Hello World’);
end;
6)
Може да натиснете на прозореца, но извън бутона за да маркираме
Form1 и да смените “Caption”
на “Hello World”;
7)
Нека пробваме програмата. За да компилираме и стартираме натискаме
F9.
Поздравления! Вече написахте
първата си програма на Lazarus. Ако сте получили
грешка, моля проверете дали сте изпълнили всичко правилно или пък свалете
проекта от:
http://www.violin-bg.com/doc/HelloWorld.tar.bz2 и го сравнете с вашия.
Изработка на Прост текстов редактор
Адрес на изходния код:
http://www.violin-bg.com/doc/SimpleEditor.tar.bz2
Избрах да ви покажа как да направите прост текстов
редактор, защото не е трудоемко и ще ви покаже как за нула време може да
изработите работеща програма на Lazarus.
Ето и стъпките:
1)
Започваме отново със стартиране на Lazarus
и създаване на нов проект от меню File-New… и
Project->Application;
2)
Нека променим заглавието на прозореца на “Simple text editor”.
Предполагам че се досещате, че преди това трябва да се маркирали прозореца “Form1”
и че заглавието се сменя, като промените “Caption” от
“Object Inspector”;
3)
Сега нещо много важно за повечето програми, а именно меню. Нека създадем
едно меню и за нашия софтуер. Изберете “TMainMenu” от
“Standard” на лентата с компоненти(LCL).
Натискаме на прозореца за да вмъкнем компонента. Появява се малко квадратче
32х32 пиксела. Това означава, че компонента не е видим по време на изпълнение на
програмата или иначе казано това квадратче няма да се вижда. Натиснете го два
пъти. Отваря се прозорец с име “Menu Editor” или
преведено на български “Редактор на меню”. Маркираме “New
Item 1” и задаваме “Caption” на “File”.
Натискаме с десния бутон на мишката върху менюто в “Menu
Editor”. Избираме “Insert New Item (After)”
за да добавим ново меню. Избираме новосъздаденото меню и настройваме “Caption”
на “Options”. Като натиснем на “File” с десния бутон и
изберем “Create Submenu” ще създадем подменю. Нека го
направим. Сега в подменюто може да създаваме менюта принадлежащи към “File” по
същия начин, по който създадохме “Options”. Експериментирайте докато разучите
процеса по създаване на менюто. След като разучите всичко създайте меню със
следната структура:
>File
>New
>Open
>Save as...
>Exit
>Options
>Font
4)
Вече създадохме меню. Ред е да въведем полето, където ще се редактира
текста. Отново от “Standard” на палитрата с компоненти
въвеждаме ‘TMemo”. Поставеното поле не покрива целия
прозорец. Бихме могли да го разпънем по прозореца, но какво ще стане, когато
потребители промени големината му? Добър въпрос. Решението тук е по-просто,
от колкото очаквате. Lazarus може да подрежда и разпъва компонентите автоматично
според размера на прозореца. За да окажем на Lazarus, че искаме компонента
винаги да запълва целия прозорец задаваме “Align” от “Object
Inspector” на “alClient”. Веднага забелязваме
промяната, която ни удовлетворява;
5)
Остана да добавим компоненти на прозорците за Шрифта, Отваряне и
Затваряне.От палитрата с компоненти в раздел “Dialogs”
добавяме към прозореца “TOpenDialog”, “TSaveDialog”,
“TFontDialog”;
6)
Стигнахме до момента, в който ще пишем кода. От меню-то на прозореца(ВНИАМАНИЕ:
тук не става на въпрос за Menu Editor, а за менюто,
което се е появило в последствие) избираме “File” и тикаме на “New” за да
отворим редактора на код и добавяме следното към процедурата, която се
създава автоматично:
procedure TForm1.MenuItem3Click(Sender: TObject);
begin
Memo1.Lines.Clear;
еnd;
7)
По същия начин въвеждаме кода за меню “Open” :
procedure TForm1.MenuItem4Click(Sender: TObject);
begin
if OpenDialog1.Execute and not(OpenDialog1.FileName
= '') then
begin
memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
end;
8)
За меню “Save as..”:
procedure TForm1.MenuItem5Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
if FileExists(SaveDialog1.FileName) then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
if not FileExists(SaveDialog1.FileName) then
Memo1.Lines.SaveToFile(SaveDialog1.FileName + '.txt');
end;
end;
9)
За меню “Exit”:
procedure TForm1.MenuItem6Click(Sender: TObject);
begin
application.Terminate;
end;
10)
Меню Options->Font:
procedure TForm1.MenuItem7Click(Sender: TObject);
begin
FontDialog1.Font := Memo1.Font;
if FontDialog1.Execute then
begin
Memo1.Font := FontDialog1.Font;
end;
end;
11)
Останаха няколко неща за оправяне. Първо в полето за въвеждане на текст
няма ленти за скролиране. Маркираме полето и в “Object
Inspector” задаваме на “Scrollbars” стойност “ssBoth”.
При запазване и отваряне на файлове искаме да ограничим да се показват само
файлове с разширение “.txt”. Избираме
OpenDialog1 и на Filter
пишем “Text|*.txt”. Същото правим и за SaveDialog1;
Програмата е завършена. Ако не
иска да се компилира или изкарва грешка, моля сверете и сравнете проекта от:
http://www.violin-bg.com/doc/SimpleEditor.tar.bz2
Добавяне на нови компоненти към
Lazarus. Добавяне на достъп до база данни чрез инсталиране на
TDbf.
За да изработим програма
ползваща база данни, е необходимо да инсталираме подходяща библиотека за достъп
до такава база. Ще инсталираме Tdbf. Това е компонент за достъп до dBASE
файлове. Може да го намерите в директорията на Lazarus и не е нужно да го
теглите. Стартирайте Lazarus. След това меню
Components->Open package file(.lpk).
Избираме пакета на Tdbf, които се намира в директория
“/usr/share/lazarus/components/tdbf”
. Ще се отвори прозорче със съдържанието на пакета и няколко бутона. Натиснете “Install”
и търпеливо изчакайте докато Lazarus се прекомпилира и
рестартира. Вече имаме инсталиран необходимия пакет и може да продължим напред
към изработването на примерна програма, ползваща база данни.
Изработка на Личен телефонен указател
Адрес на изходния код:
http://www.violin-bg.com/doc/Database.tar.bz2
Имаме всичко необходимо за изработване на нашия телефонен
указател. Ето и стъпките, през който трябва да преминем:
1)
Стартираме Lazarus и започваме нов проект.
Настройваме “Caption” на прозореца на “Address
Book”;
2)
Поставяме два бутона в горния ляв ъгъл на прозореца, като ги разполагаме
хоризонтално един до друг. Заглавието на първия бутон правим на “New”,
а на втория “Open“;
3)
Добавяме “TOpenDialog” и “TSaveDialog”.
Тях ще използваме при изпълнението на бутоните, които тъкмо създадохме. Добре е
също да зададем “Filter” на тези два компонента
“DataBase|*.dbf”;
4)
Сега е време да поставим компонентите за достъп до база данни. Можете да
ги намерите в раздел “Data Access” и “Data
Controls”. От “Data Access” добавяме към
прозореца компонент “Tdbf”. Това е този, който
инсталирахме в предната тема. Той ще чете файла на базата данни и ще предава
информацията към компонентите от “Data Controls”, но
за да може да комуникира с тях е нужен посредник. Това е “Tdatasource”
намиращ се в същия раздел. Поставяме го на прозореца;
5)
За да направи живота ни по-лесен и да не се налага да пишем всичко в
по-прости програми като тази, Lazarus разполага с
богата гама от компоненти. Много полезен компонент от “Data
Controls” е “TDBNavigator”. Той ще се грижи за
въвеждането, редактирането, изтриването и приемането на записи към базата данни,
като по този начин ще си спестим доста бутони и код. Поставяме “TDBNavigator”
точно под бутоните, като разпъваме десния му край до края на прозореца.
Настройваме му Anchors->akRight на
“True” от “Object Inspector”;
6)
Добавяме и “TDBGrid” и разпъваме компонента,
така че да попълни останалата част от прозореца. След това за компонента
настройваме всичко в Anchors на “True”;
7)
Остана да свържем компонентите, които ще комуникират помежду си, преди да
преминем към писането на кода. Избираме “TDBGrid”,
поглеждаме в “Object Inspector” и от падащото меню на
“DataSource” избираме “datasource1”.
Избираме “TDBNavigator” и задаваме “datasource1”
за “DataSource”. Сега избираме самия “Datasource1”
и задаваме “Tdbf” за “DataSet”;
8)
Сега преминаваме към писане на кода за бутон “New”.
При натискането му, програмата ще създава нов файл с база данни.
Ето и кода за
този бутон:
procedure TForm1.Button1Click(Sender: TObject);
begin
if savedialog1.Execute and not(savedialog1.FileName
= '') then
begin
Dbf1.Active := false;
Dbf1.FilePathFull := extractfilepath(savedialog1.filename);
Dbf1.TableLevel := 4;
Dbf1.TableName := extractfilename(savedialog1.filename)+'.dbf';
With Dbf1.FieldDefs do
begin
Clear;
Add('NAME', ftString, 25, True);
Add('TELEPHONE', ftInteger, 10, True);
End;
Dbf1.CreateTable;
Dbf1.Exclusive := true;
Dbf1.Open;
Dbf1.Active := true;
end;
end;
9)
За бутон “Open” кода е само:
procedure TForm1.Button2Click(Sender: TObject);
begin
if opendialog1.Execute and not(opendialog1.FileName
= '') then
begin
Dbf1.Active := false;
Dbf1.FilePathFull := extractfilepath(opendialog1.filename);
Dbf1.TableName := extractfilename(opendialog1.filename);
Dbf1.Open;
Dbf1.Active := true;
end;
end;
Е това е нашата примерна програмка. Проста но функционална,
нали? :) Знам че информацията за работа с база данни е недостатъчно. Ако искате
да научите още, може да посетите:
http://wiki.lazarus.freepascal.org/index.php/Lazarus_Tdbf_Tutorial
Работа с Timer и графика в
режим на изпълнение
Адрес на изходния код:
http://www.violin-bg.com/doc/demo2.tar.bz2
Тук ще изработим проста демонстрация на
Timer и TPaintBox, както и чертането на графики
в Lazarus. Нека да не губим време и да се захванем на
работа:
1)
Както винаги, започваме нов проект и сменяме заглавието на прозореца на “Demo”;
2)
Този път искаме прозореца да има точно определени размери и да не може да
се разпъва от потребителя. Затова задаваме “bsSingle”
на “BorderStyle“, “False” за “BorderIcons->biMinimize”,
“240” на “ClientHeight” и
“320” за “ClientWidth”;
3)
Поставяме TPaintBox, което ще намерите в раздел
“Additional”. Сменяме му “Align”
на “clClient” за да го разпънем на прозореца;
4)
Последния компонент, който поставяме е TTimer,
който ще намерите в раздел “System”. Настройте “Interval”
на таймера да е “1000” и се убедете че “Enabled” е “True”;
5)
Отваряме кода на проекта и декларираме следното след “implementation”:
var
{31+1=32x10 = 320 /10 големина на 1 кв./ аналогично: (23+1)x10=240}
Map: array[0..31,0..23] of integer;
6)
Задаваме код за “OnCreate” на прозореца:
procedure TForm1.Form1Create(Sender: TObject);
var
x,y,i: integer;
begin
Randomize;
for x := 0 to 31 do
begin
for y := 0 to 23 do
begin
i := Random(3);
Map[x,y] := i;
end;
end;
end
7)
Кода на таймера(Timer1) е:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.OnCreate(self);
PaintBox1.Repaint;
end;
8)
И последно остана да добавим метода за изчертаване на графиките към “PaintBox1”.
На “OnPaint” задаваме следния код:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i,z: integer;
begin
for i := 0 to 31 do
begin
for z := 0 to 23 do
begin
if map[i,z] = 0 then
begin
PaintBox1.Canvas.Brush.Color := clBlue;
PaintBox1.Canvas.Rectangle(i*10,z*10,(i*10)+10,(z*10)+10);
end
else if map[i,z] = 1 then
begin
PaintBox1.Canvas.Brush.Color := clYellow;
PaintBox1.Canvas.Rectangle(i*10,z*10,(i*10)+10,(z*10)+10);
end
else if map[i,z] = 2 then
begin
PaintBox1.Canvas.Brush.Color := clRed;
PaintBox1.Canvas.Rectangle(i*10,z*10,(i*10)+10,(z*10)+10);
end;
end;
end;
end;
С това нашата демонстрация е завършена. Надявам се, че сте
добили представа каква е функцията на “TTimer” и “TPaintBox”.
Въпроси и отговори
В: Мога ли да
направя игра с Lazarus?
О: Да. Бихте
могли да направите почти всяка игра, която си помислите, стига тя да ви е по
силите :) Препоръчвам ви да си свалите JediSDL, което
е библиотека за SDL, която работи на
FreePascal и Lazarus. Като
примерна игра може да погледнете “Златен век 1” (http://openfmi.net/projects/goldencentury/);
В: Мога ли да
разработвам 3D приложения с
Lazarus?
О: Да. Посетете
http://www.glscene.org
Това са библиотеки за OpenGL, който вече
работят и на Lazarus.
В: Защо
Lazarus се прекомпилира при инсталиране на нов пакет?
O: Lazarus е млад проект и
все още няма завършена такава опция. За сега е нужно прекомпилиране.
В: Защо програмите,
които Lazarus компилира са толкова големи, как да ги
смаля?
O: По подразбиране Lazarus
компилира заедно с информацията от debug-ера. За да я
премахнете използвайте програмата “strip” например от
командния ред: “strip vashata_programa”.
След това може да използвате UPX за да компилирате
изпълнимия файл и бихте могли да стигнете до приятните 400-500kb,
който не са много имайки предвид множеството библиотеки включени в него, за
който не е споменато в този документ.
В:
Lazarus е 100% съвместим с Delphi.
Така ли?
О: Не. Той не е
100% съвместим, но цели да бъде такъв.
В: Защо примерите
в документа са на английски а не на български. Защо вместо “File”
не е “Файл”?
О: Избрах да са
на английски, защото кирилизацията под Linux често
затруднява начинаещи, а тази статия е насочена предимно за такива потребители;
Този документ е
написан от Виолин Георгиев Илиев.
Авторски права ©
Виолин Георгиев Илиев 2005(www.violin-bg.com)