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
2
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
Programowanie obiektowe. Ćwiczenie 13. 3
______________________________________________________________________
Rys.2 Tworzenie pakietu
Następnie określamy rodzaj pakietu:
•
Options
Designtime and runtime
Rys.3 Rodzaj pakietu
4
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
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
6
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
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
8
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)
{
}
//---------------------------------------------------------------------------
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);
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);
}
}
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;
}
}
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
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
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
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
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