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;
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