dla programistów
Lazarus i pudełko
z hasłami
Marek Sawerwain
rodowiska błyskawicznego rozwi- i Blender, choć dwa ostatnie przykłady wy-
jania oprogramowania (ang. rapid wodzą się z aplikacji komercyjnych. Do
application development, w skrócie wymienionych pakietów można także
ŚRAD) są bardzo popularne wśród dołączyć jeszcze jeden pakiet, który może
osób, które tworzą oprogramowanie z inter- przyczynić się do jeszcze większej popu-
fejsem GUI. Podstawową zaletą tego typu larności Linuksa, a jest nim Lazarus, czyli
narzędzi jest skrócenie czasu pracy nad w pewnym sensie darmowe Delphi. Sam
interfejsem. Znanym przykładem tego typu pakiet, co prawda, ciągle posiada status
środowiska jest Delphi. Bety, ale zaraz postaram się udowodnić,
Przez długi czas Delphi było dostęp- iż jest to projekt, który warto wypróbować
ne tylko dla systemu Windows. W końcu już teraz.
firma Borland postanowiła wydać wersję
dla Linuksa, ale trzeba przyznać, że Kylix
Instalacja pakietu
nie zachwycił programistów związanych
Lazarus
z Linuksem, nawet gdy Borland wydał
Instalację pakietu najlepiej wykonać za po-
wersję C++ Buildera dla Linuksa, dostęp-
mocą przygotowanych pakietów w forma-
ną w ramach pakietu Kylix 3. Podstawo-
cie rpm, ale przygotowano również pakiety
wą wadą było oparcie całego środowiska
w formacie deb. W pierwszej kolejności in-
o emulator Wine, co spowodowało, iż śro-
stalujemy pakiet fpc, a pózniej fpc-doc
dowisko wymagało bardzo mocnej maszy-
oraz fpc-src. Ostatni w kolejności jest sam
ny. Dziś może nie jest to już tak ważne, ale
pakiet Lazarus. Warto pokusić się o insta-
przecież Linux jako system, wraz z serwe-
lację snapshotów, gdyż dość często to te
rem X Window i środowiskami KDE czy
wersje posiadają najnowsze komponenty,
GNOME, jest wystarczająco dojrzałym
ale, jak można łatwo zgadnąć, mogą być bar-
produktem i nie ma potrzeby emulowa-
dzo niestabilne. W przypadku Linuksa La-
nia środowiska WIN32, aby istniały dobre
zarus wymaga do pracy obecności biblio-
i dostępne dla każdego środowiska RAD.
teki GTK+ 1.2. Z tego powodu musimy zad-
Drugą wadą jest licencja oraz cena pakietu
bać o instalację tego pakietu. Warto też in-
Borlanda. Co prawda, dostępna jest wersja
DVD
stalować pakiety Lazarusa bez spełniania
Po uruchomieniu Linux+ Live darmowa, ale względem wersji komercyj-
zależności, co jest ważne, jeśli system pa-
DVD możesz zapoznać się
nej jest ona pozbawiona wielu cennych
kietów rpm w danej dystrybucji nie dostar-
z Lazarusem i gotową aplikacją
kontrolek.
cza wprost odpowiednich nazw zgodnych
do przechowywania haseł.
Środowisko programistów skupionych
z pakietem Lazarusa. W tym przypadku
wokół idei Open Source udowodniło, iż
Na płycie CD/DVD instalację wykonujemy za pomocą pole-
potrafi wytworzyć oprogramowanie bardzo
Na płycie CD/DVD znajduje
cenia:
dobrej jakości, czego znakomitym przykła-
się środowisko deweloperskie
dem jest jądro Linuksa, kompilator GCC -i --nodeps lazarus-0.9.12
Lazarus oraz kod zródłowy rpm
tworzonego programu. i wiele innych projektów, takich jak GIMP, -0.i386.rpm
KDE, GNOME czy nawet OpenOffice.org
70 maj 2006
dla programistów
Lazarus
Listing 1. Kopiowanie hasła do schowka
Pascal wiecznie żywy
Kolejne pokolenia programistów nadal
mogą programować w języku Pascal dzię-
procedure TMainForm.CopyPassToClipBTNClick(Sender: Tobject);
ki Delphi oraz darmowemu pakietowi
var
FPC (Free Pascal Compiler). Ten drugi
s : string;
stał się podstawą środowiska Lazarus.
c : Tclipboard;
Zawiera kompilator języka Pascal i trze-
begin
ba przyznać, że jest on jednym z lep-
if sel_row <> -1 then
szych. Ponadto, jest dostępny dla wielu
begin
różnych platform sprzętowo-programo-
s:=CategoryGrid.Cells[1, sel_row];
wych.
c:=clipbrd.Clipboard;
Najważniejszą zaletą kompilatora
c.AsText:=s;
FPC jest implementacja języka zgodnego
end;
z najpopularniejszą wersją Pascala, przy-
end;
gotowaną przez firmę Borland. Dostępne
są moduły typowe dla Borlanda, takie jak
Nasz projekt Jak zawsze, warto przygotować dia-
Crt, a nawet BGI, ale obecnych jest rów-
Program pudełko z hasłami możemy bez gram blokowy najważniejszych zdarzeń,
nież wiele rozszerzeń, takich jak np. API
trudu napisać również za pomocą bibliote- które pojawiają się w programie. Przed-
OpenGL czy dostęp do GTK+. Jedną z wie-
ki GTK+ czy Qt, ale zastosowanie Lazarusa stawia go Rysunek 1.
lu cennych innowacji wprowadzonych do
pozwoli nam na wstępne zapoznanie się ze
języka jest możliwość bezpośredniego
środowiskiem oraz sprawdzenie, czy będzie Początek i główne okno
stosowania instrukcji MMX.
nam ono przydatne. Tworzenie naszego programu należy roz-
Autorzy wprowadzili także przeciąża-
Naszym zadaniem jest utworzyć aplika- począć od utworzenia odpowiedniego
nie operatorów, a to oznacza, iż w Pas-
cję, w której będziemy przechowywać hasła, typu projektu. W tym celu udajemy się
calu możemy pisać kod typu c:=a+b;,
wykorzystywane np. podczas korzystania do menu File i wybieramy opcję o nazwie
w którym poszczególne zmienne są np.
z różnorakich serwisów WWW. W apli- New... (jeśli w naszym systemie zmien-
typu TVector2D. Sam operator dodawa-
kacji będziemy przechowywać spis haseł, na LC_ALL jest ustawiona na język polski,
nia został przeciążony w następujący spo-
a program będzie generował losowe ha- to Lazarus będzie posługiwał się polski-
sób:
sła o zadanej długości. Aby nasza aplikacja mi nazwami). Ukaże się okno, w którym
była łatwiejsza w użyciu podczas codzien- wybierzemy typ projektu. W naszym
operator + (v1,v2 : TVector2D)
nej pracy, do naszego programu doda- przypadku interesuje nas kategoria Project,
vout : Tvector2D;
my również funkcję kopiowania hasła do a w niej pozycja Application. Po jej wybra-
begin
schowka. W ten sposób użytkownik może niu i naciśnięciu przycisku OK, Lazarus
vout.a := v1.a + v2.a;
obsługiwać program bez konieczności samo- utworzy projekt oraz jedno okno formu-
vout.b := v1.b + v2.b;
dzielnego przepisywania hasła do np. prze- larza. Zgodnie z naszymi wcześniejszymi
end;
glądarki WWW. założeniami, nazwę tego formularza (wła-
Oczywiście, nasza aplikacja będzie po- sność Name) ustalamy na MainWin. Duża
siadać tylko niezbędną funkcjonalność. Do litera T zostanie dołączona do nazwy W głównym oknie wykonujemy pod-
programu można jeszcze dodać wiele wa- typu samoczynnie przez środowisko. stawowe czynności w naszym progra-
żnych funkcji, takich jak np. szyfrowanie W tym momencie za pomocą opcji New mie. W następnym punkcie przedstawię
pliku, w którym program przechowuje ha- Form z menu File należy utworzyć dwa dokładnie, jak przedstawia się zarządza-
sła użytkownika. nowe formularze i przystąpić do tworze- nie hasłami. Teraz zajmiemy się innymi
Zanim przejdziemy do implementacji, nia interfejsu użytkownika. Siłą Lazarusa ważnymi elementami.
warto jeszcze zastanowić się na strukturą jest to, iż cały ten proces jest obsługiwany Pierwszy to obsługa przycisku OK,
naszej aplikacji. W Lazarusie, podobnie jak za pomocą myszy, więc możemy dowol- który, zgodnie z niepisaną zasadą, zawsze
w oryginale, podstawową kontrolką jest for- nie rozstawiać poszczególne komponenty. zamyka okno. Aby przejść do kodu obsłu-
mularz (reprezentowany przez typ TForm), Co więcej, środowisko pomaga podczas gi tego przycisku, wystarczy dwukrotnie
czyli okno. W naszym programie mamy projektowania interfejsu pokazując linie kliknąć na przycisk w formularzu i zosta-
trzy okna: główne okno aplikacji TMainWin wyrównania, gdy chcemy, aby kilka przy- niemy przeniesieni do okna edycji kodu.
(to okno zobaczymy po uruchomieniu pro- cisków zostało wyrównanych do prawej Procedura obsługująca kod zdarzenia
gramu), okno informacji o programie TAbout- oraz lewej strony. OnClick dla przycisku OK przedstawia się
Win oraz okno, w którym tworzone jest ha- Ponieważ proces tworzenie interfej- następująco:
sło, reprezentowane przez typ TGenerate su jest łatwy jest to w końcu główna
PasswordWin. Samodzielnie tworzone jest tyl- zaleta Lazarusa przejdziemy od razu procedure TMainForm.EndWorkBTNClick
ko główne okno, gdyż zarządzanie pozosta- do tworzenia kodu. Warto jeszcze zwrócić (Sender: Tobject);
łymi będzie realizowane przez nas własny uwagę, aby odpowiednio nazwać poszcze- begin
kod. Przy czym, jak się za chwilę okaże, gólne kontrolki, dzięki czemu kod zródło- Close;
będzie to zaledwie kilka linijek kodu. wy będzie czytelny dla osób postronnych. end;
www.lpmagazine.org 71
dla programistów
sza wybranego przez użytkownika). War-
tość -1 oznacza, że żaden wiersz nie został
wybrany. Następnie inicjalizujemy gene-
rator liczb pseudolosowych dobrze znaną
procedurą randomize. Ponieważ w naszej
aplikacji znajduje się mały gadżet, tzn.
zegar, to trzeba zadbać, aby w etykiecie już
na samym początku znalazł się aktualny
czas. Do pola edycyjnego należy również
wpisać pusty ciąg znaków. Ostatnim ele-
mentem, o którym w dalszej części będzie
jeszcze mowa, jest załadowanie aktualne-
go spisu haseł.
Opisane czynności są realizowane za
pomocą następujących linii kodu:
CategoryGrid.RowCount:=1;
sel_row:=-1;
randomize; ClockLBL.Text:
=TimeToStr(Time);
NewBoxNameEDT.Text:=''; LoadData;
Obsługa tabeli kategorii
Innym istotnym elementem jest dodanie
nowej kategorii do tabeli CategoryGrid.
Jest to realizowane przez obsługę przyci-
sku o nazwie AddCategoryBTN. Przedstawia
się to następująco:
if NewBoxNameEDT.Text<>'' then
begin
CategoryGrid.RowCount:=
CategoryGrid.RowCount+1;
CategoryGrid.Cells[0,CategoryGrid.
RowCount-1]:=NewBoxNameEDT.Text;
end
else
Application.MessageBox
('Please, enter a category
name.','Error',0);
Sprawdzamy, czy użytkownik istotnie
wpisał nazwę kategorii. W tym celu wy-
starczy sprawdzić zawartość pola, a do-
kładniej wartość własności Text, czy nie
zawiera przypadkiem pustego ciągu zna-
ków. Jeśli zawartość Text jest różna od pus-
tego ciągu, powiększamy ilość wierszy
w tabeli kategorii, zwiększając RowCount.
Następnie do ostatniego wiersza kolum-
ny z indeksem zero wpisujemy nazwę
Rysunek 1. Schemat przepływu zdarzeń w programie PasswordBox
nowej kategorii. Poszczególne komórki
Jest to tylko wywołanie metody Close, Z punktu widzenia przepływu infor- są dostępne przez własność Cells, która
zamykającej okno, a ponieważ zamyka- macji, pierwsze czynności, które zostaną jest niczym innym jak dwuwymiarową
my główne okno, to również cała aplikacja wykonane podczas uruchamiania progra- tablicą. Z tego powodu obsługa tej tabli-
zakończy swoje działanie. Podczas zamy- mu, znajdują się w obsłudze zdarzenia cy jest bardzo łatwa, np. usunięcie wska-
kania aplikacji zapisywana jest także lista OnFormCreate. Ustalamy w niej domyślną zanej kategorii za pomocą przycisku
z hasłami, ale jak przedstawia się ten pro- ilość wierszy, a zmiennej sel_row nadaje- DelCategoryBTN sprowadza się tylko do
ces, opiszę pózniej. my wartość -1 (zawiera ona numer wier- jednej linii kodu:
72 maj 2006
dla programistów
Lazarus
ukazuje kompletną funkcję, która umiesz-
cza w schowku hasło z aktualnie wska-
zanej kategorii. Kod jest bardzo prosty.
Wystarczy odczytać referencję do obiek-
tu Clipboard i do własności AsText wpisać
tekst, który chcemy umieścić w schowku.
Jeśli chcemy odczytać zawartość schowka
i oczekujemy tekstu, to wystarczy odczy-
tać wartość własności AsText.
Zapis oraz odczyt
listy kategorii
Aplikacja, którą tutaj opisuję, jest małą
wprawką, ale aby była w pełni użytecz-
na, musimy zapisywać zawartość tabeli
o nazwie CategoryGrid. W niej znajdują się
nazwy kategorii, do których są przypisane
hasła. Zapis haseł następuje samoczynnie
podczas zamykania aplikacji. Po wywo-
łaniu metody Close występuje zdarzenie
OnClose, w którym wywołujemy prywatną
metodę o nazwie SaveData. Listing 2 pre-
Rysunek 2. Pudełko z hasłami w Lazarusie
zentuje jej kod zródłowy.
Wykorzystujemy klasę TFileStream do
CategoryGrid.DeleteColRow sel_row, a nazwa kategorii przeniesiona do obsługi plików. Utworzenie obiektu jest ty-
(false, sel_row); pola edycyjnego. Obsługa przycisku o ety- powe dla Lazarusa (czy raczej dla Delphi)
kiecie Update Category ponownie przenie- i przedstawia się następująco:
Zmienna sel_row zawiera indeks wybra- sie tekst z pola do wybranego wcześniej
nego przez nas wiersza. Aby poznać nu- wiersza. W ten sposób mamy możliwość f:=TFileStream.Create('data.txt',
mer wiersza wybranego przez użytkowni- zmiany nazwy kategorii. fmCreate or fmOpenWrite);
ka, należy skorzystać ze zdarzenia OnSelect-
Cell. Przedstawia się ono następująco: Obsługa schowka Flagi fmCreate oraz fmOpenWrite zapew-
Ponieważ chcemy przesłać do schowka niają nam, że jeśli plik nie istnieje, to zo-
procedure TMainForm.CategoryGridSel tylko tekst, to wykorzystując API Lazaru- stanie utworzony, a istniejący plik nad-
ectCell(Sender: TObject; Col, Row: sa zadanie to staje się trywialne. Wystar- pisany. Sam proces zapisu danych w przy-
Integer; var CanSelect: Boolean); czy do aplikacji dołączyć moduł o nazwie padku ciągu znaków warto wykonywać
begin clipbrd, przy czym możemy go dołączyć tak, jak to pokazuje Listing 2. Gdy zapi-
sel_row:=Row; w dwóch miejscach, po słowie kluczowym sujemy kategorię, w pierwszej kolejno-
NewBoxNameEDT.Text:= inferface bądz implementation. Listing 1 ści wyznaczamy długość ciągu znaków
CategoryGrid.Cells[0,sel_row];
end;
Współrzędne aktualnie wybranej komór-
ki znajdują się w argumentach Col oraz
Row. Zdarzenie to, jak można się domy-
śleć po nazwie i postaci argumentów, nie
służy do wybierania wierszy, ale dowolnej
komórki. Jeśli w inspektorze obiektów we
własności Options dla obiektu tabeli usta-
limy wartość pola goRowSelect na True, to
w ten sposób zawsze będzie wybierany cały
wiersz, a nie poszczególne komórki tabeli.
Ostatnim istotnym elementem jest moż-
liwość zmiany nazwy kategorii za pomocą
przycisku o nazwie UpdateCategoryBTN.
Polega to na tym, że jeśli użytkownik klik-
nie na pewien wiersz, to tak jak to przed
chwilą zostało opisane, zostanie odczyta-
Rysunek 3. Działający program PasswordBox podczas generowania hasła
ny jego indeks i umieszczony w zmiennej
www.lpmagazine.org 73
dla programistów
i zapisujemy otrzymaną wartość do stru-
Listing 2. Zapis haseł do pliku
mienia:
len:=length(c); procedure TmainForm.SaveData;
f.Write(len, sizeof(len)); var
i, len : integer;
Teraz możemy zapisać ciąg znaków. W przy- c,p : string;
padku Pascala taka operacja zawsze była f : TfileStream;
nieco kłopotliwa. W Lazarusie (analogi- begin
cznie jak w oryginale), aby rezultat był f:=TFileStream.Create('data.txt', fmCreate or fmOpenWrite);
poprawny, należy dokonać konwersji ty- len:=CategoryGrid.RowCount-1;
pu string na wskaznik do typu PChar
(jest to typ odpowiadający ciągowi zna- f.Write(len, sizeof(len));
ków w języku C). Przedstawia się to nastę-
pująco: for i:=1 to CategoryGrid.RowCount-1 do
begin
f.Write(PChar(c)^, len); c:=CategoryGrid.Cells[0,i]; p:=CategoryGrid.Cells[1,i];
Blizniacza funkcja LoadData przedstawia się len:=length(c);
podobnie, jak funkcja z Listingu 2. Podczas f.Write(len, sizeof(len));
tworzenia strumienia podajemy flagę fmO- f.Write(PChar(c)^, len);
penRead, aby otworzyć plik tylko do odczy-
tu. Sam proces odczytywania wymaga uży- len:=length(p);
cia jednej dodatkowej funkcji. Po odczytaniu f.Write(len, sizeof(len));
długości danego ciągu znaków: f.Write(PChar(p)^, len);
end;
f.Read(len, sizeof(len)); f.Free;
end;
ustalamy długość zmiennej za pomocą fun-
kcji o nazwie SetLength i odczytujemy ze t:=TAboutWin.Create(self); przycisków został wybrany przez użyt-
strumienia odpowiednią ilość znaków: t.ShowModal; kownika, aby zamknąć okno.
t.Free; Naciśnięcie OK oznacza, że użytkow-
SetLength(c, len); nik chce, aby wygenerowane hasło zostało
f.Read(PChar(c)^, len); W pierwszej linii tworzymy okno. Jego umieszczone w tabeli, a naciśnięcie przy-
pokazanie na ekranie w trybie modalnym cisku Cancel oznacza, że nie chcemy tego
Wczytanie zawartości znaków jest wyko- (co oznacza, iż musimy zamknąć okno dia- zrobić.
nywane w zdarzeniu FormCreate, więc tuż logowe, aby uzyskać dostęp do okna, które W obsłudze dwóch wspomnianych przy-
przed wyświetleniem głównego okna na utworzyło oraz wywołało okno dialogowe), cisków musimy określić dokładnie, jaka
ekranie. realizujemy za pomocą funkcji ShowModal. wartość będzie zwracana przez metodę
Ostatecznie, każdy obiekt musi zostać usu- ShowModal. Wystarczy wpisać odpowiednią
Zarządzanie innymi oknami nięty i robimy to wywołując metodę Free. wartość do własności ModelResult, np.
Ponieważ założyliśmy, że tylko główne Drugie okno wymaga od nas troski w obsłudze przycisku Cancel umieszcza-
okno będzie tworzone samodzielnie przez o dwa istotne dla nas szczegóły. Pierwszy my wartość mrCancel (self.ModalResult:
system, to dodatkowe okna musimy utwo- polega na sprawdzeniu, czy użytkow- =mrCancel;), a przypadku przycisku OK mrOK
rzyć jawnie. Wbrew pozorom, jest to łatwy nik naszego programu wybrał jakikolwiek (self.ModalResult:=mrOK;).
proces, szczególnie w naszym przypadku, wiersz z tabeli kategorii, sprawdzając war- Wykrycie, czy użytkownik zamknął
ponieważ oba okna są oknami dialogowy- tość zmiennej sel_row. Gdy zmienna jest okno generowania hasła wybierając przy-
mi. Gdy jedno z naszych dwóch okien jest równa minus jeden, to wyświetlamy krótki cisk OK, sprowadza się tylko do sprawdze-
wyświetlone, to nie mamy dostępu do ele- komunikat: nia, czy wartość zwrócona przez ShowModal
mentów z głównego okna. jest równa mrOK:
Wyświetlenie okna informacyjnego jest if sel_row=-1 then
bardzo łatwe. Definiujemy nową zmienną: begin if a.ShowModal = mrOK then
Application.MessageBox('Please, CategoryGrid.Cells[1, sel_row]:
t : TAboutWin; select category.','Error',0); =a.PasswordEdit.Text;
end else // reszta programu
Oznacza to też, iż musimy dołączyć unit Generowanie hasła
UaboutWin, zawierający definicję typu Tabout- W sekcji else tworzenie okna odbywa się Ostatni element, który należy przedstawić,
Win. Ostatecznie, niezbędny kod składa się w identyczny sposób jak opisany wcześniej, to proces generowania losowego hasła. Sys-
z trzech linii: ale interesuje nas również, który z dwóch tem sam je zbuduje (z liter małych bądz du-
74 maj 2006
dla programistów
Lazarus
TRadioGroup. Numer opcji wybranej przez
Listing 3. Generowanie hasła
użytkownika jest zapisany we własności
procedure TGeneratePasswordWin.GeneratePassBTNClick(Sender: Tobject); o nazwie ItemIndex. Wartość trzy oznacza,
var iż mamy generować hasło złożone z liter
i, len : integer; małych bądz dużych oraz cyfr. W jednej ite-
begin racji generujemy tylko jeden znak, dlatego
len:=LengthPass.Value; dodatkowo za pomocą instrukcji wyboru
PasswordEdit.Text:=''; case oraz random dokonujemy jeszcze jedne-
for i:=1 to len do go losowego wyboru. Jeśli wyjdzie na to ,
begin iż mamy wygenerować dużą literę, to zrobi-
case PassContains.ItemIndex of my to w następujący sposób:
0 : begin { small letter } end;
1 : begin { big letter } end; PasswordEdit.Text := PasswordEdit.Tex
2 : begin { all letter } end; t+chr(ord('A')+random(26));
3 : begin
case random(3) of Za pomocą funkcji ord zamieniamy znak
S
0: PasswordEdit.Text := PasswordEdit. na kod ASCII, dodajemy do uzyska-
Text+chr(ord('a')+random(26)); nej liczby losową liczbę całkowitą i w ten
S
1: PasswordEdit.Text := PasswordEdit. sposób uzyskujemy kod ASCII dużej litery.
Text+chr(ord('A')+random(26)); Uzyskany kod musimy ponownie zamienić
S
2: PasswordEdit.Text := PasswordEdit. na typ znakowy i do tego służy funkcja chr.
Text+chr(ord ('0')+random(10)); Wylosowany znak dodajemy do pola Text.
end; Analogicznie postępujemy dla małych liter
end; oraz cyfr.
end;
end; Podsumowanie
end; Nasza aplikacja jest prosta, ale pozwala
stwierdzić, że Lazarus sprawdza się w two-
żych oraz z cyfr, w zależności od wyboru informacja, która jest potrzebna, znajduje rzeniu oprogramowania. Podczas jej projek-
użytkownika). Okno generowania hasła pre- się w komponencie o nazwie LengthPass, towania nie wystąpiły żadne kłopoty ze śro-
zentuje Rysunek 3. Mamy cztery opcje do a jest to długość hasła. Następnie za pomocą dowiskiem. IDE pracuje w sposób stabil-
wyboru. Każda z nich jest zrealizowana w po- pętli for generujemy odpowiednią ilość ny, choć mamy do czynienia z wersją Beta,
dobny sposób, więc opiszę tylko ostatnią. znaków. O tym, jaki znak będzie gene- bądz co bądz bardzo rozbudowanego narzę-
Listing 3 zawiera fragment obsługi rowany, decyduje komponent o nazwie dzia. Nie wszystkie elementy znane z Delphi
przycisku Generate Password . Pierwsza PassContains. Jest to komponent typu zostały przeniesione do Lazarusa, np. okno
debuggera z kodem maszynowym ciągle nie
jest zaimplementowane. Wielkość plików
wynikowych może budzić małą konsterna-
cję. Nasza aplikacja po kompilacji waży aż
8 MB. Po usunięciu informacji o symbolach
poleceniem strip, plik binarny zmniejszy się
do prawie 3 MB, ale to i tak jest dużo.
Z każdym wydaniem Lazarus jest jed-
nak coraz lepszy. Pojawiają się również
nowe komponenty. Zachęcam do jego wy-
próbowania, tym bardziej, iż oferuje on do-
stęp do baz danych, takich jak MySQL oraz
Firebird. W przyszłości będzie jedną z tych
aplikacji dla Linuksa, które mogą śmiało
konkurować z komercyjnym oprogramo-
waniem.
W Internecie:
" Strona projektu Lazarus:
http://www.lazarus.freepascal.org/
" Codzienne snapshoty środowiska
Lazarus:
Rysunek 4. Lazarus w akcji http://www.de.freepascal.org/lazarus/
www.lpmagazine.org 75
Wyszukiwarka
Podobne podstrony:
2006 05 Password Tricks Customizing the Password Popup WindowGWT Working with the Google Web Toolkit (2006 05 31)2006 05 R odp05 Praktyczne wskazówki do programu AccessŚwięty Pustelnik z Libanu (o ojcu Charbel) Miłujcie się 2006 052006 05 Antywzorce w zarządzaniu projektami informatycznymi [Inzynieria Oprogramowania]2006 05 R2007 05 Variadic templates w C 0x [Programowanie C C ]2006 05?sktop Disco2006 05 Krita–edytor grafiki bitmapowej [Grafika]2006 05 Simple Event Correlator (SEC) w monitorowaniu logów bezpieczeństwa2006 02 Qt ISO Maker–moja pierwsza aplikacja w Qt [Programowanie]więcej podobnych podstron