Bě₧nß v²vojovΘ prostředφ nejen ₧e dokß₧φ přelo₧it zdrojovΘ k≤dy, ale umφ i v přφpadě chyb na tyto upozornit a nastavit kurzor na co nejbli₧Üφ mφsto v²skytu. Od verze 2.5 mů₧ete tuto vymo₧enost pou₧φvat i v rkEditu. V nßsledujφcφch řßdcφch bude cel² princip vysvětlen.
Ji₧ od verze 1 bylo mo₧nΘ spouÜtět externφ překladač a po jeho dokončenφ otevřφt zvolen² soubor. Tento soubor se otevřel jako dalÜφ ze souborů. Uveden² způsob je stßle pou₧iteln², ale v současnΘ verzi lze zvolit jin² - vylepÜen² - postup.
Při nastavovßnφ překladače či dalÜφch u₧ivatelsk²ch přφkazů lze kromě jinΘho zadat tvz. Log file. Jednß se o libovoln² soubor, typicky v²stup překladače, kter² se po ukončenφ překladu či běhu jinΘ aplikace zobrazφ ve specißlnφm okně pojmenovanΘm Output window (V²stupnφ okno). Jednß se o okno, kterΘ se zobrazφ v dolnφ čßsti editoru (viz obrßzek).
To by ovÜem nebylo nijak zajφmavΘ, pokud by to bylo vÜe, co to umφ. Pokud si obrßzek prohlΘdnete podrobněji, zjistφte, ₧e podle textu ve V²stupnφm okně je označen červeně řßdek, kter² určuje chybu. Jak k tomu doÜlo?
Po načtenφ dat z logovacφho souboru se rkEdit podφvß do adresßře DLLs, zda tam nenφ knihovna, kterß odpovφdß aktußlnφmu typu souboru (viz typy souborů). Pokud ano, předß se jφ text z logovacφho okna, ona jej zanalyzuje a pokud je to mo₧nΘ, vrßtφ pozici ve zdrojovΘm textu, kde k chybě doÜlo.
Standardnφ äbalenφô rkEditu obsahuje takovouto podporu pro kontrolu validnosti XML dokumentu (bli₧Üφ informace jak tuto funkci nastavit hledejte v tΘmatu Podpora XML). V nßsledujφcφm textu si ukß₧eme, jak si napsat vlastnφ určenφ mφsta chyby.
Vzhledem k tomu, ₧e ani nedokß₧i zjistit, jakΘ překladače kdo pou₧φvß, nato₧ jakΘ majφ v²stupy, mß ka₧d² mo₧nost napsat si vlastnφ implementaci určenφ mφsta chyby. Stačφ k tomu libovoln² překladač pro 32-bitovß Windows (Delphi, C++ Builder, MS Visual Studio, ...), jeho₧ v²sledkem mů₧e b²t DLL knihovna.
V adresßři Develop jsou umφstěny čtyři soubory:
LogAnalyzatorsTypes.pas
LogAnalyzatorsTypes.h
xml.dpr
xml.cpp
V souborech LogAnalyzatorsTypes.pas (pro Delphi) a LogAnalyzatorsTypes.h (pro C a C++) jsou umφstěny dva typy a jedna konstanta. Pokud se rozhodnete napsat si vlastnφ DLL, musφte exportovat funkci s nßzvem GetCapability(), kterß vrßtφ zßznam typu TrkEditCapability. Zßznam TrkEditCapability obsahuje dvě slo₧ky:
Version typu PChar, kterß musφ b²t naplněna hodnotou odpovφdajφcφ konstantě CurrentVersion uvedenΘ ve zmφněn²ch souborech
SupportedFunctionType, kde je určeno, zda se mß volat funkce s parametrem typu TStringList nebo PChar (viz dßle).
Druhou funkcφ, kterß musφ b²t exportovßna, je GetXYOfFirstError. TΘto funkci se jako jeden parametr dß text, kter² byl zφskßn z logovacφho souboru a ona vrßtφ jednak pozici chyby ve zdrojovΘm textu a pak pozici, kam se mß posunout kursor ve v²stupnφm okně (posun ve v²stupnφm okně nenφ zatφm podporovßn, jednß se pouze o přφpravu pro dalÜφ verzi rkEditu). Podle hodnoty ve slo₧ce SupportedFunctionType se rkEdit dozvφ, jak²m způsobem mß předat text z logovacφho souboru funkci GetXYOfFirstError. Ta mů₧e mφt tedy dva tvary:
Zßpis v Delphi:
function GetXYOfFirstError (const LogString: TStrings; var ErrX, ErrY, LogX, LogY: integer): integer; stdcall;
resp.
function GetXYOfFirstError (const LogString: PChar; var ErrX, ErrY, LogX, LogY: integer): integer; stdcall;
Zßpis v jazyce C:
extern "C" __declspec(dllexport) int GetXYOfFirstError (const char *Text, int *ErrX, int *ErrY, int *LogX, int *LogY);
resp.
extern "C" __declspec(dllexport) int GetXYOfFirstError (const TStrings *Text, int *ErrX, int *ErrY, int *LogX, int *LogY);
Tvar s parametrem typu TStrings je určen pro překladače společnosti Borland a jejich knihovnu VCL. Parametr typu PChar je určen pro libovolnΘ překladače umo₧ňujφcφ tuto datovou strukturu, pro Windows nativnφ.
Funkce GetXYOfFirstError tedy zanalyzuje text, kter² dostane, a vrßtφ přφpadnou pozici ve zdrojovΘm textu a ve v²stupnφm okně. Nßvratovß hodnota v přφpadě ·spěchu je 0 (nula), jinak je nenulovß.
Pro ka₧d² typ souboru je potřeba mφt vlastnφ DLL umφstěnou v adresßři DLLs a pojmenovanou podle tabulky uvedenΘ zde.
Důle₧itΘ upozorněnφ: V přφpadě, ₧e si napφÜete vlastnφ DLL, ve kterΘ budou chyby, nemohu v ₧ßdnΘm přφpadě zaručit, ₧e se rkEdit bude chovat korektně (zßle₧φ na zßva₧nosti chyby). Dbejte proto na to, aby jste v knihovně ₧ßdnou chybu neměli.
V souborech xml.dpr a xml.cpp jsou přelo₧itelnΘ ukßzky, jak lze tΘto technologie vyu₧φt (ostatně soubor xml.dll je překladem souboru xml.cpp). Tvorba DLL souboru v Delphi je poměrně přφmočarß a jasnß, proto se tu tφm nebudu zab²vat, ostatně přφklad je samovypovφdajφcφ.
ZajφmavějÜφ je to s překladačem jazyka C, resp. C++. Dφky společnosti Borland lze zφskat zdarma legßlnφ řßdkov² překladač prßvě jazyka C a C++ pro platformu Windows. Po jeho sta₧enφ a nainstalovßnφ je potřeba jeÜtě vlo₧it cestu do adresßře Bin do systΘmovΘ proměnnΘ PATH. Pokud jste napřφklad vÜe nainstalovali do adresßře C:\CPP55, pak do proměnnΘ PATH přidejte cestu C:\CPP55\BIN. Nynφ stačφ vzφt soubory xml.cpp a LogAnalyzatorsTypes.h a přelo₧it je nßsledujφcφm přφkazem:
bcc32.exe -tWD -ps -IC:\CPP55\Include -LC:\CPP55\Lib xml.cpp
bcc32.exe je řßdkov² překladač
parametr -tWD řφkß, ₧e v²sledkem bude knihovna DLL
parametr -ps zajiÜťuje odpovφdajφcφ jmennou a volajφcφ konvenci
parametr -I řφkß cestu k include souborům, tedy zde do adresßře C:\CPP55\Include
parametr -L řφkß cestu ke knihovnßm, tedy zde do adresßře C:\CPP55\Lib
a konečně xml.cpp řφkß, kter² soubor se vlastně překlßdß
V²sledkem je knihovna XML.DLL, kterou je potřeba umφstit do adresßře DLLs.
DalÜφ konkrΘtnφ informace k souboru XML.DLL, resp. jak pou₧φt tuto knihovnu (či dalÜφ) v prostředφ rkEditu, je uvedeno v tΘmatu Podpora XML.
V některΘ z přφÜtφch verzφch chci tuto technologii značně rozvΘst do podoby hledßnφ předchozφ či nßsledujφcφ chyby, nevßzat se pouze na jedin² zdrojov² soubor a dalÜφ.