background image

 Programowanie obiektowe. Ćwiczenie 13.                                              1 

______________________________________________________________________ 
 

 

 

 
 
 
 
 
 
 
 
 
 

PROGRAMOWANIE OBIEKTOWE 

 

 

 

ĆWICZENIE 13

 

 
 
 
 

 

 

 
 

 

Tworzenie, kompilacja i instalacja pakietów 

 

Tworzenie własnych komponentów 

 

Testowanie aplikacji wykorzystującej nowy komponent 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
 

I.

 

Wstęp  

 

W środowisku C++ Builder moŜemy tworzyć trzy rodzaje komponentów: tylko do 

projektowania, tylko do uruchamiania, podwójne – do projektowania i uruchamiania 
Gdy ciągle udoskonalamy lub testujemy pakiet, to najlepiej tworzyć wersję podwójną. 
 

Tworzenie pakietu komponentów 

 
Tworzenie nowego lub nowych komponentów wymaga wykreowania pakietu w którym 
będą one kompilowane. Musimy teraz utworzyć grupę projektu, aby przechować w niej 
pakiet, Ŝeby nie stanowił on części aplikacji. 
 
Tworzenie nowej grupy projektu: 
 

 

Uruchom Buildera 

 

File







Close All 

 

File







New





Other… 

 

Zakładka New 

 

Project Group 

 

 

Rys.1 Tworzenie grupy projektu 

 
Tworzenie nowego pakietu: 
 

 

File







New





Other… 

 

Zakładka New 

 

Package 

 

 

background image

 Programowanie obiektowe. Ćwiczenie 13.                                              3 

______________________________________________________________________ 
 

 

 

 
 

 

Rys.2 Tworzenie pakietu 

 
Następnie określamy rodzaj pakietu: 

 

 

Options







Designtime and runtime 

 

 

 

Rys.3 Rodzaj pakietu 

 
 
 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
Zapisanie grupy projektu na dysk: 
 

 

Przejdź do okna Project Manager 

 

View







Project Manager 

 

Zaznacz ProjectGroup1 i kliknij prawym klawiszem myszy 

 

Save Project Group As… 

 

Rys.4 Zapis grupy 

 

 

Wpisz nazwę pliku „MojaGrupa.bpg” 

 

Zapisz 

 

Rys.5 Zapis grupy do pliku *.bpg 

 

 
 

background image

 Programowanie obiektowe. Ćwiczenie 13.                                              5 

______________________________________________________________________ 
 

 

 

Zapis pakietu na dysk: 

 

 

Kliknij prawym przyciskiem myszy na nazwę Package1.bpl 

 

 

Rys.6 Zapis pakietu do pliku *.bpk 

 

 

Wybierz opcję Save… 

 

Wpisz nazwę pliku „MojPakiet.bpk” 

 

Zapisz 

 

 

Rys.7 Zapis pakietu do pliku MojPakiet.bpk 

 

 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
 
PAMIĘTAJ : 
 U MNIE JEST TO KATALOG O NAZWIE  
 
C:\Program Files\Borland\CBuilder6\Projects\PROGRAMOWANIE\Cplusplus 
 
U CIEBIE MOZE BYĆ INNY!!! 
 
MUSISZ SAM PAIĘTAĆ GDZIE ZACHOWUJESZ SWOJE PAKIETY  
I GRUPY PROJEKTÓW 
 
 
W tej chwili wygenerowałem następujące pliki: 
MojaGrupa.bpg 
MojPakiet.bpk 
MojPakiet.cpp 
MojPakiet.res 
 

II.

 

Tworzenie własnych komponentów 

 
Zwykle własne nowe komponenty budujemy na podstawie juŜ istniejących 
komponentów – trzeba więc posiadać troszkę wiedzy na temat nazw istniejących 
komponentów. 
 
Zaletą takiego postępowania jest to, Ŝe nie trzeba projektować ich od początku co 
naraziło by nas na stratę czasu na programowanie, testowanie i usuwanie błędów!!!!  
 
Tera wykreujemy prosty komponent co zajmie nam kilkanaście minut.  
 
