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

chyba po spuštění IDE Lazarus

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, tj. 26x nebo na 3.8% původní velikosti!

 

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

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

 

 

 

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.

Přímý přístup k SQLite3 hodnotám v lazarusu

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;

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


Memo problém v dbgrid komponentě

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


Problém zobrazení float čísel

Čí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:

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

V adresáři linux by měly být tyto soubory:

  1. spustitelny_zkompilovany_program (elf)
  2. libsqlite3.so (knihovna)
  3. sqlite3databaze.db

MariaDB v LAZARUS

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

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

 

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

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;

Sejmutí obrazovky, printscreen v lazarusu

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.

Cesta k profesionalitě

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

 

 

Vlastní jednotka - unit

vlastní unitPř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;
...

Návod na vytvoření a použití dynamické knihovny DLL, SO v LAZARUSu

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é:

  1. vytvořit nový projekt typu knihovna
  2. Uložit jako např. libraryvzor.lpi

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:

  1. V menu, nový projekt typu aplikace se vytvoří nový projekt
  2. Uložíme ho jako startlib.lpi a startlib_u.pas
  3. Na formulář dáme komponenty button1 = ctverec, buton2 = obdélník, groupbox1 = kontejner, memo1 = výsledky.
  4. Doplníme do Uses ...Dynlibs
  5. Doplníme:
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  6. Sestavíme <SHIFT+F9>
  7. Spustíme sestavený binární kód v linuxu elf ve windows exe soubor
  8. Zahlásí to chybu neexistující knihovny
  9. Okopírujeme předtím vytvořenou dynamickou knihovnu DLL nebo SO do aktuálního adresáře a opět spustíme program. Nyní již by se měl spustit bez problémů a hlavně by měl fungovat.

DLL, SO knihovna

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:

  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)

LAZARUS 2.2 - pokračování


Komentáře

3. Přezdívka: Radek J, email: radekjindra@tiscali.cz, 20.12.2021 14:54:41
Díky
2. Přezdívka: zden, email: , 12.11.2021 14:30:23
Proti zamrznutí v cyklech stačí do cyklu vložit po každém např. 100. opakování:
application.ProcessMessages;
1. Přezdívka: Radek J, email: radekjindra@tiscali.cz, 14.08.2021 18:33:15
Super :-) Děkuji za tento článek. Využil jsem zmenšení výsledného spustitelného souboru. Ještě hledám něco aby výpočty ve smyčce pracovali trochu rychleji a po dobu výpočtu mi nezamrzl program.

Kdokoliv může přidávat komentáře ke článkům bez registrace. Zadá si libovolnou přezdívku a napíše komentář.

Jak používat messenger Signál


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

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.

19.03. 2024 10:36:16
  • Redakční systém MRS
  • 10 nečastějších zranitelností WEBU
  • Esperantoesperanto - univerzální mezinárodní jazyk
  • Kryptografie okolo nás - kniha popisuje využití kryptografie v běžném životě
  • 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í
  • Soudní rozhodnutí - nalezení rozsudků
  • ARES - registr ekonomických subjektů
  • Katastr nemovitostí
  • Broďan - brodské nezávislé zpravodajství

vydělávejte
na burze kryptoměn

23.03. 2024 15:47:51
Návštěvy
Celkem: 291945
Týden: 735
Dnes: 58
  přihlásit poslední změna: 31.12. 2023 09:42:30