Drukowanie

Adam Boduch

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

jeżeli chcecie drukować w milimetrach i na każdej drukarce tak samo zobacz komentarz na:
https://4programmers.net/Delphi/FAQ/Tekst/RichEdit/Drukowanie_z_marginesami

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?

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.

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

Całkiem w porządku. OK