Będzie nazywał się TNumEdit 
 
Zmodyfikujemy klasę TCustomEdit. Na jej podstawie utworzymy nową klasę 
(komponent) o nazwie TNumEdit, która będzie polem edycyjnym, umoŜliwiającym 
wpisywanie liczb określonego typu: naturalnych, całkowitych, rzeczywistych. 
 

Tworzenie nowego komponentu 

 
Tworzenie nowego komponentu: 
 

 

File







New





Other… 

 

Component 

 

Ok 

 
Patrz Rys. 8 

background image

 Programowanie obiektowe. Ćwiczenie 13.                                              7 

______________________________________________________________________ 
 

 

 

 

Rys.8 Nowy komponent 

 
 

 

Ancestor Type: TCustomEdit (typ klasy bazowej) 

 

Class Name: TNumEdit (nazwa tworzonego komponentu) 

 

Palette Page: MojeKomponenty (zakładka palety w VCL) 

 

Unit file name: c:\program files\borland\cbuilder6\Lib\NumEdit.cpp 
(nazwa pliku źródłowego komponentu) 

 

OK 

 
Po zatwierdzeniu otrzymamy kod źródłowy (szablon) komponentu – Rys. 9. 
 

 

 

Rys.9 Kod źródłowy nowego komponentu 

 
 
 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

Kod w pliku NumEdit.h 

 
//--------------------------------------------------------------------------- 
 
#ifndef NumEditH 
#define NumEditH 
//--------------------------------------------------------------------------- 
#include <SysUtils.hpp> 
#include <Classes.hpp> 
#include <Controls.hpp> 
#include <StdCtrls.hpp> 
//--------------------------------------------------------------------------- 
class PACKAGE TNumEdit : public TCustomEdit 

private: 
protected: 
public: 
        __fastcall TNumEdit(TComponent* Owner); 
__published: 
}; 
//--------------------------------------------------------------------------- 
#endif 
 

Kod w pliku NumEdit.cpp 

//--------------------------------------------------------------------------- 
 
#include <vcl.h> 
 
#pragma hdrstop 
 
#include "NumEdit.h" 
#pragma package(smart_init) 
//--------------------------------------------------------------------------- 
// ValidCtrCheck is used to assure that the components created do not have 
// any pure virtual functions. 
// 
 
static inline void ValidCtrCheck(TNumEdit *) 

        new TNumEdit(NULL); 

//--------------------------------------------------------------------------- 
__fastcall TNumEdit::TNumEdit(TComponent* Owner) 
        : TCustomEdit(Owner) 


//--------------------------------------------------------------------------- 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 13.                                              9 

______________________________________________________________________ 
 

 

 

namespace Numedit 

        void __fastcall PACKAGE Register() 
        { 
                 TComponentClass classes[1] = {__classid(TNumEdit)}; 
                 RegisterComponents("MojeKomponenty", classes, 0); 
        } 

//--------------------------------------------------------------------------- 
 

Rozbudowa komponentu 

 

 

zmieniamy NumEdit.h 

Naszym celem jest utworzenie pola edycyjnego, w które będzie moŜna wpisywać 
jedynie liczby określonego typu – określmy je:  
 
// typ wyliczeniowy 
typedef enum {ntCalkowite, ntRzeczywiste, ntNaturalne} TNumType; 
 
Oto pełny kod: 
 

//--------------------------------------------------------------------------- 
 
#ifndef NumEditH 
#define NumEditH 
//--------------------------------------------------------------------------- 
#include <SysUtils.hpp> 
#include <Classes.hpp> 
#include <Controls.hpp> 
#include <StdCtrls.hpp> 
//--------------------------------------------------------------------------- 
 
// typ wyliczeniowy dla zmiennej fNumType 
typedef enum {ntCalkowite, ntRzeczywiste, ntNaturalne} TNumType; 
 
 
class PACKAGE TNumEdit : public TCustomEdit 

private: 
        TNumType fNumType; // typ pola edycyjnego 
