Apesar de que ser possível realizar estas tarefas usando geradores de relatórios como QuickReport ou outros, é mais interessante fazê-lo diretamente no canvas da impressora, especialmente se você for utilizar uma impressora matricial (caso bastante freqüente). É claro que isso irá requerer um esforço inicial maior para se obter o resultado desejado.
Todos os comando utilizados são do Delphi 1, mas não deve variar muito para passá-lo para outras versões.
Tamanho de página
Uma das primeiras questões a se considerar é a necessidade de assegurar que o tamanho estabelecido da página, não sendo o padrão, corresponde ao que vamos usar.
Para isso, vamos usar a classe TdevMode, que permite modificar todos os parâmetros da impressão: Tamanho de página, orientação e etc.
É importante que se defina um tamanho de página que não coincida com o padrões, temos que estabelecer o tamanho (size) em User Defined, e mesmo que se deixe em qualquer outro tipo, este prevalecerá sobre as medidas que se use em Length e Width.
O procedimento que se pode usar para isso é:
procedure TfrmFacturas.SetPaperSize (Size : Integer);
{aqui se define o tamanho do papel}
var
ADevice, ADriver, APort : array [0..255] of Char;
ADeviceMode : THandle;
DevMode : PDevMode;
begin
with Printer do
begin
GetPrinter (ADevice, ADriver, APort, ADeviceMode);
SetPrinter (ADevice, ADriver, APort, 0);
GetPrinter (ADevice, ADriver, APort, ADeviceMode);
DevMode := GlobalLock(ADeviceMode);
if not Assigned(DevMode) then
ShowMessage('Coloque aqui sua mensagem -> if not Assigned(DevMode) ...')
else
begin
with DevMode^ do
begin
dmPaperSize:= DMPAPER_User;
dmPaperLength := Size;
dmPaperWidth:= 3000;
dmFields := dmFields or DM_PAPERSIZE or DM_PAPERLength or DM_PAPERWidth;
end;
GlobalUnLock(ADeviceMode);
SetPrinter(ADevice, ADriver, APort, ADeviceMode);
end;
end;
end;
Para alterar outros parâmetros, basta incluir um novo abaixo do dmPaperWidth e incluí-lo no OR do dmFields
Tipo de letra
A seguinte questão é escolher o tipo de letra que vamos usar para imprimir. De início, o melhor e estabelecer a impressora com o driver que mais adequado, e não optar pelo Somente Texto/Genérico, por que é o que mesmos opções oferece. O mais ideal é que se disponha do próprio driver da impressora.
Uma vez tendo escolhido o driver, haverá várias fontes de impressora disponíveis (identificados pelo icone da impressora), e que serão as mais convenientes, por que com elas a impressora alcança maior velocidade.
Usando o driver da impressora, em teoria, é possível combinar gráficos e linhas com o texto.
Impressão dos textos
Para impressão do texto no papel, é conveniente definir as coordenadas em mm (0,01mm)
Para isso, usa-se a função SetMapMode:
SetMapMode(Printer.Handle,MM_LoMetric);
Obs: Deve-se inserir esta linha após o Printer.BeginDoc, e quando houver um salto de página (Printer.NewPage), tem que voltar a definí-lo.
Aspectos a destacar: A origem situa-se na parte superior esquerda do papel, por isso que todas as coordenadas Y são negativas por estar situadas abaixo da origem. Portanto, esta origem (0,0) está referindo não início da página, mas sim o início da área de impressão, e portanto será diferente em cada impressora.
Para imprimir use:
Printer.Canvas.TextOut( 5, 5, 'Olá Mundo')