ÐоÑÑавÑнеÑо на THotPDF вÑÑÑ
Ñ ÑоÑма по вÑеме на ÑазÑабоÑка (design time) е Ñдобно за бÑÑз пÑоÑоÑип, но Ñова обвÑÑзва Ð¶Ð¸Ð·Ð½ÐµÐ½Ð¸Ñ ÑикÑл на компоненÑа Ñ Ñози на ÑоÑмаÑа, коеÑо ÑÑдко е желаÑелно в пÑоизводÑÑÐ²ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´. ÐенеÑаÑÐ¾Ñ Ð½Ð° оÑÑеÑи, койÑо Ñе изпÑлнÑва веднÑж пÑи ÑÑакване вÑÑÑ
Ñ Ð±ÑÑон, ÑеÑвизна ниÑка за ноÑни екÑпоÑÑи на паÑÑиди или помоÑен клаÑ, койÑо изобÑо нÑма ÑоÑма: вÑв вÑÑка Ð¾Ñ Ñези ÑиÑÑаÑии иÑкаÑе компоненÑÑÑ Ð´Ð° ÑÑÑеÑÑвÑва ÑоÑно за вÑемеÑÑаенеÑо на една задаÑа за генеÑиÑане на PDF и Ñлед Ñова да Ñе пÑемаÑ
не. Това изиÑква динамиÑно заделÑне на Ð¿Ð°Ð¼ÐµÑ Ð¿Ð¾ вÑеме на изпÑлнение (runtime allocation) и пÑÐ¾Ð¼ÐµÐ½Ñ Ð´Ð²Ðµ неÑа, коиÑо ÑÑÑбва да ÑазбеÑеÑе пÑеди напиÑванеÑо на пÑÑÐ²Ð¸Ñ Ñед: кой пÑиÑежава обекÑа и как Ñе извÑÑÑва изÑиÑÑванеÑо пÑи вÑзникване на пÑоблем.
СеманÑика на ÑобÑÑвеноÑÑÑа в VCL
ÐонÑÑÑÑкÑоÑÑÑ Ð½Ð° вÑеки VCL ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¿Ñиема паÑамеÑÑÑ Owner Ð¾Ñ Ñип TComponent*. ÐодаванеÑо на this (ÑоÑмаÑа) ÑегиÑÑÑиÑа Ð½Ð¾Ð²Ð¸Ñ Ð¾Ð±ÐµÐºÑ Ð² ÑпиÑÑка Ñ Ð¿ÑиÑежавани компоненÑи на ÑоÑмаÑа, Ñака Ñе ако ÑоÑмаÑа бÑде ÑниÑожена, докаÑо компоненÑÑÑ Ð²Ñе оÑе е жив, VCL го оÑвобождава авÑомаÑиÑно. ÐодаванеÑо на nullptr ознаÑава липÑа на ÑобÑÑвеник: вие поемаÑе пÑлнаÑа оÑговоÑноÑÑ Ð·Ð° ÑказаÑÐµÐ»Ñ Ð¸ ниÑо нÑма да го изÑиÑÑи вмеÑÑо ваÑ, ако изклÑÑение пÑекÑÑне ÑÑека пÑеди изÑиÑноÑо извикване на delete.
Ðа еднокÑаÑен екÑпоÑÑ, койÑо завÑÑÑва в ÑамкиÑе на една ÑÑнкÑиÑ, и дваÑа избоÑа вÑÑÑÐ°Ñ ÑабоÑа, но Ð¸Ð¼Ð°Ñ ÑазлиÑни Ñежими на оÑказ. ÐÑи this каÑо ÑобÑÑвеник, изÑиÑанеÑо на Ð¿Ð°Ð¼ÐµÑ Ðµ невÑзможно, ÑÑига ÑоÑмаÑа в кÑайна ÑмеÑка да Ñе заÑвоÑи; пÑи nullptr ÑказаÑелÑÑ ÑÑÑбва да доÑÑигне блок __finally. Ðа пÑакÑика моделÑÑ nullptr плÑÑ __finally е малко по-ÑиÑÑ Ð·Ð° кÑаÑкоÑÑайни обекÑи, ÑÑй каÑо пÑави гÑаниÑиÑе на Ð¶Ð¸Ð·Ð½ÐµÐ½Ð¸Ñ ÑикÑл видими Ñ ÐµÐ´Ð¸Ð½ поглед и ÑпеÑÑÑва на ÑоÑмаÑа наÑÑÑпванеÑо на пÑиÑежавани обекÑи, коиÑо Ñа пÑедназнаÑени да бÑÐ´Ð°Ñ Ð²Ñеменни.
СÑÑÑкÑÑÑа, ÑÑÑойÑива на изклÑÑениÑ
ÐенеÑиÑанеÑо на PDF може да Ñе пÑовали по пÑиÑини, коиÑо нÑÐ¼Ð°Ñ Ð½Ð¸Ñо обÑо Ñ API: изÑ
однаÑа диÑекÑоÑÐ¸Ñ Ðµ Ñамо за ÑеÑене, липÑва ÑÑиÑÑ, поÑокÑÑ Ñе изÑиÑÑва пÑеждевÑеменно или пÑедоÑÑавениÑе Ð¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°ÑÐ¸Ñ Ð´Ð°Ð½Ð½Ð¸ надвиÑÐ°Ð²Ð°Ñ Ð¾Ð³ÑаниÑениеÑо за дÑлжина. ÐакваÑо и да е пÑиÑинаÑа, пÑÑÑÑ Ð·Ð° поÑиÑÑване ÑÑÑбва да Ñе изпÑлни. СпеÑиÑиÑниÑÑ Ð·Ð° C++Builder наÑин да Ñе гаÑанÑиÑа Ñова е ÑÑез try/__finally:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma link "HPDFDoc"
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
THotPDF* Pdf = new THotPDF(nullptr);
try
{
Pdf->FileName = "output.pdf";
Pdf->Compression = cmFlateDecode;
Pdf->FontEmbedding = true;
Pdf->BeginDoc();
Pdf->CurrentPage->SetFont("Arial", TFontStyles(), 12);
Pdf->CurrentPage->TextOut(72, 720, 0, L"Hello from C++Builder");
Pdf->EndDoc();
}
__finally
{
delete Pdf;
}
}
ÐÑколко неÑа в Ñози код заÑлÑÐ¶Ð°Ð²Ð°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ. СобÑÑвеникÑÑ Ðµ nullptr, коеÑо пÑави Ð¶Ð¸Ð·Ð½ÐµÐ½Ð¸Ñ ÑикÑл ÑÑен. Compression и FontEmbedding Ñе Ð·Ð°Ð´Ð°Ð²Ð°Ñ Ð¿Ñеди BeginDoc: и двеÑе Ñа опÑии на ниво докÑменÑ, коиÑо HotPDF пÑилага пÑи оÑваÑÑне на докÑменÑа, и пÑиÑвоÑванеÑо им Ñлед Ñова нÑма еÑекÑ. TextOut пÑиема кооÑдинаÑи в пÑнкÑове (points), измеÑени Ð¾Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл на ÑÑÑаниÑаÑа, каÑо ÑÑойноÑÑÑа по оÑÑа Y Ñе ÑвелиÑава нагоÑе; кооÑдинаÑиÑе 72, 720 позиÑиониÑÐ°Ñ ÑекÑÑа близо до гоÑÐ½Ð¸Ñ Ð»Ñв ÑгÑл на ÑÑÑаниÑа Ñ ÑÐ°Ð·Ð¼ÐµÑ Letter и лÑво поле Ð¾Ñ ÐµÐ´Ð¸Ð½ инÑ. ÐзвикванеÑо на delete Pdf в блока __finally Ñе изпÑлнÑва незавиÑимо дали BeginDoc, ÑеÑÑанеÑо или EndDoc Ñа пÑедизвикали изклÑÑение.
ÐзбÑгвайÑе извикванеÑо на каквиÑо и да е меÑоди вÑÑÑ
Ñ Pdf Ñлед delete. Ðко ÑказаÑелÑÑ Ðµ запазен в Ñлен-пÑоменлива на клаÑа, задайÑе Ð¼Ñ ÑÑойноÑÑ nullptr веднага Ñлед изÑÑиванеÑо, Ñака Ñе вÑеки ÑлÑÑаен поÑÐ»ÐµÐ´Ð²Ð°Ñ Ð´Ð¾ÑÑÑп да пÑедизвика ÑÑен ÑÑив вмеÑÑо ÑкÑиÑа повÑеда на данни.
ÐонÑигÑÑиÑане на пÑоекÑа
C++Builder оÑкÑива THotPDF ÑÑез комбинаÑÐ¸Ñ Ð¾Ñ Ð¿ÑÑиÑа за вклÑÑване (include paths), пÑÑиÑа за библиоÑеки (library paths) и пÑагма диÑекÑива. ÐенеÑиÑаниÑÑ Ñ
едÑÑ Ñайл Ñе намиÑа до HPDFDoc.pas в диÑекÑоÑиÑÑа Ñ Ð¸Ð·Ñ
Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð´ на HotPDF; добавеÑе Ñази диÑекÑоÑÐ¸Ñ Ð² Project > Options > C++ Compiler > Include path. ÐиÑекÑиваÑа #pragma link "HPDFDoc" Ñказва на линкеÑа да вклÑÑи компилиÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð´Ñл, без да Ñе налага ÑÑÑноÑо Ð¼Ñ Ð¾Ð¿Ð¸Ñване в пÑоекÑÐ½Ð¸Ñ Ñайл. Ðко използваÑе пакеÑи за изпÑлнение (runtime packages) вмеÑÑо ÑÑаÑиÑно ÑвÑÑзване, пÑÑво инÑÑалиÑайÑе HotPDF пакеÑиÑе за дизайн и изпÑлнение; пÑагмаÑа пÑодÑлжава да е необÑ
одима.
ÐÑÑавеÑе имеÑо на модÑла HPDFDoc непÑоменено. C++Builder извлиÑа имеÑо на Ñ
едÑÑа Ð¾Ñ Ð¸Ð¼ÐµÑо на Pascal модÑла, Ñака Ñе пÑеименÑванеÑо на Ñайла или използванеÑо на пÑевдоним на пÑÑ Ð² пÑагмаÑа Ñе наÑÑÑи ÑÑÑÑенеÑо без никакво пÑедÑпÑеждение.
ÐÐ±Ñ Ð²Ð°Ñ Ð¸ задаÑи Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво докÑменÑи
Ðа еднокÑаÑен екÑпоÑÑ, задейÑÑван Ð¾Ñ Ð¿Ð¾ÑÑебиÑелÑко дейÑÑвие, локална пÑоменлива в обÑ
ваÑа на обÑабоÑÑика на бÑÑона е пÑавилноÑо ÑеÑение: ÑÑ Ñе ÑÑздава, използва и ÑниÑожава в ÑамкиÑе на един ÑÑейм на извикване (call frame) и намеÑениеÑо е оÑевидно за вÑеки, койÑо ÑеÑе кода по-кÑÑно. ÐлÑеÑнаÑиваÑа по вÑеме на дизайн (design-time) е опÑавдана, когаÑо ÑÑÑаÑа ÑоÑма ÑпÑавлÑва непÑекÑÑÐ½Ð°Ñ ÑабоÑен пÑоÑеÑ, каÑо напÑÐ¸Ð¼ÐµÑ Ð¿Ð°Ð½ÐµÐ» за пÑедваÑиÑелен пÑеглед на пеÑаÑа, койÑо вÑзÑÑановÑва докÑменÑа вÑеки пÑÑ, когаÑо поÑÑебиÑелÑÑ Ð¿Ñомени наÑÑÑойка; в Ñози ÑлÑÑай поддÑÑжанеÑо на компоненÑа жив и поÑледоваÑелноÑо извикване на BeginDoc/EndDoc е по-еÑекÑивно Ð¾Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑноÑо заделÑне и оÑвобождаване на обекÑи в Ñ
ийпа (heap).
ÐÑи пакеÑни задаÑи (batch jobs), коиÑо пÑÐ¾Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾ докÑменÑи поÑледоваÑелно, заделÑнеÑо на оÑделен Ð¾Ð±ÐµÐºÑ THotPDF за вÑеки докÑÐ¼ÐµÐ½Ñ Ñи ÑÑÑÑва допÑлниÑелниÑе ÑазÑ
оди за заделÑне на памеÑ. СÑÑÑоÑниеÑо не Ñе пÑенаÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð¾ÐºÑменÑиÑе, когаÑо нÑма Ð¾Ð±Ñ Ð¾Ð±ÐµÐºÑ, койÑо да го ÑÑÑ
ÑанÑва, коеÑо елиминиÑа ÑÑл ÐºÐ»Ð°Ñ Ð¾Ñ ÑпоÑадиÑни гÑеÑки, коиÑо инаÑе биÑ
а били ÑÑÑдни за дебÑгване. ÐаделÑне на памеÑ, генеÑиÑане, изÑÑиване, повÑоÑение.
Ðдно ÑвойÑÑво, коеÑо Ñе поÑвÑва в нÑколко демонÑÑÑаÑии на HotPDF, е AutoLaunch, коеÑо оÑваÑÑ Ð³ÐµÐ½ÐµÑиÑÐ°Ð½Ð¸Ñ Ñайл в ÑиÑÑемнаÑа пÑогÑама за пÑеглед на PDF веднага Ñлед EndDoc. То е полезно пÑи пиÑане на пÑÑвонаÑÐ°Ð»Ð½Ð¸Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð½Ð° оÑоÑмлениеÑо. РпÑоизводÑÑÐ²ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´ го избÑгвайÑе: оÑвоÑеÑе изÑиÑно пÑÑÑ ÐºÑм Ñайла, пÑовеÑеÑе дали Ñой ÑÑÑеÑÑвÑва и има ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð°Ð´ нÑлаÑа, логнеÑе ÑезÑлÑаÑа и оÑÑавеÑе извикваÑÐ¸Ñ Ð¿ÑоÑÐµÑ Ð´Ð° ÑеÑи дали е необÑ
одимо оÑваÑÑнеÑо мÑ. РпакеÑни задаÑи AutoLaunch Ñе оÑваÑÑ Ð¿Ð¾ един пÑозоÑÐµÑ Ð·Ð° пÑеглед за вÑеки докÑÐ¼ÐµÐ½Ñ Ð¸ на нÑкои ÑиÑÑеми може да блокиÑа пÑоÑеÑа, докаÑо поÑÑебиÑелÑÑ Ð½Ðµ ги заÑвоÑи.
ÐомпоненÑÑÑ THotPDF и вÑиÑки показани ÑÑк Ð¿Ð¾Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° ÑеÑÑане Ñа ÑаÑÑ Ð¾Ñ HotPDF Component за Delphi и C++Builder.