protected: 
        // metody do obsługi zdarzeń 
        DYNAMIC void __fastcall DoExit(void); 
        DYNAMIC void __fastcall KeyPress(char &Key); 
        void  SprawdzRzeczywiste(char &Key); 
        void  SprawdzCalkowite(char &Key); 
        void  SprawdzNaturalne(char &Key); 
 

background image

10 

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

public: 
__fastcall TNumEdit(TComponent* Owner); 
__published: 
__property TNumType NumType = { read = fNumType, write = fNumType, 
                                default = ntCalkowite }; 
__property MaxLength; // maksymalna długość 
__property ReadOnly; // zablokowana edycja 
__property OnEnter; // gdy naciśnięto ENTER 
__property OnExit; // gdy wyjście z komponentu 
__property OnClick; // gdy kliknięty komponent 
__property OnChange; // gdy zmienieniono wartość komponentu 
}; 
//--------------------------------------------------------------------------- 
#endif 
  
 

 

zmieniamy NumEdit.cpp 

//--------------------------------------------------------------------------- 
#include <vcl.h> 
#pragma hdrstop 
#include "NumEdit.h" 
#pragma package(smart_init) 
//--------------------------------------------------------------------------- 
// ValidCtrCheck is used to assure that the components created do not have 
// any pure virtual functions. 
// 
static inline void ValidCtrCheck(TNumEdit *) 

        new TNumEdit(NULL); 

//--------------------------------------------------------------------------- 
__fastcall TNumEdit::TNumEdit(TComponent* Owner) 
        : TCustomEdit(Owner) 

// konstruktor klasy 
// domyślnie komponent przyjmuje liczby całkowite i ma wartość 0 
fNumType = ntCalkowite; 
Text = '0'; 

 
//--------------------------------------------------------------------------- 
namespace Numedit 

        void __fastcall PACKAGE Register() 
        { 
                 TComponentClass classes[1] = {__classid(TNumEdit)}; 
                 RegisterComponents("MojeKomponenty", classes, 0); 
        } 

background image

 Programowanie obiektowe. Ćwiczenie 13.                                              11 

______________________________________________________________________ 
 

 

 

 

void __fastcall TNumEdit::DoExit(void) 

if (Text != "") 
   if (fNumType == ntRzeczywiste) 
       Text = FloatToStr(StrToFloat(Text)); 
   else 
       Text = IntToStr(StrToInt(Text)); 
else 
   Text  = '0'; 
return; 

 
void __fastcall TNumEdit::KeyPress(char &Key) 

switch (fNumType) 
   { 
   case ntCalkowite   : SprawdzCalkowite(Key); break; 
   case ntRzeczywiste : SprawdzRzeczywiste(Key); break; 
   case ntNaturalne   : SprawdzNaturalne(Key); break; 
   } 
return; 

 
void TNumEdit::SprawdzRzeczywiste(char &Key) 

if (Key == DecimalSeparator) 
   { 
   if ( Text.Pos(DecimalSeparator) != 0 ) 
      { 
      Beep(); 
      Key = 0; 
      } 
   } 
else 
   SprawdzCalkowite(Key); 
return; 

 
void TNumEdit::SprawdzCalkowite(char &Key) 

if (Key == '-') 
   { 
   if ((SelStart > 0) || (Text.Pos("-")!=0)) 
      { 
      Beep(); 
      Key = 0; 
      } 
   } 

background image

12 

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 

else 
   SprawdzNaturalne(Key); 
return; 

 
void TNumEdit::SprawdzNaturalne(char &Key) 

if ((Key == '\8') || (Key == '\13')) return; 
if ((Key < '0') || (Key>'9')) 
   { 
   Beep(); 
   Key = 0; 
   } 
return; 

 
 

III.

 

Instalacja komponentu 

 

Instalacja komponentu TNumEdit 

 
 

 

Component 







 Install Component 

 

 

Rys.10 Instalacja komponentu 

 

 

Zakładka: Into new package 

 

Unit file name: C:\Program Files\Borland\CBuilder6\Lib\NumEdit.cpp 

 

Package file name: 
C:\ProgramFiles\Borland\CBuilder6\Projects\PROGRAMOWANIE\ 
Cplusplus\MojPakiet.bpk 

 

