Wstęp do programowania
Wykład
11 – biblioteka LCL
Aplikacja :STOPER
LCL
– Lazarus component Library
LCL –jest biblioteką wizualnych komponentów
stworzona w języku
Object Pascal
na potrzeby
środowiska Lazarus
Biblioteka LCL należy do jednych z bardziej przejrzystych
i dobrze zaprojektowanych bibliotek wspomagających
programowanie w środowisku Lazarus, zwłaszcza
tworzenie interfejsu użytkownika.
Podstawą biblioteki LCL jest klasa bazowa TKlass.
VCL
– visula component Library
VCL –jest biblioteką wizualnych komponentów
stworzona w języku
przez firmę Borland
na potrzeby środowiska Delphi, potem zaadaptowana
też do środowiska
.
Biblioteka VCL należy do jednych z bardziej przejrzystych
i dobrze zaprojektowanych bibliotek wspomagających
programowanie w środowisku
, zwłaszcza
tworzenie interfejsu użytkownika.
Obecnie biblioteka VCL integruje w sobie też możliwość
korzystania z technologii
Podstawą biblioteki VCL jest klasa bazowa TObject. Z
niej dziedziczą wszystkie pozostałe
.
Co to jest LCL
VCL to skrót od isual Component Library (Biblioteka Wizualnych
Komponentów). Jest jednym z najważniejszych elementów
Delphi. To właśnie niej zawdzięczamy łatwość i szybkość
projektowania aplikacji.
Biblioteka VCL składa się z gotowych napisanych wcześniej
komponentów które podczas kompilacji są dołączane do
wykonywalnego pliku naszego programu. Po skompilowaniu
program nie wymaga żadnych dodatkowych plików. Może być
uruchamiany na dowolnym komputerze bez względu na rodzaj
zastosowanych komponentów
Standardowe komponenty VCL nadają się do większości
zastosowań, gdyby śmy jednak potrzebowali jakiś specjalnych
funkcji możemy doinstalować dodatkowe komponenty (w sieci
jest ich bardzo wiele) lub napisać własny.
Metody, właściwości, zdarzenia
Komponent jest obiektem przeznaczonym do
wykonywania określonych funkcji.
Różne komponenty posiadają różne funkcje i
przeznaczenie.
Zbiór komponentów to zbiór elementów, z których
poprzez odpowiednich ich dobór można w krótkim
czasie zbudować aplikację.
Komponenty posiadają określone
metody, właściwości oraz zdarzenia.
Te pojęcia określają sposób
komunikowania się komponentu z
otoczeniem.
Button (Przycisk)
(Umieśćmy teraz na formie komponent Button z
palety Standart. Pojawi się on na formie w postaci
prostokątnego przycisku z napisem Button1.
Zaznacz go pojedyńczym kliknięciem. W okienku
Object Inspector pojawią się jego właściwości
(Properties) a na drugiej karcie zdarzenia (Events).
Okno
Object
Inspector
(metody,
właściwości,
zdarzenia
)
Okno Object Inspector
(metody, właściwości, zdarzenia
)
W oknie „Object Inspector” widoczne są właściwości
komponentu Button1. Właściwości pozwalają na zmianę
położenia, rozmiaru, koloru, nazwy i wielu innych
parametrów.
Możemy je zmieniać bezpośrednio z poziomu Object Inspector-a w
czasie projektowania aplikacji lub programowo za pomocą
odpowiednich poleceń.
Przykładowe polecenie zmieniające właściwość
caption
komponentu
Button1:
Button1.caption:='Nowy tekst nagłówka';
Skutek zmiany jakiejś właściwości jest natychmiastowy. W pewnych
przypadkach niektóre właściwości są tylko do odczytu (read only),
znaczy to że nie możemy danej właściwości zmienić. Możemy
jednak ją odczytywać.
Pełną listę właściwości znajdziemy w pomocy. Po zaznaczeniu
komponentu i naciśnięciu klawisza F1 wyświetli się okienko z
opisem dostępnych metod, właściwości i zdarzeń.
•
Na drugiej karcie Object Inspectora znajdują się
zdarzenia (
Events
).
Każdy komponent posiada swój zbiór zdarzeń które
możemy obsłużyć.
Nazwa każdego zdarzenia składa się z przedrostka
On
i
tekstu informującego czego dotyczy dane zdarzenie.
Zdarzenia mają za zadanie sprawdzać czy nie wystąpiła
określona czynność i w przypadku jej wystąpienia
wywołać odpowiadającą jej procedurę.
Klikając dwukrotnie na pole obok nazwy wybranego
zdarzenia przechodzimy do edycji kodu procedury jego
obsługi.
Najczęściej używanym zdarzeniem jest zdarzenie
OnClick
reagujące na klikniecie na danym komponencie.
Inny dostęp do zdarzenia uzyskuje się po dwukrotnym
kliknięciu na komponent. Taki wariant również jest
poprawny.
Oprócz właściwości i zdarzeń komponenty posiadają
również
Metody
.
Nie są one widoczne w Object Inspecto'rze.
Metody są to funkcje i procedury, które wykonuję na
komponencie określone operacje.
Przykładowo metodę powodującą że przycisk staje
się niewidoczny wywołujemy następującym
poleceniem:
Button1.hide;
Najważniejsze właściwości klasy TControl umieszczone
w oknie Inspektora Obiektów
Właściwość
Opis
Align
Określa wyrównanie komponentu względem obiektu-rodzica
AutoSize
Określa wyrównanie komponentu względem obiektu-rodzica
Caption
Tytuł komponentu (tekst wyświetlany na obiekcie)
ClientHeight
Rozmiar obszaru roboczego (wysokość)
ClientWidth
Rozmiar obszaru roboczego (szerokość)
Color
Kolor tła obiektu
Cursor
Kursor wyświetlany po umieszczeniu wskaźnika myszy nad
obiektem
Enabled
Określa, czy obiekt jest aktywny czy też nie
Font
Czcionka używana przez komponent
Hint
Wskazówka (etykietka podpowiedzi), pokazywana po
umieszczeniu kursora nad obiektem
Name
Nazwa komponentu
Visible
Właściwość określa, czy komponent ma być widoczny
podczas działania programu
Zdarzenia (Events)
OnClik
Podejmuje działanie po kliknięciu (pojedynczym)
OnDragDrop
Akcja po przeniesieniu w inne miejsce (wykonanie
procedury)
OnKyeDown
Akcja po puszczeniu klawisza
OnKeyPress
Akcja po naciśnięciu klawisza
OnMouseAction Akcja po wykonaniu jakiejkolwiek akcji myszką
OnMouseMove
Akcja po ruchu myszką
OnEnter
Akcja ne wejsciu
OnExit
Akcja po zamknięciu komponentu, okna
Komponenty LCL
Komponenty znajdują się w Na pasku
pod listwą Menu
Są podzielone na grupy
Grupa Standard
zawiera najczęściej wykorzystywane komponenty, służą
one do projektowania wyglądu aplikacji.
Grupa Standard
zawiera najczęściej wykorzystywane komponenty, służą
one do projektowania wyglądu aplikacji.
TFrames
- Ramki (frames) mają podobne właściwości
jak formularze (forms) z tym wyjątkiem, że ramka
może być osadzona wewnątrz formy. Wprowadzenie
ramek bardzo ułatwiło projektowanie wyglądu
niektórych aplikacji.
TMainMenu
- główne menu danego formularza
TPopUpMenu
- menu wyświetlane po kliknięciu prawym
przyciskiem myszki na danym obiekcie
TLabel
– (etykieta )pole służące do wyświetlania tekstu
TEdit
- pole służące do edycji jednego wiersza tekstu
TMemo
- pole tekstowe z możliwością edycji, odczytu i
zapisu wyświetlanego tekstu
TButton
– przycisk
Grupa Standard
TCheckBox
- pole wyboru
TRadioButton
- pole wyboru jedne z kilku opcji
TListBox
- wyświetla listę elementów
TComboBox
- wyświetla listę elementów z możliwością
wpisania tekstu
TScrollBar
- pasek przewijania
TGroupBox
- grupuje kilka komponentów np. typu
RadioButton lub CheckBox
TRadioGroup
- grupuje komponenty RadioButton
powodując że możliwe jest wybranie tylko jednego z
nich
TPanel
- komponent grupujący inne komponenty
ActionList
- komponent pozwalający na dodawanie
własnych procedur obsługi do niektórych akcji
wykonywanych przez użytkownika
Grupa Additional
zawiera uzupełniające
komponenty kształtujące wygląd naszej aplikacji oraz
ułatwiające komunikację z użytkownikiem.
Grupa Additional
zawiera uzupełniające
komponenty kształtujące wygląd naszej aplikacji oraz
ułatwiające komunikację z użytkownikiem.
TBitBtn
- przycisk na którym umieszczony jest rysunek
(Ikona)
TSpeedButton
- przycisk umieszczany w pasku narzędzi
TMaskEdit
- pole edycji pozwalające na filtrowanie i
formatowanie danych wprowadzanych przez
użytkownika
TStringGrid
- arkusz którego elementami są łańcuchy
znaków
TDrawGrid
- arkusz przeznaczony do wprowadzania
danych innych niż tekstowe
TImage
- komponent wyświetlający grafikę (także pliki
JPEG)
TShape
- figura geometryczna
TBevel
- tworzy wypukłe lub wklęsłe linie, prostokąty,
lub ramki
Grupa Additionla
TScrollBox
- przewijane okienko mogące zawierać inne
komponenty
TCheckListBox
- przewijana lista z możliwością
zaznaczenia poszczególnych pozycji
TSplitter
- służy do przesuwania części okienka
TStaticText
– napis –tekst statyczny -komponent
działający podobnie jak Label
TControlBar
- pasek narzędzi z możliwością
przestawiania poszczególnych pozycji
ApplicationEvents
- niewizualny komponent
umożliwiający obsługe globalnych zdarzeń aplikacji
TValueListEditor
- edytor listy wartości
TLabeledEdit
- pole edycyjne z tekstem opisu
TColorBox
- lista wyboru kolorów systemowych
Common Controls
Grupa
System
Na tej karcie znajdują się komponenty korzystające
bezpośrednio z funkcji systemowych .
Grupa
System
Na tej karcie znajdują się komponenty korzystające
bezpośrednio z funkcji systemowych .
TTimer
- wywołuje zadaną procedurę w
określonych odstępach czasu
Grupa
Dialogs
Zawiera komponenty wywołujące
różnego typu okienka dialogowe.
Grupa
Dialogs
Zawiera komponenty wywołujące
różnego typu okienka dialogowe.
TOpenDialog
- okienko otwierania pliku
TSaveDialog
- okienko zapisywania pliku
TOpenPictureDialog
- okienko otwierania pliku z
podglądem graficznym
TSavePictureDialog
- okienko zapisywania pliku z
podglądem graficznym
TFontDialog
- okienko wyboru czcionki
TColorDialog
- okienko wyboru koloru
TPrintDialog
- okienko drukowania
TPrinterSetupDialog
- okienko ustawień drukarki
TFindDialog
- okienko obsługujące procedury
przeszukiwania
TReplaceDialog
- okienko obsługujące procedury
zamiany zadanej frazy
TPageSetupDialog
- okienko ustawień strony
Aplikacja -Stoper
Zbudować na postawie komponentów: TLabel i
Ttimer Zegar - Stoper elektroniczny
Stoper1: Zbudować na postawie komponentów:
TLabel i Ttimer stoper elektroniczny (zliczanie sekund
i minut, start od wartości 00:00)
Stoper2: Zmodyfikować Stoper1 tak aby zliczanie
sekund następowało co 200ms, oraz zbudować
funkcję wyświetlania czasu, która minuty i sekundy
zawsze wyświetla dwucyfrowo.
1.Otwórz aplikację VCL
2. Wstaw komponent Label i timer
3. W polu caption formularza form1 wpisz „Stoper1”
Zmień nazwę komponentu Label1 na Label00_00 (pole Name)
Komponenty graficzne opisane są w pliku tekstowym unit1.pas
4. W polu Caption komponentu Label00_00 ustaw: 00:00
w polu Font ustaw rozmiar czcionki na 48, pochyl, zmień kolor
5. Wygeneruj procedurę Timer1Timer klikając dwukrotnie na ikonie
obiektu Timer (W inspektorze obiektów „Events” timer zostaje właczony
do formularza (jak na rysunku)
6. W procedurze Tmer1timer wpisz treść procedury która będzie zliczać
sekundy i zamieniać na minuty
// procedura Timer1Timer która zlicza zmienną sec
// co 1000 ms czyli co sekundę i zlicza też minuty
// procedura Timer1Timer pochodzi od obiektu Timer1
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//tu będziemy co 1000ms zliczać
inc(sek);
if sek >= 60 then
begin
sek := 0;
inc(min);
end;
Label00_00.Caption := IntToStr(min)+ ':'+IntToStr(sek) ;
end;
Kod aplikacji stoper ( formularza Form1) znajduje się w
module unit1.pas a poniżej jego pełna zawartość
unit Unit1;
{$mode objfpc}{$H+}
Interface
uses
Classes, SysUtils, FileUtil, LResources,
Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Label_00: TLabel;
Timer1: TTimer;
procedure Timer1Timer(Sender:
TObject);
private { private declarations }
public
{ public declarations }
min, sek :Integer;
end;
var Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.Timer1Timer(Sender:
TObject);
Begin
inc(sek); //tu będziemy co 1000ms
if sek >= 60 then begin
sek := 0;
inc(min);
end;
Label_00.Caption :=
IntToStr(min)+':'+IntToStr(sek) ;
end;
initialization
{$I unit1.lrs}
end.
Plik główny aplikacji czyli stoper1.lpr ma postać
program stoper1;
{
$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces,
// this includes the LCL widgetset
Forms, Unit1, LResources
{ you can add units after this };
{$IFDEF WINDOWS}{$R stoper1.rc}{$ENDIF}
begin
{$I stoper1.lrs}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Dla aplikacji stoper2
program stoper2;
•
Dodać funkcję (metoda klasy TForm1)
function TForm1.IntToStr00(x :Integer) :string;
begin
Result := IntToStr(x);
if length(Result) < 2 then
Result := '0'+Result;
End;
Użyć ją metodzie Timer1
•Ustawić
pole TimeInterval Timer1 na warość 200 (ms)
Stoper3: Zbudować na postawie komponentów:
TPanel (x2), Ttimer, TButton (x3) stoper elektroniczny:
(zliczanie sekund i minut, start od wartości 00:00,
przycisk Star uruchamia stoper od nowa, przycisk Stop
zatrzymuje stoper, przycisk Koniec zamyka aplikację,
cyfry stopera umieścić na panelu 2, na panelu 1
umieścić napis „Stoper”)
Stoper4: Zbudować na postawie komponentów:
TPanel (x2), Ttimer, TButton (x4), Label, stoper
elektroniczny: (zliczanie sekund i minut, start od
wartości 00:00, przycisk Reset uruchamia stoper od
nowa, przycisk Stop zatrzymuje stoper, Start
kontynuuje liczenie sekund, przycisk Koniec zamyka
aplikację, cyfry stopera umieścić komponencie Label,
na panelu2 umieścić wszystkie przyciski, na panelu 1
umieścić stoper, zliczanie co 200ms.
Stoper 3 z przyciskami
Wstaw na formularz następujące komponenty: Ttimer (zegar),
3x TButton (przyciski) 2x Tpanel , TLabel
Ustaw odpowiednie napisy na przyciskach i etykiecie wpisując w pola
Caption polskie nazwy przycisków
Caption Start (dla przycisk1 , Button1)
Caption Stop (dla przycisk2 , Button2)
Caption Koniec (dla przycisk3 , Button3)
Caption 00:00 (dla etykiety , Label1)
Zmień kolor stopera i wielkość czcionki – opcja Font
procedury
które zostają wywołane 2-klik przycisku
procedure TForm1.Button1Click(Sender: TObject);
begin
sek:=0; min:=0;
//zerowanie zmiennych
Label1.Caption := '00:00' ;
//ustaw zerowy czas stopera
Timer1.Enabled:=True;
//Włącza stoper
End;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False ;
//zatrzymaj stoper
e
nd;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
//zamkniecie aplikacji
end;
//procedur zliczania czasu stopera
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//tu będziemy co 1000ms
inc(sek); //
zlicza sekundy
if sek >= 60 then
begin
sek := 0;
inc(min); //
zlicza minuty
end;
Label1.Caption := IntToStr(min)+ ':'+IntToStr(sek) ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
sek:=0; min:=0;
Label1.Caption := '00:00' ;
Timer1.Enabled:=True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//tu będziemy co 1000ms
inc(sek);
if sek >= 60 then
begin
sek := 0;
inc(min);
end;
Label1.Caption := IntToStr(min)+
':'+IntToStr(sek) ;
end;
end.
unit1;
Interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
min, sek :Integer;
end;
var
Form1: TForm1;
Implementation
{$R *.dfm}
Zawartość modułu unit1.pas aplikacji stoper
//Po zmianie nazw komponentów Label1 , button1,
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//tu będziemy co 1000ms
inc(sek); //
zlicza sekundy
if sek >= 60 then
begin
sek := 0;
inc(min); //
zlicza minuty
end;
LabelMain.Caption := IntToStr(min)+ ':'+IntToStr(sek) ;
end;
procedure TForm1.B1StartClick(Sender: TObject);
begin
sek:=0; min:=0;
LabelMain.Caption := '00:00' ;
Timer1.Enabled:=True;
end;
procedure TForm1.B2StopClick(Sender: TObject);
begin
Timer1.Enabled:=False;
end;
procedure TForm1.B3KonicClick(Sender: TObject);
begin
close;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//tu będziemy co 1000ms
inc(sek);
if sek >= 60 then
begin
sek := 0;
inc(min);
end;
LabelMain.Caption := IntToStr(min)+
':'+IntToStr(sek) ;
end;
end.
unit unit1;
Interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
LabelMain: TLabel;
Timer1: TTimer;
B1Start: TButton;
B2Stop: TButton;
B3Koniec: TButton;
procedure Timer1Timer(Sender: TObject);
procedure B2StopClick(Sender: TObject);
procedure B1StartClick(Sender: TObject);
procedure B3KonicClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
min:Integer;
sek :Integer;
end;
var
Form1: TForm1;
Implementation
{$R *.dfm}
Zawartość modułu unit1.pas aplikacji stoper
Po zmianie nazw komponetów
Stoper 4 z przyciskami i kołem
Stoper 4 z przyciskami i kołem
Opis aplikacji stoper 4
unit Unit1;
Interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
Type TForm1 = class(TForm)
PanelBot: TPanel;
PanelMain: TPanel;
LabelMain: TLabel;
Timer1: TTimer;
ButtonStart: TButton;
ButtonStop: TButton;
ButtonEnd: TButton;
ButtonReset: TButton;
Image1: TImage;
procedure Timer1Timer(Sender: TObject);
procedure ButtonStartClick(Sender: TObject);
procedure ButtonStopClick(Sender: TObject);
procedure ButtonEndClick(Sender: TObject);
procedure ButtonResetClick(Sender: TObject);
private
{ Private declarations }
min, sek :Cardinal;
function IntToStr00(x :Integer) :String;
public
{ Public declarations }
end;
Opis aplikacji stoper 4
Var Form1: TForm1;
Implementation
{$R *.dfm}
procedure TForm1.ButtonResetClick(Sender: TObject);
begin
Timer1.Enabled := False;
sek:=0; min:=0;
LabelMain.Caption := '00:00';
end;
procedure TForm1.ButtonEndClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
Timer1.Enabled := true;
End;
Opis aplikacji stoper 4
procedure TForm1.ButtonStopClick(Sender:
TObject);
begin
Timer1.Enabled := false;
end;
function TForm1.IntToStr00(x :Integer) :String;
begin
Result := IntToStr(x);
if Length(Result) < 2 then Result :=
'0'+Result;
End;
procedure TForm1.Timer1Timer(Sender:
TObject);
begin
inc(sek); //tu będę co 200ms
if sek >= 60 then
begin
sek := 0;
inc(min);
end;
LabelMain.Caption :=
IntToStr00(min)+':'+IntToStr00(sek);
if (sek >= 3) or (min > 0) then
begin
if (sek mod 2) = 1 then
Image1.Canvas.Brush.Color := clRed
else
Image1.Canvas.Brush.Color := clBlack;
Image1.Canvas.Ellipse(0,0,60,60);
end;
end;
end.
Aplikacja stoper 7
z przesuwjącym się kółkiem
Stoper7: Zbudować na postawie komponentów:
TImage (x2), Ttimer, TButton (x2), Label,
stoper elektroniczny: (zliczanie sekund i minut, start
od wartości 00:00,
1) Z przeuswającym się kółkiem po oknie grafivznym
2) wynikiem numerycznym w oknie gragicznym
3) Ze zmienna wielkością cyfr stopera
Aplikacja stoper 7
z przesuwającym się kółkiem
Aplikacja stoper 7
procedure TForm1.BStartClick(Sender:
TObject);
begin
sek:=0;
min:=0;
Timer1.Interval := 1000;
Label_00.Caption:='00:00';
Timer1.Enabled:=True;
Label_00.Font.Size := 20;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(sek); //tu będziemy co 1000ms
if sek >= 60 then begin
sek := 0; inc(min);
end;
Label_00.Font.Size := sek+20; //zm roz cyfr stope
if sek >5 then Timer1.Interval := 200;
Label_00.Caption :=
IntToStr(min)+':'+IntToStr(sek) ;
//pobranie rozmiaru prostokąta z image2
Rect:=Image2.Canvas.ClipRect;
//czyszczenie (na bialo) okna 1
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.ClipRect;
Image1.Canvas.FillRect(Canvas.ClipRect);
Image2.Canvas.FillRect(Canvas.ClipRect);
Image1.Canvas.Brush.Color:=clRed;
// rysowanie kolka w nowym miejscu
Image1.Canvas.Ellipse(10*sek+20,0,10*sek,20);
//Rysowanie sekund w drugim oknie
Image2.Canvas.TextRect(Rect,1,1,inttostr(sek));
//napis w oknie 1 w prostokacie staly lub przesuw
Image1.Canvas.TextRect(Rect,1,1,'sek');
//Image1.Canvas.TextRect(Rect,1,1,'sek');
end;