от Violin Iliev(25-08-2005)

рейтинг (1106)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Програмиране под Линукс. Въведение за начинаещи.

Съдържание:

  • Въведение в статията
  • Инсталация и подготовка на системата за работа
  • Кратко въведение в 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)



    << Въведение в динамичната оптимизация | Модерни методи за управление на паметта в C++ >>