Lazarus - vývojové prostředí DELPHI zdarma

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ě.

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.

Zviditelnění formuláře v LAZARUS

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>.






Zmenšení spustitelného souboru v lazarus

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.

 

SQLite3 v LAZARUS

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.

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>

Vytvoření databáze:

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

Vytváření tabulek v SQLite3

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
);

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

Zdrojový kód v LAZARUS

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.

Chyba libsqlite3.so / sqlite3.dll při spuštění

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, 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
sqlite3dyn.SQLiteDefaultLibrary :='sqlite3.dll';
end;

 

Nakonec v jednom adresáři windows koncového uživatele by měly být:

  1. vas_program.exe
  2. sqlite3.dll
  3. sqlite3.def
  4. sqlite3databaze.db

MariaDB v LAZARUS

Je třeba doinstalovat balíček libmysqlclient-dev.
Do procedury FormCreate smazat řádky s SQLite3Connection1 a 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á.

MariaDB v Lazarus

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.0 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.

 

Vychytávky

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)

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;

Spuštění externího programu v lazarus

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.

kalkulačka

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.

Tisk textu v lazarusu

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;

Odkazy:

  1. http://www.alevel-computing.x10.mx/TutorialLazarusSQLite.php
  2. http://programujte.com/forum/vlakno/24656-lazarus-sqlite/
  3. http://lazarus-ccr.sourceforge.net/docs/ - popisy komponent
  4. Fórum lazarus - specializované fórum o programování v lazarus
  5. Freepascal Programmers Guide - programování v Freepascalu
  6. MariaDB - MariaDB domovská stránka
  7. Lazarus tutoriál SK - slovenské návody na lazarus
  8. Výuka pro studenty
  9. Přístup k datům
  10. Datové typy - integer, float, string... (lazarus tahák)

SSL pro weby od 11/2015 zdarma


MS WINDOWS 10 - sběr informací o uživateli


DEBIAN 9 Stretch - OS zdarma debian vyšel 17.6.2017

debian 9

debian 9 - stáhnout pro PC


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.

01.07. 2017 19:50:10
  • Redakční systém MRS
  • 10 nečastějších zranitelností WEBU
  • Esperantoesperanto - univerzální mezinárodní jazyk
  • SMS zdarma - posílání SMS zdarma
  • proč LINUX
  • základy LINUXU
  • Software na úřadech - jeho otevřené alternativy
  • Řekněte sbohem Microsoftu
  • Rychlost připojení - změřte si svoji rychlost
  • SEO servis
  • Jak psát web
  • Zákony - občanský, autorský, obchodní zákoník atd.
  • Infosoud - nalezení stání a průběhu jednání
  • ARES - registr ekonomických subjektů
  • Katastr nemovitostí
  • Broďan - brodské nezávislé zpravodajství
01.09. 2016 10:53:48
110280
Květná 1843, Uherský Brod  přihlásit poslední změna: 28.11. 2017 18:18:09