K prostředí LAZARUS je možno používat SQLite3 databázi. Má to tu výhodu, že všechno bude v jednom programu a žádný další SQL server se nemusí instalovat. Toto vývojové prostředi (DELPHI) je zcela zdarma a legálně. Také je možno připojit MySQL nebo nověji MariaDB databázi (nástupce mysql), databáze MariaDB samozřejmě musí běžet.
Hodnocená verze:
LAZARUS a MariaDB připojení na linuxu LUBUNTU 16.04
SQLite version 3.11.0
mariadb-client 10.0.31
lazarus 1.6.4
fpc-3.0.0
Kdysi vynikající vývojové prostředí pro pascal byl turbopascal od firmy Borland. Později vzniklo též velmi dobré vývojové prostředí pro WINDOWS a to DELPHI. Až do verze DELPHI 7 to bylo dobré vývojové prostředí, pod povrchem se skrýval object pascal, někdy se tomu říkalo visual pascal (vizuální pascal). Pak to koupila společnost Microsoft a tím to dopadlo tak, jak se všemi dobrými věcmi, které jmenovaná firma koupila.
Následně ale vzniklo vývojové prostředí LAZARUS, které je téměř úplně stejné jako bylo DELPHI v dobách největší slávy. Nejsou tam zbytečnosti (MS .NET ap.), je to zdarma a legálně. Navíc je to prostředí multiplatformní, běží pod windows i linuxem. Pod povrchem je object pascal (objektový pascal). Navíc si lze zvolit grafickou aplikaci (menu projekt, nový projekt, aplikace) nebo ve starém stylu aplikaci (free) pascal (menu projekt, nový projekt, jednoduchý program).
Zde budu popisovat instalaci a používání pod LUBUNTU 16.04, což je odlehčené prostředí UBUNTU i pro méně výkonná PC.
Instalace LAZARUSu
Lazarus
Instalace vývojového prostředí LAZARUS se provede z balíčkovacího systému (např. synaptic) výběrem balíčku lazarus. Povolí se také všechny závislosti o které si to řekne. Pak se nainstaluje celé vývojové prostředí LAZARUS.
Po spuštění LAZARUSu se objeví formulář form1. Na tento formulář můžeme natahovat myší jednotlivé vizuální komponenty, například tlačítko (Tbutton). Na tlačítko klikneme, v inspektoru objektů nastavíme vlastnost caption na "tlačítko" a pak v menu soubor vše uložíme do samostatného adresáře např. pokus1. Nyní v menu dáme spustit->sestavit. Vytvoří se spustitelný program.
Po spuštění se může objevit chyba "!fppkg", stačí kliknout na "Restore fppkg configuration".
zviditelnění formuláře LAZARUS
vybrat formulář
Pozor, někdy se při otevření nového projektu v lazarusu nic neobjeví, tedy formulář ani zdrojový kód není vidět. Řešení je snadné, ve vodorovném menu nahoře zadáme projekt->formuláře->form1 <OK>.
Po přeložení je spustitelný soubor o velikosti 22 MB a více. Je to způsobeno ladícími informacemi, které už při finální verzi nejsou potřeba. Změnit se to dá pomocí následujícího postupu:
strip -s můjsoubor
upx --best mujsoubor (je třeba balíček upx nebo upx-ucl)
Příkazem strip dojde ke zmenšení kódu z asi 22 MB na 4,6 MB. Příkazem upx dojde ke kompresi spustitelného souboru na asi 1,45 MB, který se při spuštění rozbalí v paměti.
Ještě lepší a účinnější způsob je nastavit odstranění ladících informací v nastavení projektu. S pomocí upx --best soubor lze pak tento spustitelný soubor zmenšit až na 721 000 bajtů.
spojování
ladění
Návod na zmenšení spustitelného souboru (ve windows exe, v linuxu elf) v LAZARUS - přejdeme do menu:
1. projekt, volby projektu, volby překladače, překlad a spojování,
2. projekt, volby projektu, volby překladače, ladění,
Nyní již známé (strip) a upx:
strip -s můjsoubor - nyní již není potřeba, nic nezmenší
upx --best mujsoubor (je třeba balíček upx nebo upx-ucl)
Můj testovací spustitelný soubor byl tímto postupem zmenšen
z 24 599 400 bajtů na -> 2 772 720 (vypnutí těch ladících informací -> 941 772 bajtů! (upx --best soubor).
Došlo ke zmenšení spustitelného souboru zkompilovaného v LAZARUS z 24,5 MB na 0,94 MB, tj. 26x nebo na 3.8% původní velikosti!
LAZARUS s SQLite3
Pro používání databáze SQLite (SQLite3) je potřeba nainstalovat balíček sqlite3 a všechny závislosti o které si řekne. Pak balíček sqlitebrowser pro správu sqlite3 databází a tabulek.
Pokud při spouštění lazarus programů je při přístupu k tabulkám hlášena chyba "libsqlite3.so", tak je potřeba ještě doinstalovat balíček libsqlite3-dev (+libsqlite3 se doinstaluje automaticky) na vývojovém stroji, na stroji koncového uživatele stačí doinstalovat pouze balíček libsqlite3. dynamicky načíst './libsqlite3.so', viz zdr. kód níže. Soubor libsqlite3.so musí být ve stejném adresáři jako spustitelný program. Je to lepší řešení, protože balíčky libsqlite3.so se v různých distribucích různě jmenují (napříklah v debian 8 je to libsql3.so.0), pak aplikace neskončí chybou, viz oddíl Chyba libsqlite3.so / sqlite3.dll při spuštění.
Nainstaluje se také konzola, její spuštění je terminálovým příkazem (z příkazového řádku) sqlite3:
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
sqlite3 novadatabaze.db
Otevření databáze .open studenti.db, viz .help.
sqlite> .databases
seq name file
--- --------------- ----------------------------------------------------------
0 main /home/uzivatel/aplikace/lazarus/sql3-dalsi2/adresy.db
sqlite> .tables
Class Student StudentSubject Subject lidi
sqlite> select * from students;
Error: no such table: students
sqlite> select * from student;
StudentID|First|Second|Form
1|Petr|Bilavec|13Sc
2|William|Shakespeare|13Pl
3|Elizabeta|Krkonová|13Pl
4|René|Dobík|13Sp
Je třeba se v konzoli přihlásit (sqlite3), připojit se k databázi (.open soubor). Zde je namístě malá poznámka: SQLite obsahuje emulátor SQL standardu, tedy zadávání příkazů stejně jako v MySQL nebo MariaDB bude fungovat. Například i SQL dotaz:
select * from tridy natural join studenti where TridaID=2; projde bez problémů. Viz dokumentace sqlite3.
CREATE TABLE studenti
(
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
tridaID integer KEY,
jmeno VARCHAR(15),
prijmeni VARCHAR(15),
prum_znamky float(3,2)
);
INSERT INTO Studenti(tridaID,jmeno,prijmeni,prum_znamky) VALUES (1,'David','Beker',2.3);
INSERT INTO Studenti(tridaID,jmeno,prijmeni,prum_znamky) VALUES (1,'Tomáš','Novák',2.1);
INSERT INTO Studenti(tridaID,jmeno,prijmeni,prum_znamky) VALUES (2,'Jiří','Maník',1.3);
INSERT INTO Studenti(tridaID,jmeno,prijmeni,prum_znamky) VALUES (2,'Petr','Opatrný',2.2);
CREATE TABLE tridy
(
TridaID INTEGER PRIMARY KEY NOT NULL,
nazev VARCHAR(15), tridni VARCHAR(15),
predseda VARCHAR(15)
);
INSERT INTO tridy(TridaID,nazev,tridni,predseda) VALUES (1,'1.A','Struhárová','Malaník');
INSERT INTO tridy(TridaID,nazev,tridni,predseda) VALUES (2,'1.B','Chtobotová','Novák');
Pak máme nějaká data v tabulkách a lze spustit SQL příkazy. Ještě zapneme zobrazování hlaviček (headers):
sqlite> .headers on
sqlite> select * from tridy;
TridaID|nazev|tridni|predseda
1|1.A|Struhárová|Malaník
2|1.B|Chtobotová|Novák
sqlite> select * from studenti;
StudentID|tridaID|jmeno|prijmeni|prum_znamky
1|1|David|Beker|2.3
2|1|Tomáš|Novák|2.1
3|2|Jiří|Maník|1.3
4|2|Petr|Opatrný|2.2
sqlite> select * from tridy natural join studenti where TridaID=2;TridaID|nazev|tridni|predseda|StudentID|jmeno|prijmeni|prum_znamky
2|1.B|Chtobotová|Novák|3|Jiří|Maník|1.3
2|1.B|Chtobotová|Novák|4|Petr|Opatrný|2.2
DB Browser
Nebo můžete zkusit grafický DB Browser pro SQLite3.
DB browser for sqlite3 umí vše potřebné pro správu databáze v SQLite3. Vytvoření databáze, tabulky, indexy...
unit studenti_u;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, db, sqlite3conn, sqldb, FileUtil, Forms, Controls,
Graphics, Dialogs, ComCtrls, DBGrids, Menus;
type
{ TForm1 }
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
SQLite3Connection1: TSQLite3Connection;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
StatusBar1: TStatusBar;
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
//naledujici kroky lze naklikat na formu, zde je to jen pro ukazku
//nastavim jmeno databaze (vcetne cesty, ja mam db u exe, tak staci jen nazev souboru)
SQLite3Connection1.DatabaseName:= 'studenti.db';
//propojim komponnetu transakce s komponentou pripojeni
SQLite3Connection1.Transaction := SQLTransaction1;
//propojim komponenty dotazu (query) s pripojenim
SQLQuery1.DataBase := SQLite3Connection1;
//propojim komponentu datasource s dotazem
DataSource1.dataset := SQLQuery1;
//propojim DBgrid s datasource
DBGrid1.DataSource := DataSource1;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
try
if SQLQuery1.Active then
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Select * from studenti');
SQLQuery1.Open;
except
On E :Exception do begin
MessageDlg('Chyba', E.Message, mtConfirmation,[mbYes],0);
end;
end;memo1.Text:=Get(edit1.Text);
end;
end.
procedure TForm1.FormActivate(Sender: TObject);
var
cislop,nazevp : string;
begin
try
if SQLQuery1.Active then
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('select CISLO,polozky.NAZEV as nazevp,OPER,tepo.nazev as tnazev,ORI,STR,PRAC,D,TR,TB,TA FROM polozky JOIN tepo USING(CISLO) WHERE CISLO="0300-0360-01"');
SQLQuery1.Open;
// SELECT id AS 'ID', UserName AS 'User', InstEmail AS 'e-mail' FROM fpdev ORDER BY id;
// INSERT INTO fpdev(id, UserName, InstEmail) VALUES(:ID,:User,:e-mail);
cislop:=SQLQuery1.FieldByName('CISLO').AsString;
nazevp:=SQLQuery1.FieldByName('nazevp').AsString;
panel1.Caption:=cislop+':'+nazevp;
except
On E :Exception do begin
MessageDlg('Chyba', E.Message, mtConfirmation,[mbYes],0);
end;
end;
end;
Can not load SQLite client
library "libsqlite3.so"
Tato chyba při spuštění programu znamená, že není dostupná knihovna libsqlite3.so (v linuxu) nebo sqlite3.dll (ve windows) a načtená do spustitelného souboru. V linuxu je nejjednodušší pro koncového uživatele nainstalovat pomocí balíčkovacího systému balíček sqlite3 dynamicky načíst knihovnu sqlite3 './libsqlite3.so', ve windows do zdrojového kódu zadat v Form1.create: loadlibrary:='sqlite3.dll'; (zavržené), sqlite3dyn.SQLiteDefaultLibrary :='sqlite3.dll';. Knihovnu sqlite3.dll lze stáhnout z http://sqlite.org/download.html (Download "sqlite-dll-win32-x86-3071000"). Pak rozbalit "sqlite3.def" a "sqlite3.dll" do adresáře s vaší .exe aplikací, programem. Ještě je třeba na začátek do Uses... doplnit sqlite3dyn...
unit adresar_u;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, sqldb, db, sqlite3conn, sqlite3dyn, FileUtil, Forms, Controls,
Graphics, Dialogs, ComCtrls, DbCtrls, DBGrids, StdCtrls;
procedure TForm1.FormCreate(Sender: TObject);
begin
try
{$IFDEF LINUX}
sqlite3dyn.SQLiteDefaultLibrary :='./libsqlite3.so';
{$ENDIF}
{$IFDEF WINDOWS}
sqlite3dyn.SQLiteDefaultLibrary :='sqlite3.dll';
{$ENDIF}
except
on E:Exception do begin
MessageDlg('Chyba', E.Message, mtConfirmation,[mbYes],0);
exit;
end;
end;
end;
Lazarus memo problém v komponentě dbgrid s sqlite3
V LAZARUSu v dbgrid tabulce se všechny řetězce nezobrazí svojí hodnotou ale vypíše se (memo). To většinou asi nechceme, chceme zobrazit hodnotu z tabulky sqlite3 a typu pole text.
Řešení je velmi snadné, stačí v inspektoru objektů nastavit vlastnost u dbgrid1.dgdisplaymemo.true, defaultně je nastaveno false. Pokud vlastnost dbgrid.displaymemo nemáte dostupnou, je potřeba přejít na novější verzi lazarusu.
Ale komponenta DBEdit displaymemo vlastnost nemá, takže v zobrazení v mřížce (tabulce) DBgrid to bude správně, ale v DBEdit bude zase zobrazeno (MEMO). Jako efektní řešení je vytvořit tabulku s textovými poli jako varchar(n), viz výše i níže:
CREATE TABLE evidoso2 ("vykres" varchar(17), "popis" varchar(40));
CREATE TABLE studenti
(
"StudentID" INTEGER PRIMARY KEY AUTOINCREMENT,
"tridaID" integer KEY,
"jmeno" VARCHAR(15),
"prijmeni" VARCHAR(15),
"prum_znamky" float(3,2)
);
Čísla float jsou nepřesná a v lazarusu se zobrazují špatně. Nejlepší řešení je pravý klik, editovat sloupce, přidat. Pak u sloupce s číselnou hodnotou float nastavit displayformat #.##
Pak už se hodnoty float zobrazují správně. Takže na bad display float in lazarus and SQLite3 - displayformat #.##
lazarus a číselná hodnota float - řešení displayformat #.##
lazarus, jak nastavit float v SQLite3
lazarus, špatné zobrazení float čísel s SQLite3
Nakonec v jednom adresáři windows koncového uživatele by měly být:
V adresáři linux by měly být tyto soubory:
Možná se zeptáte, proč nepoužívat nadále osvědčenou mysql? Protože mysql nyní vlastní velká obchodní (komerční) firma, která si diktuje podmínky používání mysql. A tak jste zcela závislí na libovůli komerční firmy a jejích vrtoších.
Proč tedy MariaDB? Protože je to téměř stejné, vývojáři jsou od původní mysql, je to zadarmo, nezávislé na komerční firmě, větší distribuce už nemají mysql (DEBIAN 9 a vyšší) ale MariaDB. Pozor, to není okrajová záležitost, na debianu jede spousta výkonných webových serverů. A v neposlední řadě taky známý nejen vyhledávač GOOGLE přešel pod MariaDB a funguje bezvadně. Taky případným našim zákazníkům je třeba dát záruku, že koupený software s databází bude v budoucnosti fungovat.
Takže je třeba doinstalovat balíček libmysqlclient-dev.
Do procedury FormCreate doplnit následující:
MySQL56Connection1.DatabaseName := 'mojedatabase';
MySQL56Connection1.HostName := 'localhost';
MySQL56Connection1.UserName := 'mojedatabase';
MySQL56Connection1.Password := 'mojeheslo';
Ve verzi LAZARUS 1.6.4 a MariaDB 10.0.31 na Lubuntu 16.04 se nejde snadno připojit k MariaDB datbázi. U komponenty TMySQL5.6connection to vyhazuje chybu, že je sice očekávaný client 5.6 ale skutečný je 5.7. Komponenta TMySQL5.7Connection v záložce SQLdb není zobrazená.
Lazarus MySQL 56 Connection cannot work with the installed MySQL client version: Expected (5.6), got (5.7.19)
Řešení je snadné, stačí do uses přidat mysql57conn a za běhu vytvořit SQLConnection1. Pak ještě nastavit znakovou sadu UTF-8 SQLConnection1.CharSet:='utf8':
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, db, sqldb, mysql57conn, FileUtil, Forms,
Controls, Graphics, Dialogs, DBGrids;
type
{ TForm1 }
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
SQLConnection1: TMySQL57Connection;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
//V lazarus 1.6.4 není komponenta MySQL57 v záložce SQLdb zobrazená
SQLConnection1 := TMySQL57Connection.Create(self);
SQLConnection1.CharSet:='utf8';
SQLConnection1.DatabaseName := 'database';
SQLConnection1.HostName := 'localhost';
SQLConnection1.UserName := 'uzivatel';
SQLConnection1.Password := 'moje-heslo';
//propojim komponnetu transakce s komponentou pripojeni
SQLConnection1.Transaction := SQLTransaction1;
//propojim komponenty dotazu (query) s pripojenim
SQLQuery1.DataBase := SQLConnection1;
//propojim komponentu datasource s dotazem
DataSource1.dataset := SQLQuery1;
//propojim DBgrid s datasource
DBGrid1.DataSource := DataSource1;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
try
if SQLQuery1.Active then
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Select * from skupiny');
SQLQuery1.Open;
except
On E :Exception do begin
MessageDlg('Chyba', E.Message, mtError,[mbYes],0);
end;
//application.Terminate;
end;
end;
end.
openurl('http://zmsoft.cz/'); - otevře ve webovém prohlížeči zadanou stránku (jednotka lclintf )
openDocument('ctimne.txt'); - otevře dokument v systému nastaveném editoru/prohlížeči (jednotka lclintf )
memo1.Text:=Get('http://zmsoft.cz/'); - načte obsah uvedené URL (jednotka LCLIntf, fphttpclient), pro https (memo1.Text:=Get('https://zmsoft.cz/');) se musí na linuxu doinstalovat balíček libssl-dev, na Windows se musí ke spustitelnému .exe přidat libeay32.dll a ssleay32.dll z https://indy.fulgan.com/SSL/
XML čtečka
xml soubor navod.xml
<?xml version="1.0"?>
<request>
<request_type>PUT_FILE</request_type>
<username>123</username>
<password>abc</password>
</request>
implementation
uses laz2_XMLRead, laz2_DOM;
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
PassNode: TDOMNode;
Doc: TXMLDocument;
begin
memo1.Text:='';
try
// cte XML soubor z disku
ReadXMLFile(Doc, 'navod.xml');
synedit1.Text:= Doc.XMLVersion;
PassNode := Doc.DocumentElement.FindNode('username');
memo1.Lines.Add(PassNode.FirstChild.NodeValue);
PassNode := Doc.DocumentElement.FindNode('password');
memo1.Lines.Add(PassNode.FirstChild.NodeValue);
finally
Doc.Free;
end;
end;
Dříve v DELPHI to bývalo Shellexecute(). Zapomeňte. Nyní je nejlepší volbou v (unit) jednotce procces TProcess.execute(). Je to multiplatformní, takže se nemusí předělávat pro WINDOWS <--> LINUX.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Process;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
try
AProcess.Executable:= edit1.Text; // galculator (kalkulačka v lubuntu)
// AProcess.Parameters.Add('-h');
// AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
except
On E :Exception do begin
MessageDlg('Chyba', E.Message, mtError,[mbYes],0);
end;
end;
AProcess.Free;
end;
end.
Pro tisk textu je potřeba v lazarusu jednotka (unit) printers. V ukázce je tisk z komponenty ListBox. Ale stejně to funguje i z MEMO.
procedure TForm1.BitBtn3Click(Sender: TObject);
var
pocet,i, xpos, ypos, LineHeight: integer;
s : string;
begin
// tisk z komponenty ListBox1 na tiskárnu
xpos:=100; // levý okraj
pocet:=listbox1.items.Count;
if pocet > 0 then begin
with Printer do begin
BeginDoc;
Canvas.Font.Name := 'Courier New';
Canvas.Font.Size := 10;
Canvas.Font.Color := clBlack;
LineHeight := Round(1.2 * Abs(Canvas.TextHeight('I'))); // řádkování
ypos:= 2 * LineHeight; // horní okraj
for i:=0 to pocet-1 do begin
s:=listbox1.Items[i];
Canvas.TextOut(xpos,ypos,s);
inc(ypos,LineHeight);
end;
EndDoc;
end;
messagedlg('Tisknu, čekej...',mtinformation,[mbok],0);
end else begin
messagedlg('Nejsou žádná data! Počet řádků: '+inttostr(pocet),mterror,[mbok],0);
end;
end;
Pro vyfocení, sejmutí nebo chcete-li printscreen v lazarus je zde příklad (nápověda).
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
LCLIntf, LCLType, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
MyBitmap: TBitmap;
ScreenDC: HDC;
WrkJpg: TJpegImage;
ScreenName: string;
begin
ScreenName:='blekota.jpg';
Application.Minimize;
Application.ProcessMessages;
sleep(32);
MyBitmap := TBitmap.Create;
ScreenDC := GetDC(0);
MyBitmap.LoadFromDevice(ScreenDC);
Application.Restore;
Application.BringToFront;
WrkJpg := TJpegImage.Create;
try
WrkJpg.CompressionQuality := 90;
WrkJpg.Assign(MyBitmap);
WrkJpg.SaveToFile(ScreenName);
finally
FreeAndNil(WrkJpg);
end;
ReleaseDC(0, ScreenDC);
FreeAndNil(MyBitmap);
// nacti obrázek
image1.Picture.LoadFromFile(ScreenName);
end;
end.
číslo sestavení
ikona k binárce
Pokud budete vytvářet profesionání program, určitě doporučuji kromě výše popsaného zmenšení kódu také zapnout automatické číslování sestavení, © Ferda 2019, nahrát k binárnímu kódu ikonu, viz sejmuté obrazovky (číslo sestavení, ikna k binárce).
Nastaveje se to v menu, projekt, volby projektu, informace o verzi, zahrnout informaci o verzi do spustitelného souboru.
Při vytváření neustále stejného kódu je dobré tento kód dát do vlastní jednotky - unit v Lazarusu, kterou pak můžeme volat z různých aplikací.
Jednoduchý příklad vlastní jednotky (unitu) v objekt pascalu (lazarusu):
jednotka bude mít název „zjistidatum.pas“.
unit zjistidatum;
{$mode ObjFPC}{$H+}
interface
function zjisti_datum : string;
procedure chyba(hlaska:string);
implementation
uses
Classes, SysUtils, Dialogs;
function zjisti_datum : string;
begin
zjisti_datum := FormatDateTime('DD.MM.YYYY hh:nn:ss',now);
end;
procedure chyba(hlaska:string);
begin
messagedlg(hlaska,mtError,[mbok],0);
end;
end.
Do hlavní jednotky (unit1) programu se musí dát za imlementation use našejednotka; pak se to bude volat edit1.Text:= zjisti_datum; a chyba('Něco nefunguje nebo se rozbilo!'); viz ukázka:
...
implementation
{$R *.lfm}
{ TForm1 }
uses
zjistidatum;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:= zjisti_datum;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
chyba('Něco nefunguje nebo se rozbilo!');
end;
...
Dynamické knihovny (Dynamic-Link Library) jsou ve WINDOWS označovány jako DLL, v LINUXU jako SO soubory. Zde si ukážeme vytvoření dynamické knihovny ve vývojovém prostředí LAZARUS.
Jak vytvořit DLL (SO) v LAZARUS? Je to velmi snadné:
Vygeneruje se kostra knihovny:
library libraryvzor;
{$mode objfpc}{$H+}
uses
Classes;
begin
end.
Kostru dynamické knihovny doplníme o funkce a klíčové slovo export:
library libraryvzor;
{$mode objfpc}{$H+}
uses
Classes;
function obsahctverce(a:integer):integer; // výpočet obsahu čtverce
begin
obsahctverce:= a*a;
end;
function obsahobdelnika(a,b:integer):integer; // výpočet obsahu obdélníka
begin
obsahobdelnika:= a*b;
end;
exports
obsahctverce, // vtupní parametry 1 typu integer, výstupní 1 typu integer
obsahobdelnika;// vtupní parametry 2 typu integer, výstupní 1 typu integer
begin
end.
Nyní zadáme v menu vývojového prostředí LAZARUS spustit->sestavit <SHIFT+F9>
Knihovna se sestaví s prefixem lib, takže liblibrary.so v linuxu nebo library.dll ve windows.
Nyní si v novém adresáři vytvoříme projekt, který bude využívat naši dynamickou knihovnu:
unit startlib_u;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
Dynlibs;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
GroupBox1: TGroupBox;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
const
{$IFDEF WINDOWS}
knihovna = 'libraryvzor.dll';
{$ELSE}
knihovna = 'liblibraryvzor.so';
{$ENDIF}
var
MyHandle: TLibHandle;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
FreeLibrary(MyHandle);
end;
procedure TForm1.Button1Click(Sender: TObject);
type
tctverec = function (a:integer): integer; stdcall; // čtverec
var
ctverec: tctverec;
begin
ctverec := tctverec(GetProcedureAddress(MyHandle,'obsahctverce'));
if Assigned(ctverec) then begin
memo1.Text:='Obsah čtverce: ' + inttostr(ctverec(3));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
type
tobdelnik = function (a,b:integer): integer; stdcall; // obdélník
var
obdelnik: tobdelnik;
begin
obdelnik := tobdelnik(GetProcedureAddress(MyHandle,'obsahobdelnika'));
if Assigned(obdelnik) then begin
memo1.Text:='Obsah obdélníka: ' + inttostr(obdelnik(5,7));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{$IFDEF WINDOWS}
MyHandle := SafeLoadLibrary(knihovna);
{$ELSE}
MyHandle := SafeLoadLibrary('./'+knihovna);
{$ENDIF}
if MyHandle=0 then begin
MessageDlg('"'+ExtractFileName(paramstr(0))+'"! ', 'Nepodařilo se načíst knihovnu "'+knihovna+'"! Program ukončit?', mtError,[mbOK],0);
application.Terminate;
end;
end;
end.
Odkazy:
LAZARUS 2.2 - pokračování
Komentáře
Kdokoliv může přidávat komentáře ke článkům bez registrace. Zadá si libovolnou přezdívku a napíše komentář.
SSL pro weby od 11/2015 zdarma
MS WINDOWS 10, 11 - sběr informací o uživateli
DEBIAN 12 (bookworm) - OS zdarma debian vyšel 10.6.2023
debian - stáhnout nejnovější DEBIAN pro PC
debian edu - debian pro školy a školní prostředí, stažení DEBedu (torrent)
Zranitelnost „ROM-0“ routerů
Předali data tajným službám
Americké bezpečnostní agentuře (NSA) předali data Microsoft, Yahoo, Google, Facebook...
Itálie preferuje open source
Italský parlament schválil zákon, který nařizuje státním institucím pořizovat otevřený software před komerčním. To znamená LINUX místo MS-WINDOWS, LIBRE OFFICE místo MS OFFICE atd.