background image

Wstęp do programowania

Wykład

11 – biblioteka LCL

Aplikacja :STOPER

background image

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. 

background image

VCL 

– visula component Library

VCL –jest biblioteką wizualnych komponentów   

stworzona w języku 

Object Pascal

przez firmę Borland 

na potrzeby środowiska Delphi, potem zaadaptowana 

też do środowiska 

C++ Builder

.

Biblioteka VCL należy do jednych z bardziej przejrzystych 

i dobrze zaprojektowanych bibliotek wspomagających 

programowanie  w środowisku 

Windows

, zwłaszcza 

tworzenie interfejsu użytkownika. 
Obecnie biblioteka VCL integruje w sobie też możliwość 

korzystania z technologi

.NET

firmy 

Microsoft

.

Podstawą biblioteki VCL jest klasa bazowa TObject. Z 

niej dziedziczą wszystkie pozostałe 

klasy biblioteki

.

background image

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.

background image

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

background image

Komponenty posiadają określone 

metody, właściwości oraz zdarzenia. 
Te pojęcia określają sposób 

komunikowania się komponentu z 

otoczeniem.

background image

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

background image

Okno 

Object 

Inspector

(metody, 

właściwości, 
zdarzenia

)

background image

Okno Object Inspector

(metody, właściwości, zdarzenia

)

background image

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

background image

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

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. 

background image

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;

background image

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

background image

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

background image

Komponenty LCL

Komponenty  znajdują się w Na pasku 

pod listwą Menu
Są podzielone na grupy

background image

Grupa Standard

zawiera najczęściej wykorzystywane komponenty, służą 

one do projektowania wyglądu aplikacji.

background image

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

background image

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

background image

Grupa Additional 

zawiera uzupełniające 

komponenty kształtujące wygląd naszej aplikacji oraz 

ułatwiające komunikację z użytkownikiem.

background image

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

background image

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

background image

Common Controls

background image

Grupa 

System

Na tej karcie znajdują się komponenty korzystające 

bezpośrednio z funkcji systemowych .

background image

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

background image

Grupa 

Dialogs

Zawiera komponenty wywołujące 

różnego typu okienka dialogowe.

background image

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

background image

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.

background image

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)

background image

Komponenty graficzne opisane są w pliku tekstowym unit1.pas 

background image

4. W polu Caption komponentu Label00_00 ustaw:  00:00

w polu Font ustaw rozmiar czcionki na 48, pochyl, zmień kolor

background image

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

background image

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

background image

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.

background image

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.

background image

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)

background image

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.

background image

Stoper 3 z  przyciskami  

background image

Wstaw na formularz następujące komponenty: Ttimer (zegar), 

3x  TButton (przyciski)  2x Tpanel , TLabel

background image

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)

background image

Zmień kolor stopera i wielkość czcionki – opcja Font

background image

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;

background image

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

background image

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

background image

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

background image

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

background image

Stoper 4 z  przyciskami i kołem  

background image

Stoper 4 z  przyciskami i kołem  

background image

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;

background image

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;

background image

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.

background image

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

background image

Aplikacja stoper 7

z przesuwającym się kółkiem

background image

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;