ÐабоÑÑÑ Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸ (dataset) Ñе ÑÑÑÑои Ð¾Ñ Ñедове и колони, докаÑо PDF ÑÑÑаниÑаÑа е пÑазна кооÑдинаÑна мÑежа без никаква пÑедÑÑава за ÑÑÑ
. ÐÑеодолÑванеÑо на Ñази Ñазлика е оÑновнаÑа задаÑа ÑÑк. Ð HotPDF нÑма извикване Ð¾Ñ Ñипа DrawTable, коеÑо да пÑиема Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸ и да ви вÑÑÑа ÑоÑмаÑиÑана мÑежа. ÐмеÑÑо Ñова полÑÑаваÑе оÑновниÑе елеменÑи, Ð¾Ñ ÐºÐ¾Ð¸Ñо Ñе ÑÑÑÑои мÑежаÑа: TextOut за поÑÑавÑне на низ на опÑеделено мÑÑÑо, SetFont за Ð¸Ð·Ð±Ð¾Ñ Ð½Ð° ÑÑиÑÑ, Rectangle и Fill за оÑвеÑÑване на заден Ñон и MoveTo / LineTo / Stroke за изÑеÑÑаване на линии. СÑздаванеÑо на ÑабоÑÐµÑ Ð¼Ð¾Ð´Ñл за екÑпоÑÑиÑане на ÑаблиÑи е диÑÑиплина за пÑевÑÑÑане на миÑленеÑо за Ñедове и колони в ÑÑни X и Y кооÑдинаÑи и поддÑÑжанеÑо на Ñези кооÑдинаÑи ÑоÑни, когаÑо данниÑе пÑÐµÐ¼Ð¸Ð½Ð°Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÑай на ÑÑÑаниÑаÑа.
ÐÑимеÑÑÑ Ð¿Ð¾-Ð´Ð¾Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð²Ð° запиÑи на клиенÑи, но ниÑо в кода за изÑеÑÑаване не Ñе инÑеÑеÑÑва оÑкÑде Ð¸Ð´Ð²Ð°Ñ ÑедовеÑе. ÐÑигиналниÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ Ðµ използвал по-ÑÑаÑÐ¸Ñ TTable. ÐаÑвка Ñ FireDAC, Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸ в памеÑÑа (in-memory dataset) или обикновен маÑив Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи заÑ
ÑÐ°Ð½Ð²Ð°Ñ ÑÑÑиÑе ÑÑÑини без пÑомÑна. ÐажноÑо е да можеÑе да обÑ
ождаÑе данниÑе Ñед по Ñед и да ÑеÑеÑе ÑеÑиÑи ÑекÑÑови полеÑа Ð¾Ñ Ð²Ñеки Ð¾Ñ ÑÑÑ
. ÐÑÑжÑе визÑализаÑиÑÑа оÑделно Ð¾Ñ Ð¸Ð·ÑоÑника на данни и Ñе можеÑе да пÑоменÑÑе вÑÑка Ð¾Ñ ÑÑÑаниÑе, без да пÑеÑиÑе на дÑÑгаÑа.
ÐеомеÑÑиÑÑа на колониÑе е на пÑÑво мÑÑÑо
ÐÑеди да бÑде изÑеÑÑан доÑи един Ñимвол, опÑеделеÑе кÑде Ñе намиÑа вÑÑка колона. ÐаÑаÑа ÑаблиÑа има ÑеÑиÑи колони, Ñака Ñе Ñе нÑждае Ð¾Ñ ÑеÑиÑи леви гÑаниÑи и извеÑÑно дÑÑно поле. ХаÑд-кодиÑанеÑо на пÑоизволни ÑÑойноÑÑи (magic numbers) пÑи вÑÑко извикване на TextOut, какÑо Ñе пÑави в бÑÑзиÑе пÑимеÑи, е именно Ñова, коеÑо пÑави ÑазÑиÑÑванеÑо на ÑаблиÑаÑа много ÑÑÑдно на по-кÑÑен еÑап. ÐадайÑе гÑаниÑиÑе веднÑж в пÑнкÑове Ð¾Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл и вÑÑко извикване за изÑеÑÑаване Ñе Ñе оÑнаÑÑ ÐºÑм ÑÑÑ
по име:
const
ColNo = 70; // left edge of the "No." column
ColName = 110; // company name
ColAddr = 300; // street address
ColCity = 480; // city
RowLeft = 50; // table frame: left rule
RowRight = 570; // table frame: right rule
RowStep = 20; // vertical distance between baselines
procedure PrintRow(Page: THPDFPage; Y: Single;
const ANo, AName, AAddr, ACity: string; Shaded: boolean);
begin
if Shaded then
begin
// A shaded band behind the row. Rectangle takes X, Y, Width, Height.
Page.SetRGBFillColor($00FFF3DD);
Page.Rectangle(RowLeft, Y - 4, RowRight - RowLeft, RowStep);
Page.Fill;
Page.SetRGBFillColor(clBlack);
end;
Page.TextOut(ColNo, Y, 0, ANo);
Page.TextOut(ColName, Y, 0, AName);
Page.TextOut(ColAddr, Y, 0, AAddr);
Page.TextOut(ColCity, Y, 0, ACity);
end;
Ðва деÑайла Ñи плаÑÐ°Ñ ÑенаÑа ÑÑк. ÐÑÑво Ñе изÑеÑÑава оÑвеÑенаÑа ленÑа, а Ñлед Ñова ÑекÑÑÑÑ Ð²ÑÑÑ
Ñ Ð½ÐµÑ, ÑÑй каÑо ÑедÑÑ Ð½Ð° ÑиÑÑване опÑÐµÐ´ÐµÐ»Ñ Z-поÑÑдÑка (z-order) в PDF: ако оÑвеÑиÑе пÑавоÑгÑлника Ñлед ÑекÑÑа, Ñе ÑкÑиеÑе Ñеда. РедÑванеÑо на ÑоновиÑе ÑвеÑове не е пÑоÑÑо декоÑаÑиÑ. РподÑобен оÑÑÐµÑ Ñова е най-леÑниÑÑ Ð½Ð°Ñин да пÑедпазиÑе погледа Ð¾Ñ Ð¿ÑиплÑзване кÑм гÑеÑÐ½Ð¸Ñ Ñед, поÑади коеÑо ÑикÑлÑÑ Ð¿Ð¾-кÑÑно пÑевклÑÑва бÑлева ÑÑойноÑÑ Ð·Ð° вÑеки Ñед и Ñ Ð¿Ñедава диÑекÑно на паÑамеÑÑÑа Shaded.
ÐозиÑииÑе на колониÑе по-гоÑе Ñа ÑикÑиÑани, коеÑо е пÑавилно за оÑÑеÑ, ÑиÑÑо ÑÑ
ема конÑÑолиÑаÑе. ÐогаÑо данниÑе Ñа пÑоменливи, измеÑвайÑе ÑазмеÑиÑе, вмеÑÑо да гадаеÑе. HotPDF позволÑва измеÑване на ÑиÑинаÑа на ÑекÑÑа ÑÑез обекÑа на ÑÑÑаниÑаÑа, Ñака Ñе ÑеалнаÑа веÑÑÐ¸Ñ Ð½Ð° PrintRow може да вземе най-дÑлгаÑа оÑаквана ÑÑойноÑÑ Ð²Ñв вÑÑка колона, да Ñ Ð¸Ð·Ð¼ÐµÑи веднÑж пÑи избÑÐ°Ð½Ð¸Ñ ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð° ÑÑиÑÑа и да изÑиÑли левиÑе гÑаниÑи вÑз оÑнова на Ñези ÑиÑини плÑÑ ÑазÑÑоÑние за ÑазделиÑел (gutter). СÑÑÑкÑÑÑаÑа на подпÑогÑамаÑа не Ñе пÑÐ¾Ð¼ÐµÐ½Ñ â?пÑÐ¾Ð¼ÐµÐ½Ñ Ñе Ñамо изÑоÑникÑÑ Ð½Ð° конÑÑанÑиÑе.
ÐаглавнаÑа ÑаÑÑ, линииÑе и мÑÑÑоÑо за ÑпÑавлениеÑо им
ТаблиÑа, коÑÑо пÑодÑлжава на ÑледваÑаÑа ÑÑÑаниÑа без Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ñ Ð½Ð° колониÑе, е неÑеÑива. РеÑениеÑо е да ÑÑеÑиÑаÑе заглавнаÑа ÑаÑÑ (header) каÑо неÑо, коеÑо изÑеÑÑаваÑе оÑново, а не пÑоÑÑо веднÑж. ÐоÑÑавеÑе заглавиÑÑа на колониÑе и Ñ Ð¾ÑизонÑалниÑе линии, коиÑо ги ÑамкиÑаÑ, в една обÑа ÑÑÑина и Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð¹Ñе какÑо в наÑалоÑо, Ñака и вÑеки пÑÑ, когаÑо оÑваÑÑÑе нова ÑÑÑаниÑа. ТÑй каÑо заглавнаÑа ÑаÑÑ Ð¸ ÑÑлоÑо на ÑаблиÑаÑа ÑподелÑÑ ÐµÐ´Ð½Ð¸ и ÑÑÑи конÑÑанÑи за колониÑе, Ñе Ñе подÑавнÑÐ²Ð°Ñ Ð°Ð²ÑомаÑиÑно.
procedure DrawHeader(Page: THPDFPage; var Y: Single; PageNo: Integer);
begin
// Left: source label and page number. Right: generation time.
Page.SetFont('Arial', [fsItalic], 10);
Page.TextOut(RowLeft, Y, 0, 'customer.db Page ' + IntToStr(PageNo));
Page.TextOut(ColCity, Y, 0, DateTimeToStr(Now));
// Two horizontal rules that box the column titles.
Page.MoveTo(RowLeft, Y + 15);
Page.LineTo(RowRight, Y + 15);
Page.MoveTo(RowLeft, Y + 45);
Page.LineTo(RowRight, Y + 45);
Page.Stroke;
// The column titles, in a heavier face so they read as headings.
Page.SetFont('Times New Roman', [fsBold], 12);
Page.SetRGBFillColor(clNavy);
PrintRow(Page, Y + 25, 'No.', 'Company', 'Address', 'City', False);
Page.SetRGBFillColor(clBlack);
Y := Y + RowStep + 45; // advance past the boxed header before the first body row
end;
ÐбÑÑнеÑе внимание, Ñе DrawHeader пÑиема Y по ÑеÑеÑенÑÐ¸Ñ (var) и го пÑидвижва напÑед. ÐзвикваÑиÑÑ ÐºÐ¾Ð´ не ÑÑÑбва да помни колко е виÑока заглавнаÑа ÑаÑÑ; ÑÑÑинаÑа, коÑÑо Ñ Ð¸Ð·ÑеÑÑава, е Ñази, коÑÑо знае Ñова. Това пÑавило за ÑпÑавление Ð¾Ñ ÐµÐ´Ð½Ð¾ мÑÑÑо пÑедоÑвÑаÑÑва ÑазмеÑÑване на оÑоÑмлениеÑо, когаÑо по-кÑÑно добавиÑе лого или обобÑение на ÑилÑÑиÑе кÑм заглавнаÑа ленÑа. ЦикÑлÑÑ Ð·Ð° изÑеÑÑаване на ÑÑлоÑо на ÑаблиÑаÑа не Ñе опÑÐµÐ´ÐµÐ»Ñ Ð¾Ñ Ñова â?Ñой пÑоÑÑо пÑодÑлжава да Ð´Ð¾Ð±Ð°Ð²Ñ Ñедове оÑÑам, накÑдеÑо ÑоÑи Y в моменÑа.
ЦикÑлÑÑ Ð·Ð° Ð¾Ð±Ñ Ð¾Ð¶Ð´Ð°Ð½Ðµ ÑпÑавлÑва пÑенаÑÑнеÑо на ÑÑÑаниÑи
ÐзÑеÑÑаванеÑо е по-леÑнаÑа ÑаÑÑ. ÐлеменÑÑÑ, койÑо оÑлиÑава пÑоÑеÑÐ¸Ð¾Ð½Ð°Ð»Ð½Ð¸Ñ Ð¾ÑÑÐµÑ Ð¾Ñ Ð¾Ð±Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¿ÑимеÑ, е ÑÑÑаниÑиÑанеÑо: да знаеÑе дали ÑедÑÑ Ñе ÑÑбиÑа на ÑÑÑаниÑаÑа, пÑеди да го изÑеÑÑаеÑе, и да запоÑнеÑе нова ÑÑÑаниÑа Ñ Ð½Ð¾Ð²Ð° заглавна ÑаÑÑ, когаÑо Ñова не е Ñака. Това ÑеÑение Ñе взема на ÑоÑно едно мÑÑÑо: в ÑикÑла, койÑо Ð¾Ð±Ñ Ð¾Ð¶Ð´Ð° данниÑе, и никÑде дÑÑгаде.
var
Pdf: THotPDF;
Page: THPDFPage;
Y: Single;
PageNo: Integer;
Shaded: boolean;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'CustomerReport.pdf';
Pdf.BeginDoc;
Page := Pdf.CurrentPage;
// Report title, once, at the top of the first page.
Page.SetFont('Arial', [fsBold], 24);
Page.TextOut(200, 800, 0, 'Customer Report');
PageNo := 1;
Y := 760;
DrawHeader(Page, Y, PageNo);
Shaded := False;
CustomerTable.First;
while not CustomerTable.Eof do
begin
// Out of room? Open a new page and repeat the header there.
if Y < 60 then
begin
Pdf.AddPage;
Page := Pdf.CurrentPage; // AddPage moves CurrentPage forward
Inc(PageNo);
Y := 760;
DrawHeader(Page, Y, PageNo);
end;
Shaded := not Shaded;
Page.SetFont('Arial', [], 10); // SetFont must be reissued on every new page
PrintRow(Page, Y,
VarToStr(CustomerTable['CustNo']),
VarToStr(CustomerTable['Company']),
VarToStr(CustomerTable['Addr1']),
VarToStr(CustomerTable['City']),
Shaded);
Y := Y - RowStep;
CustomerTable.Next;
end;
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Ðва ÑакÑа за кооÑдинаÑнаÑа ÑиÑÑема ÑпÑавлÑÐ²Ð°Ñ ÑÐµÐ»Ð¸Ñ ÑикÑл. PDF измеÑва Y нагоÑе Ð¾Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл, Ñака Ñе ÑедовеÑе Ñе пÑÐ¸Ð´Ð²Ð¸Ð¶Ð²Ð°Ñ Ð½Ð°Ð´Ð¾Ð»Ñ Ð¿Ð¾ ÑÑÑаниÑаÑа ÑÑез изваждане на RowStep Ð¾Ñ Y вÑеки пÑÑ, а пÑовеÑкаÑа за запÑлнена ÑÑÑаниÑа Ñе задейÑÑва, когаÑо Y падне под долноÑо поле, а не над опÑеделен гоÑен лимиÑ. ÐбÑÑкайÑе поÑокаÑа и пÑÑвиÑÑ Ð²Ð¸ Ñед Ñе Ñе оÑпеÑаÑа извÑн Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÑай, докаÑо ÑикÑлÑÑ ÑмÑÑа, Ñе има доÑÑаÑÑÑно мÑÑÑо на ÑÑÑаниÑаÑа.
ÐÑÑгиÑÑ ÑÐ°ÐºÑ ÑеÑÑо Ñе пÑопÑÑка Ð¾Ñ ÑазÑабоÑÑиÑиÑе в наÑалоÑо. ÐеÑодÑÑ AddPage ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð½Ð¾Ð²Ð° ÑÑÑаниÑа и наÑоÑва CurrentPage кÑм неÑ, но не пÑенаÑÑ Ð½Ð¸Ñо: ниÑо ÑÑиÑÑа, ниÑо ÑвеÑа на запÑлване, ниÑо позиÑиÑÑа. ÐÑо заÑо Page Ñе ÑеÑе оÑново Ð¾Ñ CurrentPage Ñлед вÑÑко извикване на AddPage, и заÑо SetFont Ñе извиква оÑново пÑеди изÑеÑÑаванеÑо на ÑедовеÑе Ð¾Ñ ÑÑлоÑо. ÐÑопÑÑнеÑе повÑоÑноÑо ÑеÑене и Ñе пÑодÑлжиÑе да ÑиÑÑваÑе вÑÑÑ
Ñ Ð¿ÑедÑ
однаÑа ÑÑÑаниÑа. ÐÑопÑÑнеÑе ÑÑиÑÑа и новаÑа ÑÑÑаниÑа Ñе Ñе визÑализиÑа Ñ ÑÑиÑÑа по подÑазбиÑане на ÑÑоÑвеÑÐ½Ð¸Ñ ÑеÑеÑ.
СлÑÑаиÑе, коиÑо Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° повÑедÑÑ ÐµÐºÑпоÑÑиÑанеÑо на ÑаблиÑи
ÐовеÑеÑо гÑеÑки пÑи ÑаблиÑиÑе не Ñе поÑвÑÐ²Ð°Ñ Ð¿Ñи Ð¸Ð´ÐµÐ°Ð»Ð½Ð¸Ñ ÑÑенаÑий Ñ Ð½Ñколко деÑеÑки подÑедени Ñеда. Те Ñе пÑоÑвÑÐ²Ð°Ñ Ð² гÑаниÑниÑе ÑлÑÑаи, коиÑо Ñе ÑеÑÑÐ²Ð°Ñ Ð»ÐµÑно, ÑÑига да знаеÑе кÑде Ñе намиÑаÑ:
- ÐÑазни набоÑи Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸ (datasets). ЦикÑл Ñ Ð½Ñла Ñеда ÑÑздава ÑÑÑаниÑа ÑÑÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð° ÑаÑÑ Ð¸ ниÑо под неÑ, коеÑо изглежда планиÑано. ÐÑазна ÑÑÑаниÑа без заглавна ÑаÑÑ Ð¾Ð±Ð°Ñе изглежда каÑо гÑеÑка. ÐземеÑе ÑеÑение за Ñози ÑÑенаÑий, пÑеди да внедÑиÑе ÑоÑÑÑеÑа.
- РедÑÑ, койÑо Ñе позиÑиониÑа ÑоÑно на гÑаниÑаÑа. ÐенеÑиÑайÑе оÑÑеÑ, ÑийÑо поÑледен Ñед е Ñазположен една ÑÑÑпка над полеÑо, и дÑÑг оÑÑеÑ, ÑийÑо ÑÐ»ÐµÐ´Ð²Ð°Ñ Ñед е ÑÑÑпка под него. ÐÑеÑкиÑе Ñ Ñазлика Ð¾Ñ ÐµÐ´Ð¸Ð½ Ñед пÑи ÑÑÑаниÑиÑанеÑо оÑÑÐ°Ð²Ð°Ñ ÑкÑиÑи, докаÑо данниÑе не Ñе Ð¾ÐºÐ°Ð¶Ð°Ñ Ñ ÑоÑно Ð½ÐµÐ¿Ð¾Ð´Ñ Ð¾Ð´ÑÑа дÑлжина.
- ÐÑекалено дÑлги ÑÑойноÑÑи. Ðме на ÑиÑма, коеÑо е по-ÑиÑоко Ð¾Ñ ÐºÐ¾Ð»Ð¾Ð½Ð°Ñа Ñи, Ñе навлезе в ÑÑÑеднаÑа колона. ÐзмеÑеÑе полеÑо и вземеÑе ÑеÑение за поведениеÑо: пÑенаÑÑне на нов Ñед, изÑÑзване или ÑÑкÑаÑаване Ñ Ð¼Ð½Ð¾Ð³Ð¾ÑоÑие. ÐипÑаÑа на поведение не е ÑеÑение.
- ÐолеÑа ÑÑÑ ÑÑойноÑÑ Null. ЧеÑенеÑо на ÑÑойноÑÑ Null диÑекÑно в
TextOutможе да Ñе визÑализиÑа каÑо дÑмаÑаNullили каÑо пÑазно мÑÑÑо в завиÑимоÑÑ Ð¾Ñ Ð½Ð°Ñина на пÑеобÑазÑване. ÐзбеÑеÑе наÑина на изобÑазÑване ÑÑзнаÑелно, вмеÑÑо да оÑÑавÑÑе Ñова ÑеÑение на авÑомаÑиÑноÑо пÑеобÑазÑване на Ñипове (variant conversion).
ТеÑÑвайÑе ÑезÑлÑаÑа в повеÑе Ð¾Ñ ÐµÐ´Ð¸Ð½ ÑеÑÐµÑ Ð½Ð° PDF, пÑеди да завÑÑÑиÑе задаÑаÑа. ÐамÑнаÑа на ÑÑиÑÑове и изÑÑзванеÑо Ñе дÑÑÐ¶Ð°Ñ ÑазлиÑно пÑи ÑазлиÑниÑе ÑеÑÑи, Ñака Ñе ÑаблиÑа, коÑÑо изглежда добÑе в едно пÑиложение, може да покаже ÑазмеÑÑена колона или изÑÑзан ÑекÑÑ Ð² дÑÑго. УвеÑеÑе Ñе, Ñе повÑаÑÑÑаÑа Ñе заглавна ÑаÑÑ, ÑоновоÑо оÑвеÑÑване на ÑедовеÑе и полеÑаÑа Ñе Ð·Ð°Ð¿Ð°Ð·Ð²Ð°Ñ Ð¿Ñавилно, какÑо и Ñе номеÑаÑа на ÑÑÑаниÑиÑе оÑÑÐ°Ð²Ð°Ñ Ð½ÐµÐ¿ÑекÑÑнаÑи Ñлед пÑенаÑÑне на данниÑе.
Ð ÑÑноÑо изÑеÑÑаване на мÑежаÑа вмеÑÑо използванеÑо на визÑален Ð´Ð¸Ð·Ð°Ð¹Ð½ÐµÑ Ð½Ð° оÑÑеÑи изиÑква повеÑе код и компÑомиÑÑÑ ÑÑÑбва да Ñе назове ÑÑно: вие пÑиÑежаваÑе вÑÑка кооÑдинаÑа. Това е ÑоÑно Ñова, коеÑо иÑкаÑе за ÑÑÑвÑÑни пакеÑни задаÑи, ÑакÑÑÑи и оÑÑеÑи за одиÑ, коиÑо ÑÑÑбва да Ñе визÑализиÑÐ°Ñ ÐµÐ´Ð½Ð°ÐºÐ²Ð¾ на вÑÑка маÑина. Това е и допÑлниÑелно наÑоваÑване, коеÑо Ð±Ð¸Ñ Ñе пÑедпоÑели да избегнеÑе пÑи еднокÑаÑни вÑÑÑеÑни ÑпÑавки. ÐÑи пÑÑÐ²Ð¸Ñ ÑÑенаÑий обаÑе Ñози конÑÑол Ñе оÑплаÑа веднага Ñом оÑÑеÑÑÑ ÑÑÑбва да изглежда в пÑоизводÑÑвена ÑÑеда по ÑÑÑÐ¸Ñ Ð½Ð°Ñин, по койÑо е изглеждал на компÑÑÑÑа ви за ÑазÑабоÑка.
ÐинииÑе и оÑвеÑениÑе ленÑи по-гоÑе Ñе оÑÐ½Ð¾Ð²Ð°Ð²Ð°Ñ Ð½Ð° ÑÑÑиÑе векÑоÑни и ÑвеÑови елеменÑи, Ñазгледани в ÑÑководÑÑвоÑо за ÑеÑÑане вÑÑÑ
Ñ Ð¿Ð»Ð°Ñно, ако иÑкаÑе пÑÑво да Ñе запознаеÑе Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸ÑÑа на Rectangle, MoveTo и LineTo. ÐзползваниÑе ÑÑк елеменÑи за ÑеÑÑане Ñа ÑаÑÑ Ð¾Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа HotPDF за Delphi и C++Builder.