Package description: mój nowy pakiet 

 

 

Ok 

 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 13.                                              13 

______________________________________________________________________ 
 

 

 

 
Jeśli otrzymasz komunikat: 
 

 

 
to wykonaj następujące operacje: 
 
 

 

Zakładka: Into existing package 

 

Unit file name: C:\Program Files\Borland\CBuilder6\Lib\NumEdit.cpp 

 

Package file name: 
C:\ProgramFiles\Borland\CBuilder6\Projects\PROGRAMOWANIE\ 
Cplusplus\MojPakiet.bpk 

 

Package description: mój nowy pakiet 

 

Ok 

 

 

Przejdź do okna  Package 

 

 

 

Rys.11 Okno pakietu 

 
 
 
 
 
 
 
 
 
 
 

background image

14 

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
Wykonaj polecenie 
 

 

Compile 

 

 

Rys.12 Okno komunikatu pomyślnej kompilacji pakietu 

 

 

Install 

 

 

Rys.13 Okno komunikatu pomyślnej instalacji pakietu z zarejestrowanym 

komponentem TNumEdit 

 

 

Rys.14 Na pasku VCL pojawiła się zakładka MojeKomonenty 

 

 

File 







 Exit 

 
 

 

Rys.15 Zapisz ostatnie zmiany w projekcie pakietu MojPakiet 

 

 

Yes 

 
 
 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 13.                                              15 

______________________________________________________________________ 
 

 

 

 

IV.

 

Testowanie aplikacji wykorzystującej 

nowy komponent 

 
Nowa aplikacja będzie miała nazwę AppKomponent.exe
 

Wygenerowanie aplikacji 

 
 

 

Uruchom Buildera 

 

File







Close All 

 

File







New





Application 

 

File







Save All 

 

Zapisz unit w pliku AppKomponentUnit1.cpp 

 

Zapisz projekt w pliku AppKomponent.bpr 

 
Teraz wykorzystamy nasz nowy komponent w aplikacji 

 

 

Przejdź na zakładkę MojeKomponenty 

 

 

Rys.16 Pobieranie komponentu z pakietu MojPakiet 

 

 

Kliknij dwa razy komponent 

 

 

 

Nowy komponent pojawi się na formularzu okna aplikacji 

 

 

Rys.17 Oto komponent z klasy TNumEdit 

 

W oknie ”Object TreeView” widać nazwę komponentu: 

 

 

Rys.18 Komponent ma nazwę NumEdit1 

 
 

background image

16 

 Programowanie obiektowe. Ćwiczenie 13. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
 

 

Zmień właściwość „” komponentu na „ntRzeczywiste” 

 
 

 

Rys.19 Zmiana właściwości komponentu NumEdit1 

 

 

Skompiluj i uruchom aplikację (F9) 

 

Sprawdź zachowanie pola edycyjnego NumEdit1 

 

 

Zmień właściwość „” komponentu na „ntNaturalne” 

 
 

 

Rys.20 Zmiana właściwości komponentu NumEdit1 

 

 

Skompiluj i uruchom aplikację (F9) 

 

Sprawdź zachowanie pola edycyjnego NumEdit1 

 

Rys.21 Wygląd pola komponentu po uruchomieniu aplikacji 

 
 
 
 

SPIS TREŚCI 

 

I. 

Wstęp ........................................................................................................................ 2 

Tworzenie pakietu komponentów................................................................................. 2 

II.  Tworzenie własnych komponentów ......................................................................... 6 

Tworzenie nowego komponentu................................................................................... 6 

Kod w pliku NumEdit.h............................................................................................ 8 
Kod w pliku NumEdit.cpp ........................................................................................ 8 

Rozbudowa komponentu .............................................................................................. 9 

III. 

Instalacja komponentu ........................................................................................ 12 

Instalacja komponentu TNumEdit .......................................................................... 12 

IV. 

Testowanie aplikacji wykorzystującej nowy komponent ................................... 15 

Wygenerowanie aplikacji ....................................................................................... 15