Programowanie w języku Delphi » Artykuły

Drukowanie

Drukowanie w Delphi wcale nie jest trudne. Trzeba tylko zrozumieć istotę działania niektórych funkcji. Istnieje sposób na proste drukowanie. Np. komponent RichEdit posiada funkcje "Print". Wystarczy ją wywołać, aby wydrukować dokument:

RichEdit.Print('Plik Readme.txt');


Możesz także skorzystać z pomocy innych edytorów. Oto przykład jak to zrobić:

uses ShellAPI;
 
ShellExecute(Handle, 'print', 'Plik.doc', nil, nil, SW_HIDE);


W tym wypadku wdrukowany zostanie plik "Plik.doc". Program najpierw odczyta jaki program skojarzony jest z rozszerzniem *.doc, a następnie użyje go do wydrukowania pliku. Dzięki parametrowi "SW_SHIDE" okno programu nie zostanie nawet pokazane! Jeżeli chcesz się dowiedzieć coś więcej na temat funkcji "ShellExecute" kliknij tutaj.

Na zakładce "Dialogs" znajdują się komponenty "PrintDialog" i "PrinterSetupDialog". Najpierw omówię pierwszy z nich.
Po umieszczeniu komponentu "PrintDialog" na formularzu ujrzysz w Inspektorze Obiektów takie oto pozycje:

Collate  -  jeżeli ta opcja ustawiona jest na True przy wielu kopiach wydruku najpierw drukowane są pierwsze strony w kilku kopiach. Jeżeli ta wartość ma "False" najpierw wydrukowane zostaną wszystkie strony pierwszej kopii, a dopiero później drugiej.

Copies  -   określa liczbę kopii wydruku.

FromPage  -  właściwość ta określa od której strony rozpocznie się proces drukowania.

PrintRage   -  określa, które przyciski są aktywne.

PrintToFile   -  określa, czy użytkownik wybrał opcje drukowania do pliku ( zapisywania ).

Options  -  tutaj znajdują się opcje określające wygląd i zachowanie komponentu.

Komponent "PrinterSetupDialogs" umożliwia ustawienie opcji wydruku przed rozpoczęciem drukowania. Okno ( komponent ) wywołuje się poprzez metodę EXecute - np:

PrinterSetupDialog.Execute;


Delphi udostępnia klasę "Printers". Wystarczy, że dodasz te słowo to listy "uses".

Aborted  -  Jeżeli ta wartość przybierze "True" do znaczy, że proces drukowania został przerwany.

Canvas  -  reprezentuje płótno drukarki. Można po nim rysować jak po zwykłym "Canvasie".

Copies   -   liczba kopii wydruku.

Fonts  -  lista czcionek reprezentowanych przez drukarkę.

Orientation  -  ta właściwość może przybrać wartości "poPortrait", "poLandscape".

PageHeight -  wysokość strony w pikselach.

PageNumber   -  numer aktualnie drukowanej strony.

Printing  -  jeżeli ta właściwość posiada wartość "True" to znaczy, że trwa proces drukowania.

Abort  -  użycie tej funkcji oznacza przerwanie procesu drukowania.

BeginDoc  -  rozpoczyna proces wydruku.

EndDoc - kończy proces wydruku.

Jeżeli chcesz np. wydrukować jakiś obrazek to piszesz:

var
  B : TBitmap;
begin
  B := TBitmap.Create;
  B.LoadFromFile('C:\\obrazek.bmp');
  Printer.BeginDoc;
  Printer.Canvas.Draw(20, 20, B);
  Printer.EndDoc;
  B.Free;
end;


Lepszym rozwiązaniem jednak będzie użycie funkcji "StretchDraw", gdyż umożliwia ona dopasowanie rozmiaru wydruku to rozmiarów drukarki.  

var
  R : TRect;
begin
// zaladuj obrazek
  Image1.Picture.LoadFromFile('e:\\mikolaj.bmp');
// pobierz jego wymiary
  Image1.Canvas.FillRect(R);
 
  Printer.BeginDoc;  // rozpocznij drukowanie
// umiesc obrazek
  Printer.Canvas.StretchDraw(R, Image1.Picture.Graphic);
// zakoncz
  Printer.EndDoc;
end;

5 komentarzy

Brak avatara
marcos 2014-02-27 11:11

a jak zrobić by wydrukować dwie różne bitmpy? jedna pod drugą na jednej kartce?

Pociech 2008-02-28 01:43

Gdy używamy Printer.Canvas współrzędne są podawane w pixelach(tak rozumiem), a więc na różnych drukarkach(różna wielkość dpi) różnie się to wydrukuje?

Misiekd 2005-12-05 21:57

zamiast Draw lub StretchDraw należało by wykorzystać StretchDIBits ponieważ ww nie zawsze chcą działać jak powinny a z StretchDIBits nie ma problemu.

adammaj 2005-08-15 13:57

a gdy chcę wydrukować bitmapę będącą w pamięci a nie wczytaną z pliku?
adam majewski

slave_k 2003-02-19 22:23

Całkiem w porządku. OK