16. Zpracovßnφ v²jimek II
  1. Pokud ve svΘ aplikaci pou₧φvßme komponenty VCL, pak je vhodnΘ se seznßmit s mechanismem zpracovßnφ v²jimek VCL. Tyto v²jimky jsou tvo°eny mnoha t°φdami a jsou generovßny automaticky, kdy₧ n∞co neoΦekßvanΘho nastane. Pokud v²jimku nezpracujeme, pak VCL ji zpracuje implicitnφm zp∙sobem. Obvykle je zobrazena zprßva popisujφcφ typ vzniklΘ chyby.

  2. Mezi zpracovßnφm v²jimek C++ a OVL je n∞kolik odchylek: C++ Builder umo₧≥uje zpracovat v²jimky generovanΘ operaΦnφm systΘmem. V²jimky operaΦnφho systΘmu zahrnujφ numerickΘ chyby, p°eteΦenφ zßsobnφku, p°eruÜenφ Ctrl+C apod. Jsou zpracovßny knihovnou b∞hu programu a p°evedeny na objekty t°φd v²jimek VCL p°ed p°edßnφm naÜi aplikaci. M∙₧eme zapsat nap°. nßsledujφcφ k≤d:
    try {
      char * p = 0;
      *p = 0;
    }
    catch (const EAccessViolation &e) {
      ShowMessage("Co to d∞lßte?");
    }
  3. C++ Builder obsahuje mnoho zabudovan²ch t°φd v²jimek pro automatickΘ zpracovßnφ d∞lenφ nulou, chyb soubor∙, chybnΘho p°etypovßnφ a mnoha dalÜφch chyb. VÜechny t°φdy v²jimek VCL jsou odvozeny od t°φdy Exception. Exception poskytuje zßkladnφ vlastnosti a metody pro vÜechny v²jimky a poskytuje konzistentnφ rozhranφ pro zpracovßnφ v²jimek aplikacφ.

  4. V²jimky m∙₧eme zachytit blokem catch, kter² p°edpoklßdß parametr typu Exception. K zachycenφ VCL v²jimek pou₧φvßme nßsledujφcφ syntaxi:
    catch (const t°φda_v²jimka &prom∞nnß_v²jimky)
    Specifikujeme t°φdu v²jimky, kterou chceme zachytit a nabφzφme prom∞nnou, kterou se chceme odkazovat na v²jimku. Nßsledujφcφ p°φklad ukazuje, jak generovat VCL v²jimku:
    void __fastcall TForm1::ThrowException(TObject *Sender)
    {
      try {
        throw Exception("VCL component");
      }
      catch(const Exception &E) {
        ShowMessage(AnsiString(E.ClassName())+ E.Message);
      }
    }
    P°φkaz throw vytvß°φ instanci t°φdy Exception a volß jejφ konstruktor. VÜechny v²jimky odvozenΘ od Exception majφ zprßvu, kterß m∙₧e b²t zobrazena. Zprßva je p°edßna konstruktoru a zφskßvßna vlastnostφ Message.
    Nejd∙le₧it∞jÜφ t°φdy v²jimek VCL jsou popsßny v nßsledujφcφ tabulce:
     
    T°φda v²jimky Popis
    EAbort Zastavuje sekvenci udßlostφ bez zobrazenφ dialogovΘho okna chybovΘ zprßvy.
    EAccessViolation Nedovolen² p°φstup do pam∞ti.
    EBitsError Nedovolen² pokus o p°φstup do bitovΘho pole.
    EComponentError Signalizuje nedovolen² pokus o p°ejmenovßnφ komponenty.
    EConvertError Indikuje chybu konverze.
    EDatabaseError Specifikuje chybu p°φstupu k databßzi.
    EDBEditError Signalizuje nekompatibilnφ data se specifikovanou maskou.
    EDivByZero CeloΦφselnΘ d∞lenφ nulou.
    EExternalException Signalizuje nepoznanou v²jimku.
    EInOutError Reprezentuje chybu vstupu nebo v²stupu souboru.
    EIntOverflow CeloΦφselnΘ p°eteΦenφ.
    EInvalidCast NedovolenΘ p°etypovßnφ.
    EInvalidGraphic Pokus o prßci s neznßm²m grafick²m formßtem.
    EInvalidOperation Nedovolenß operace na komponent∞.
    EInvalidPointer V²sledek nedovolenΘ ukazatelovΘ operace.
    EMenuError Signalizuje problΘm s prvkem nabφdky.
    EOleCtrlError Detekuje problΘm se spojenφm na ovladaΦ ActiveX.
    EOleError Specifikuje chybu automatizace OLE.
    EPrinterError Signalizuje chybu tisku.
    EPropertyError Ne·sp∞Ün² pokus o nastavenφ hodnoty vlastnosti.
    ERangeError P°φliÜ velkß celoΦφselnß hodnota.
    ERegistryException UrΦuje chybu registru.
    EStackOverflow P°epln∞nφ zßsobnφku.
    EZeroDivide D∞lenφ nulou v pohyblivΘ °ßdovΘ Φßrce.

    Jak vidφme v p°edchozφ tabulce, zabudovanΘ t°φdy VCL v²jimek, zpracovßvajφ mnoho v²jimek za nßs a m∙₧eme tedy zjednoduÜit nßÜ k≤d. Pro zpracovßnφ dalÜφch v²jimeΦn²ch situacφ m∙₧eme vytvo°it svΘ vlastnφ v²jimky. M∙₧eme deklarovat novΘ t°φdy v²jimek odvozenφm od Exception s mnoha konstruktory (nebo p°ekopφrujeme konstruktory z existujφcφ t°φdy v SYSUTILS.HPP). Deklaraci vlastnφch t°φd v²jimek uvidφme na p°φkladu v nßsledujφcφ kapitole.

  5. C++ Builder obsahuje n∞kolik knihoven b∞hu aplikace (RTL). V∞tÜina z nich je urΦena pro prßci s aplikacemi C++ Builderu, ale jedna z nich (CW32MT.LIB) je normßlnφ knihovna b∞hu aplikace, kterß nevyu₧φvß VCL. Tato knihovna je poskytnuta pro podporu aplikacφm, kterΘ jsou Φßstφ projektu, ale jsou nezßvislΘ na VCL. Tato RTL nemß podporu pro zachytßvßnφ v²jimek operaΦnφho systΘmu, proto₧e tyto objekty v²jimek jsou odvozeny od TObject a to vy₧aduje sestavenφ VCL k naÜi aplikaci. Plnou podporu zpracovßnφ v²jimek VCL poskytuje RTL CP32MT.LIB.
  6. Nynφ se op∞t vrßtφme k balφΦk∙m. Jak ji₧ vφme, C++ Builder pou₧φvß b∞hovΘ a nßvrhovΘ balφΦky. B∞hovΘ balφΦky jsou Üφ°eny s aplikacemi C++ Builderu. Poskytujφ funkΦnost spuÜt∞nΘ aplikaci. Pro spuÜt∞nφ aplikace, kterß pou₧φvß balφΦky, musφme mφt EXE soubor aplikace a vÜechny balφΦky (BPL soubory), kterΘ aplikace pou₧φvß. P°i Üφ°enφ aplikace, musφme zajistit, ₧e u₧ivatelΘ majφ sprßvnΘ verze vÜech vy₧adovan²ch balφΦk∙.

  7. Pou₧φvßnφ balφΦk∙ zadßvßme znaΦkou Build with Runtime Packages na strßnce Packages dialogovΘho okna zobrazenΘho po volb∞ Project | Options. Pod touto znaΦkou je uveden seznam pou₧φvan²ch balφΦk∙. Pro p°idßnφ balφΦku k seznamu, stiskneme tlaΦφtko Add a v zobrazenΘm dialogovΘm okn∞ zadßme jmΘno p°idßvanΘho balφΦku. TlaΦφtko Browse je mo₧no pou₧φt k nalezenφ balφΦku. Pokud jmΘna balφΦk∙ zapisujeme p°φmo do editaΦnφho ovladaΦe, pak do seznamu nezapisujeme p°φpony soubor∙ a jednotlivß jmΘna odd∞lujeme st°ednφky. Nap°.
    VCL30;VCLDB30;VCLDBX30
    BalφΦky uvedenΘ zde v seznamu jsou automaticky p°idßny k naÜi aplikaci, kdy₧ ji p°eklßdßme. Aplikace sestavenß s balφΦky, stßle musφ vklßdat hlaviΦkovΘ soubory pro zabalenΘ pou₧φvanΘ jednotky. Nap°. aplikace, kterß pou₧φvß databßzovΘ ovladaΦe musφ obsahovat p°φkaz
    #include "vcldb.h";
    pokud pou₧φvß balφΦek VCLDB30. V generovan²ch zdrojov²ch souborech C++ Builder vytvß°φ tyto p°φkazy #include automaticky.
    C++ Builder je dodßvßn s n∞kolika b∞hov²mi balφΦky, vΦetn∞ VCL30, kterß obsahuje zßkladnφ podporu pro jazyk a komponenty. BalφΦek VCL30 obsahuje nejΦast∞ji pou₧φvanΘ komponenty, systΘmovΘ funkce a prvky rozhranφ Windows. V nßsledujφcφ tabulce je uveden seznam b∞hov²ch balφΦk∙ dodßvan²ch s C++ Builderem a jednotky, kterΘ obsahujφ.
     
    BalφΦek Jednotky
    VCL30.BPL  Ax, Buttons, Classes, Clipbrd, Comctrls, Commctrl, Commdlg, Comobj, Comstrs, Consts, Controls, Ddeml, Dialogs, Dlgs, Dsgnintf, Dsgnwnds, Editintf, Exptintf, Extctrls, Extdlgs, Fileintf, Forms, Graphics, Grids, Imm, IniFiles, Isapi, Isapi2, Istreams, Libhelp, Libintf, Lzexpand, Mapi, Mask, Math, Menu, Messages, Mmsystem, Nsapi, Ole2I, Oleconst, Olectnrs, Olectrls, Oledlg, Penwin, Printers, Proxies, Registry, Regstr, Richedit, Shellapi, Shlobj, Stdctrls, Stdvcl, Sysutils, Tlhelp32, Toolintf, Toolwin, Typinfo, Vclcom, Virtintf, Windows, Wininet, Winsock, Winspool, Winsvc
    VCLX30.BPL  Checklst, Colorgrd, Ddeman, Filectrl, Mplayer, Outline, Tabnotbk, Tabs
    VCLDB30.BPL Bde, Bdeconst, Bdeprov, Db, Dbcgrids, Dbclient, Dbcommon, Dbconsts, Dbctrls, Dbgrids, Dbinpreq, Dblogdlg, Dbpwdlg, Dbtables, Dsintf, Provider, SMintf
    VCLDBX30.BPL Dblookup, Report
    DSS30.BPL  Mxarrays, Mxbutton, Mxcommon, Mxconsts, Mxdb, Mxdcube, Mxdssqry, Mxgraph, Mxgrid, Mxpivsrc, Mxqedcom, Mxqparse, Mxqryedt, Mxstore, Mxtables, Mxqvb
    QRPT30.BPL  Qr2const, Qrabout, Qralias, Qrctrls, Qrdatasu, Qrexpbld, Qrextra, Qrprev, Qrprgres, Qrprntr, Qrqred32, Quickrpt
    TEE30.BPL  Arrowcha, Bubblech, Chart, Ganttch, Series, Teeconst, Teefunci, Teengine, Teeprocs, Teeshape
    TEEDB30.BPL Dbchart, Qrtee
    TEEUI30.BPL  Areaedit, Arrowedi, Axisincr, Axmaxmin, Baredit, Brushdlg, Bubbledi, Custedit, Dbeditch, Editchar, Flineedi, Ganttedi, Ieditcha, Pendlg, Pieedit, Shapeedi, Teeabout, Teegally, Teelisb, Teeprevi, Teexport
    VCLSMP30.BPL Sampreg, Smpconst

    Mimo tyto standardnφ balφΦky, m∙₧eme vyu₧φvat u₧ivatelskΘ balφΦky (balφΦky, kterΘ jsme vytvo°ili sami nebo balφΦky jin²ch v²robc∙). Nap°. jestli₧e mßme statistick² balφΦek nazvan² STATS.BPL a chceme jej pou₧φvat, pak jej musφme p°idat do seznamu pou₧φvan²ch balφΦk∙ v okn∞ Project Options.

  8. NßvrhovΘ balφΦky jsou pou₧ity k instalovßnφ komponent na Paletu komponent a k vytvß°enφ specißlnφch editor∙ vlastnostφ pro komponenty. V dalÜφ tabulce jsou uvedeny nßvrhovΘ balφΦky, kterΘ jsou p°edinstalovßny v IDE.

  9.  
    BalφΦek Strßnky Palety komponent
    DCLSTD30.BPL  Standard, Additional, System, Win32, Dialogs
    DCLTEE30.BPL  Additional (komponenta TChart)
    DCLDB30.BPL  Data Access, Data Controls
    DCLMID30.BPL  Data Access (MIDAS)
    DCL31W30.BPL  Win 3.1
    DCLNET30.BPL
    NMFAST.BPL 
    Internet
    BCBSMP30.BPL  Samples
    DCLOCX30.BPL  ActiveX
    DCLQRT30.BPL  QReport
    DCLDSS30.BPL  Decision Cube
    IBSMP30.BPL  Samples (komponenta IBEventAlerter)
    DCLINT30.BPL  (International ToolsùResource DLL Wizard)

    Mimo p°edinstalovan²ch balφΦk∙, m∙₧eme instalovat svΘ vlastnφ balφΦky komponent nebo balφΦky komponent jin²ch firem. Nßvrhov² balφΦek DCLUSR30 je poskytnut jako implicitnφ kontejner pro novΘ komponenty.

  10. V C++ Builderu jsou vÜechny komponenty instalovanΘ v IDE jako balφΦky. Jestli₧e vytvß°φme svΘ vlastnφ komponenty, pak musφme vytvo°it a p°elo₧it balφΦek, kter² je obsahuje. K instalovßnφ nebo odinstalovßnφ sv²ch vlastnφch komponent nebo komponent jin²ch firem, je pot°eba provΘst nßsledujφcφ kroky:
  11. Dokud nezm∞nφme implicitnφ nastavenφ, pak novΘ projekty jsou vytvß°eny se vÜemi dostupn²mi nainstalovan²mi balφΦky. SouΦasnΘ volby ud∞lßme implicitnφ pro novΘ projekty oznaΦenφm znaΦky Default ve spodnφ Φßsti okna.
  12. Vytvo°enφ balφΦku znamenß specifikovat jmΘno balφΦku, seznam dalÜφch balφΦk∙, na kterΘ se balφΦek odkazuje a seznam jednotek, kterΘ majφ b²t obsa₧eny v balφΦku. BalφΦky jsou definovßny zdrojov²m souborem (CPP) a specißlnφm vytvß°ecφm souborem s p°φponou BPK. Tyto soubory jsou generovßny Sprßvcem projektu.

  13. P°i vytvß°enφ balφΦku postupujeme takto: volbou File | Close All uzav°eme vÜechny soubory a zvolφme File | New, vybereme ikonu Package a stiskneme OK (jsou vygenerovßny soubory CPP a BPK). Ulo₧φme balφΦek s nov²m jmΘnem a volbou View | Project Makefile zobrazφme vygenerovan² vytvß°ecφ soubor (BPK). Volbou View | Project Manager otev°eme Sprßvce projekt∙. Ve sprßvci projektu vidφme pro nov² balφΦek uzly Requires a Contains. K p°idßnφ jednotek do seznamu Contains zvolφme Project | Add To Project, v dialogovΘm okn∞ vybereme CPP soubor a stiskneme Open. Vybranß jednotka je zobrazena pod uzlen Contains ve Sprßvci soubor∙. Tφmto postupem m∙₧eme p°idat dalÜφ jednotky.
    Pro p°idßnφ jednotek do seznamu Requires, je nutno editovat soubor CPP vygenerovan² p°i vytvß°enφ balφΦku (soubor JmΘnoBalφΦku.CPP). Jeliko₧ vÜechny balφΦky vy₧adujφ VCL30, nalezneme zde
    USEPACKAGE("vcl30.bpi");
    K vlo₧enφ dalÜφch balφΦk∙ do tohoto seznamu p°idßme dalÜφ obdobnΘ p°φkazy do souboru CPP. Nap°. jestli₧e vy₧adujeme DSS30, pak p°idßme °ßdek
    USEPACKAGE("dss30.bpi");
    Kdy₧ nynφ p°elo₧φme nßÜ projekt, pak tyto novΘ balφΦky jsou p°idßny k souboru BPK automaticky, ale nezobrazφ se ve sprßvci projekt∙ dokud projekt neuzav°eme a op∞t neotev°eme.
    Dßle zvolφme Project | Options a na strßnce Description zadßme popis pro nßÜ balφΦek. Na stejnΘ strßnce je jeÜt∞ nutno urΦit o jak² typ balφΦku se jednß (nßvrhov², b∞hov² nebo oba). Nynφ ji₧ lze balφΦek p°elo₧it. Provedeme to volbou Project | Build.
  14. Editovat existujφcφ balφΦek lze n∞kolika zp∙soby. Nap°. otev°eme soubor BPK. Kdy₧ mßme otev°en projekt balφΦk∙, pak ji₧ m∙₧eme otev°φt zdrojovΘ soubory balφΦku a provΘst jejich editaci.

  15. HlaviΦkov² soubor deklarace komponenty C++ Builderu musφ obsahovat p°eddefinovanΘ makro PACKAGE za klφΦov²m slovem class:
    class PACKAGE MojeKomponenta: .....
    Toto makro je nutno takΘ pou₧φt p°i implementaci funkce Register tΘto komponenty:
    void __fastcall PACKAGE Register()
    Makro PACKAGE je rozvinuto na p°φkazy, kterΘ umo₧nφ t°φd∞ b²t importovßna a exportovßna ze souboru balφΦku.
  16. JmΘna balφΦk∙ musφ b²t unikßtnφ v projektu. Pokud jmΘno zdrojovΘho souboru balφΦku je STATS.CPP, pak Sprßvce projektu generuje vytvß°ecφ soubor nazvan² STATS.BPK a p°ekladem vznikß p°elo₧en² balφΦek, binßrnφ obraz a (voliteln∞) statickß knihovna, kterΘ se jmenujφ STATS.BPL, STATS.BPIa STATS.LIB.

  17. Seznam Requires specifikuje dalÜφ externφ balφΦky, kterΘ jsou pou₧ity souΦasn²m balφΦkem. Externφ balφΦky, kterΘ jsou zde uvedeny jsou automaticky sestaveny (p°i p°ekladu) do aplikace. Pokud soubory jednotek naÜeho balφΦku se odkazujφ na dalÜφ zabalenΘ jednotky, pak tyto dalÜφ balφΦky majφ b²t uvedeny v seznamu Requires. Pokud je v seznamu Requires neuvedeme, pak odkazovanΘ jednotky jsou zavßd∞ny normßlnφm zp∙sobem (bez souboru BPL). BalφΦky nemohou v seznamu Requires obsahovat kruhovΘ odkazy (balφΦek se nesmφ odkazovat sßm na sebe v seznamu Requires a °et∞zec odkaz∙ musφ konΦit bez odkazu na n∞kter² balφΦek v °et∞zu). Duplicitnφ odkazy v seznamu Requires jsou p°ekladaΦem ignorovßny.
    Seznam Contains urΦuje jednotky tvo°φcφ balφΦek. Do tohoto seznamu vklßdßme soubory zdrojovΘho k≤du (CPP). BalφΦek se nem∙₧e objevit v tomto seznamu pro jin² balφΦek. VÜechny jednotky vlo₧enΘ p°φmo do seznamu Containts balφΦku nebo nep°φmo v t∞chto jednotkßch jsou p°elo₧eny do balφΦku. Jednotky obsa₧enΘ v balφΦku (p°φmo i nep°φmo) nemohou b²t v ₧ßdnΘm jinΘm balφΦku uvedenΘm v seznamu Requires tohoto balφΦku.
16. Zpracovßnφ v²jimek II