Listing 16.1. DemoPrint loyihasining listingi.
unit DemoPrint;
unit Printp;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Printers;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
RadioGroup1: TRadioGroup;
16.1-rasm. DemoPrint loyihasining bosh oynasi
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var f, printtxt: textfile; S : string;
begin
if RadioGroup1.ItemIndex q 0
then Memo1.Lines.LoadFromFile(edit1.text)
else begin
AssignFile(f, edit1.text);
AssignPrn(PrintTxt);
Reset(F);
Rewrite(PrintTxt);
while Not EOF(f) do
begin Readln(f, s);
Writeln(printtxt, s)
end;
CloseFile(f);
CloseFile(PrintTxt);
RadioGroup1.ItemIndex:= 0;
end;
end;
end.
Ushbu listing hech bir izohga muhtoj emas. Faqat shuni aytish mumkinki, listingdagi
RadioGroup1.Itemlndex:= 0;
ko`rsatmasi ma`lumotlar printer orqali chop qilingandan so`ng, printerni uzib qo`yadi.
Ma`lumotlarni chop qilish jarayonida quyidagi boshqaruvchi belgilardan foydalanish mumkin:
#9 — tabulyatsiya; # 10 —yangi satr;
#13 — ENTER tugmasi; ^L — yangi sahifa.
Masalan:
Write(FPrint, 'Shu satrdan so`ng yangi satrga o`tiladi', #10, #13);
Writeln (FPrint, 'Bu sahifa ohiriga aylantiriladi', ^L);
Matnli fayllarni chop qilishda to`g’ridan-to`g’ri 10 o`lchamli System shrifti o`rnatiladi. ehtiyojga ko`ra bu shrift va o`lchamlarni o`zgartirish mumkin. Buning uchun Printer ob’yektining Canvas hususiyatidan foydalaniladi. Quyidagi namunaga e`tibor bering:
with Printer.Canvas.Font do
begin
Name := 'Times Neww Roman';
Size := 12;
end;
17.3. Tasvirlarni chop qilish
Tasvirlarni chop qilishda Tprinter klassidagi TCanvas ob’yektining Canvas hususiyatlaridan foydalaniladi. Bu kanva turli tasviriy hamda rastrli grafik elementlarini tasvirlash uchun yetarlicha imkoniyatlarga ega.
Tasvirlarni kanvadan printerga uzatish jarayonining o`ziga hos tomonlari foydalanuvchilar ko`zidan yashirib qo`yilgan.
Tasvirlarni chop qilish uchun quyidagi amallar ketma-ketligini bajarish lozim:
- Chop qilish jarayoni BeginDoc metodi yordamida boshlanadi;
- Tasvir hosil qilinadi va maxsus metodlar yordamida printerga jo`natiladi;
- Chop qilish jarayoni EndDoc metodi yordamida yakundlanadi.
Printerning kanvasiga murojaat qilish chop qilish jarayoni boshlangandan so’ng bajarilishiga e`tibor bering. Aks holda bajarish vaqtidagi hatolik yuz beradi.
Chop qilingan ma`lumot va uning ekrandagi ko’rinishi printerning parametrlariga bog’liq bladi. SHuning uchun iloji boricha chop qilish jarayonini boshlashdan avval tasvirlarning o’lchamlarini aniqlash va zarur bo’lsa masshtablashtirish ishlarini bajarish lozim. Masshtablashtirish amali faqat katta tasvirlar uchungina emas, balki kichik rasmlarni qog’oz o’lchamlarini hisobga olgan holda kattalashtirishda ham qllanadi. Qog’oz o’lchamlarini Tprinter klassining PageHeight va PageWidth hususiyatlari yordamida aniqlash mumkin. Bundan tashqari, tasvirning ekran va qog’oz-dagi ko’rinishi printer va ekranning ruhsat etilgan imkoniyatlariga qarab, sifat jihatidan katta farq qilishi mumkin. Printerning joriy imkoniyatlarini Windows API GetDeviceCaps funksiyasi yordamida aniqlash mumkin. U masshtabning bir dyuym masofaga tog’ri keladigan gorizontal va vertikal yo’nalishlardagi nuqtalar sonidan iborat qiymatlarni qabul qiladi.
17.4. Rastrli tasvirlarni chop qilish
Ilovalarda TImage komponentasi yoki TBitMap tipidagi ob’yektlar-dan foydalanish qulay hisoblanadi. Rastrli tasvirlarni chop qilish uchun ularni TBitMap klassidagi ekzemplyarga yuklash va tasvirni maxsus metodlar yordamida printer kanvasiga jo`natish lozim. Tprinter klassi uni chop qilinishini ta`minlaydi. Masalan, sahifa markazida masshtabni o`zgartirmay turib chop qilish quyidagicha amalga oshirilishi mumkin.
Procedure TForml.ButtonlClick(Sender: TObject);
begin
with Printer, Imagel do
begin
if (Picture.Width > PageWidth) or (Picture.Height > PageHeight)
then begin
ShowMessage('Tasvir o`lchamlari sahifadan katta ');
Exit;
end;
BeginDoc;
Canvas.Draw((PageWidth - Picture.Width) div 2,(PageHeight –
Picture.Height) div 2, Picture.Bitmap);
EndDoc;
end; end;
Agar tasvir qog’ozdan kichik bo`lsa, Canvas.Draw metodi uni sahifa o`rtasiga chiqarilishini ta`minlaydi.
Noproportsional masshtablashtirish amalini sahifa o`lchamlarini hisobga olgan holda quyidagicha bajarish mumkin:
procedure TFormI.ButtonlClick(Sender: TObject);
var ImageRect: TRect;
begin
with Printer, Imagel do begin
ImageRect.Top :=0;
ImageRect.Left := 0;
ImageRect.Right := PageWidth;
ImageRect.Bottom := PageHeight;
BeginDoc;
Canvas.StretchDraw(ImageRect, Picture.Bitmap);
EndDoc;
end;
end;
Bu holda masshtablashtirish bo`yicha barcha ishlarni kanvaning StretchDraw metodi bajaradi. U tasvir o`lchamlarini ImageRect to`rtburchak o`lchamlariga mos ravishda o`zgartiradi.
Proportsional masshtablashtirish masalasi to`rtburchak o`lchamlarini hisobga olgan holda elementar hisob ishlari orqali hal qilinadi.
17.5. Sodda tasvirlarni chop qilish
Ixtiyoriy grafik figura va matnlarni tasviriy element sifatida rastrli tasvirlarni yaratmay turib ham Printer ob’yektining Canvas hususiyatlaridan foydalanib chop qilish mumkin.
procedure Tform1.Button1Click(Sender: TObject);
var R: TRect;
P: TPoint;
begin
Printer.BeginDoc;
with Printer.Canvas do begin
Pen.Color := clBlack;
Brush.Color := clBlue;
Brush.Style := bsCross;
Font.Size := 14;
R := Rect( 10, 10, 160, 160);
Ellipse(R.Left, R.Top, R.Right, R.Bottom);
P := Point(60, 180);
TextOut (P.X, P.Y, 'Ellips');
end;
Printer.EndDoc;
end;
Ushbu kod ostiga “Ellips” so`zi yozilgan aylana tasvirini chizadi. Bu holda matnni grafik vositalardan foydalanib chop qilinmoqda.
TPrinter klassining Canvas hususiyati yana bir qiziq imkoniyatni taklif qiladi: forma kanvasidagi tasvirli va matnli ma`lumotlarni ortiqcha qiyinchiliklarsiz chop qilish mumkin. Faraz qilaylik, forma kanvasida biror geometrik tasvir yaratilgan bo`lsin.
16.2-rasm. Forma kanvasidagi geometrik tasvir
Uni yasashda TCanvas klassining hususiyat va metodlaridan foydalanish mumkin. DemoPrintCanvas ilovasida 16.2-rasmni hosil qilishda OnPaint metodidan foylanilgan. Bu tasvirni chop qilish uchun forma kanvasidan kerakli o`lchamdagi to`g’ri to`rtburchak ajratib olinadi va uni printer kanvasiga uzatiladi. 16.2-listingda bu vazifani printBtnclick metodida CopyRect metodi yordamida amalga oshirilgan.
Listing 16.2. DemoPrintCanvas loyihasining bosh forma- sining implementation sektsiyasi
implementation
{$R *.DFM)
uses Printers;
procedure TMainForm.FormPaint(Sender: TObject);
begin with Canvas do begin
Pen.Color:= clBlack; Pen.Width:= 2;
Brush.Color := clWhite; Brush.Style := bsClear;
Font.Size := 14;
Ellipse(10, 10, 160, 160 );
Brush.Color := clRed;
Ellipse(60, 60, 110, 110);
Brush.Color := clBlue; Brush.Style := bsFDiagonal;
Ellipse( 17, 35, 153, 75);
Brush.Color := clBlue; Brush.Style := bsBDiagonal;
Ellipse(16, 85, 154, 135);
TextOut(50, 180, 'Ellips');
end;
end;
procedure TMainForm.PrintBtnClick(Sender: TObject);
var ImageRect: TRect;
begin
ImageRect := Rect(10, 10, 160 , 200);
with Printer do begin
BeginDoc;
Canvas.CopyRect(ImageRect, MainForm.Canvas, ImageRect);
EndDoc;
end;
end; end.
17.6. Chop qilishdagi hatoliklarni nazorat qilish
Ilovalarning printer bilan ishlashdagi ishonchliligini oshirish uchun Exception bazaviy klassidan kelib chiqadigan EPrinter klassidan foyda-lanish mumkin. U standart usulda try ... except blogi orasida ko`rsatiladi:
with Printer do try
BeginDoc;
Canvas.TextOut(100, 100, 'DELPHI tili’ );
EndDoc;
except
on E: EPrinter do ShowMessage('chop qilishdagi hatolik');
end;
Do'stlaringiz bilan baham: |