 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Dom Fev 16, 2014 11:20 pm Assunto: margem inferior |
|
|
ola pessoal estou usando este codigo abaixo para imprimir um memo esta funcionando porem gostaria de acrecentar um limite de margem em baixo da folha pois esta sendo escrito ate bem no fim da linha e fica ruim..
aqui esta o codigo Código: |
procedure ImprimirMemoComCanvas(Memo: TMemo);
const
cEspacoLinha = 5;
cMargemSuperior = 200;
cMargemEsquerda = 260;
var
AlturaLinha, Y, I: integer;
begin
Printer.BeginDoc;
try
{ Usa na impressora a mesma fonte do memo }
Printer.Canvas.Font.Assign(Memo.Font);
AlturaLinha := Printer.Canvas.TextHeight('Tg');
Y := cMargemSuperior;
for I := 0 to Memo.Lines.Count -1 do begin
if Y > Printer.PageHeight then begin
Printer.NewPage;
Y := cMargemSuperior;
// showmessage(inttostr(printer.PAgeheight))
end;
Printer.Canvas.TextOut(cMargemEsquerda, Y, Memo.Lines[I]);
Y := Y + AlturaLinha + cEspacoLinha;
end;
finally
Printer.EndDoc;
end;
end; |
|
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Fev 17, 2014 12:27 am Assunto: |
|
|
basta usar a margem inferior no "if Y > ...."
Código: |
procedure ImprimirMemoComCanvas(Memo: TMemo);
const
cEspacoLinha = 5;
cMargemSuperior = 200;
cMargemInferior = 200; // <- aqui voce diz quanto quer para margem inferior
cMargemEsquerda = 260;
var
AlturaLinha, Y, I: integer;
begin
Printer.BeginDoc;
try
{ Usa na impressora a mesma fonte do memo }
Printer.Canvas.Font.Assign(Memo.Font);
AlturaLinha := Printer.Canvas.TextHeight('Tg');
Y := cMargemSuperior;
for I := 0 to Memo.Lines.Count -1 do begin
if Y > (Printer.PageHeight-cMargemInferior) then begin //<- veja que a margem inferior é abatida do PageHeight
Printer.NewPage;
Y := cMargemSuperior;
// showmessage(inttostr(printer.PAgeheight))
end;
Printer.Canvas.TextOut(cMargemEsquerda, Y, Memo.Lines[I]);
Y := Y + AlturaLinha + cEspacoLinha;
end;
finally
Printer.EndDoc;
end;
end;
|
Bem simples não? Espero ter ajudado. |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Fev 17, 2014 12:35 am Assunto: |
|
|
Recomendo usar margem direita para que o texto não saia da pagina, caso o mesmo seja comprido demais para a pagina. |
|
Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Seg Fev 17, 2014 11:38 am Assunto: |
|
|
strak2012 escreveu: | Recomendo usar margem direita para que o texto não saia da pagina, caso o mesmo seja comprido demais para a pagina. |
ok.. certinho vlw pela ajuda.. mas como eu coloco a margem direita.. nao sei muito isso nao..? |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Fev 17, 2014 3:28 pm Assunto: |
|
|
Tem duas forma de ser feita e as duas trata de dividir o texto lido no Memo.lines[x] em duas ou mais linha se necessario.
Esta divisão pode se dá de duas forma você pode optar em que a impresão divida palavra ao meio ou como a palavra "casa" onde "ca" pode ficar numa linha e "sa" ficar na outra ou como pode optar em deixar a palavra "casa" inteira na segunda linha que é a que mais gosto, nunca gostei mesmo de dividir palavra ao meio, assim sendo vou mostrar como ficaria a impresão respeitando a margem direita sem dividir palavra ao meio.
Código: |
procedure ImprimirMemoComCanvas(Memo: TMemo);
const
cEspacoLinha = 5;
cMargemSuperior = 200;
cMargemInferior = 200; // <- aqui voce diz quanto quer para margem inferior
cMargemEsquerda = 260;
cMargemDireita = 260; // <- aqui voce diz quanto quer para margem direita
var
AlturaLinha, Y, I: integer;
PW, PH, TW: integer; // PageWidth, PageHeight, textoWidth
Lin, LinI, palavra: string; // LinhaLida, LinhaImpresa
Tok: boolean; // linha pronta a ser impresa
procedure NovaPagina;
{ procedure nova pagina encapsulada }
begin
if Y > Printer.PageHeight - cMargemInferior then // <- veja que a margem inferior é abatida do PageHeight
begin
Printer.NewPage;
Y := cMargemSuperior;
// showmessage(inttostr(printer.PAgeheight))
end;
end;
procedure Imprima(texto: string);
{ procedure para imprimir texto encapsulada }
begin
NovaPagina;
Printer.Canvas.TextOut(cMargemEsquerda, Y, texto);
Y := Y + AlturaLinha + cEspacoLinha;
end;
begin
Printer.BeginDoc;
try
{ Usa na impressora a mesma fonte do memo }
Printer.Canvas.Font.Assign(Memo.Font);
AlturaLinha := Printer.Canvas.TextHeight('Tg');
PW := Printer.PageWidth;
PH := Printer.PageHeight;
Y := cMargemSuperior;
for I := 0 to Memo.Lines.Count - 1 do
begin
Lin := Memo.Lines[I]; // LinhaLida
TW := cMargemEsquerda + Printer.Canvas.TextWidth(Lin); // TextoWidth
if TW > PW - cMargemDireita then // verifica se o texto lido é maior que a pagina
begin
repeat
LinI := '';
Tok := false;
repeat
if pos(' ', Lin) <> 0 then // presença do espaço no texto lido
begin
palavra := copy(Lin, 1, pos(' ', Lin));
TW := cMargemEsquerda + Printer.Canvas.TextWidth(LinI + palavra);
if (TW <= PW - cMargemDireita) then // se texto cabe na pagina
begin
LinI := LinI + palavra;
delete(Lin, 1, pos(' ', Lin));
end
else
Tok := true;
end
else
begin // ausencia de espaço no texto lido
palavra := Lin;
TW := cMargemEsquerda + Printer.Canvas.TextWidth(LinI + palavra);
if (TW <= PW - cMargemDireita) then // se texto cabe na pagina
begin
LinI := LinI + palavra;
Lin := '';
end
else
Tok := true;
end;
until Tok or (Lin = '');
Imprima(LinI); // linha impressa será diferente da lida pois não cabe na pagina a linha completa, restante da linha será impressa numa linha seguinte.
until Lin = '';
end
else // se texto lido menor que a pagina então imprima normal
Imprima(Lin); // linha impressa será a mesma que foi lida uma vez que cabe na pagina
end;
finally
Printer.EndDoc;
end;
end;
|
abreviei alguns nome de variável pq não gosto de escrever muito mas podes alterar como queira deixei comentando os nome das mesma.
Encapsulei as procedures NovaPagina e Imprima, se não gostar desta forma lhe mostro como faze-la sem encapsula-la.
Os dois repeat são para dividir o texto lido em duas ou mais linhas faz necessário o uso deles.
Experimente digitar uma linha muito comprida e imprima com esta rotina vai ver que uma margem direita será respeitada e mais de uma linha será impressa ainda que no memo só haja uma.
Espero que goste. |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Fev 17, 2014 4:02 pm Assunto: |
|
|
A rotina passada a pouco só possui um pormenor a palavra nunca pode possuir um tamanho maior que a pagina caso contrario entra em loop infinito travando a aplicação, neste caso a divisão da palavra faz se necessário. |
|
Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Qui Fev 20, 2014 1:44 pm Assunto: |
|
|
strak2012 escreveu: | A rotina passada a pouco só possui um pormenor a palavra nunca pode possuir um tamanho maior que a pagina caso contrario entra em loop infinito travando a aplicação, neste caso a divisão da palavra faz se necessário. |
Entendi..
mas mesmo assim .. esta entrando em loop..mesmo a palavra nao sendo muito grande...
tem algum problema..ele fica adicionando para a impressora e percebo que o documento fica aumentando cada vez mais...preciso assim finalizar o programa |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Fev 20, 2014 3:30 pm Assunto: |
|
|
realizei alguns testes aqui e imprime corretamente, contudo resolvi revisar o código e coloquei uns trim tentar inibir possível loop em linha que só apresenta um espaço em seu conteúdo como por exemplo uma linha que só possuía isso " " como conteúdo.
segue a rotina
Código: |
procedure ImprimirMemoComCanvas(Memo: TMemo);
const
cEspacoLinha = 5;
cMargemSuperior = 200;
cMargemInferior = 200; // <- aqui voce diz quanto quer para margem inferior
cMargemEsquerda = 260;
cMargemDireita = 260; // <- aqui voce diz quanto quer para margem direita
var
AlturaLinha, Y, I: integer;
PW, PH, TW: integer; // PageWidth, PageHeight, textoWidth
Lin, LinI, palavra: string; // LinhaLida, LinhaImpresa
Tok: boolean; // linha pronta a ser impresa
procedure NovaPagina;
{ procedure nova pagina encapsulada }
begin
if Y > printer.PageHeight - cMargemInferior then
// <- veja que a margem inferior é abatida do PageHeight
begin
printer.NewPage;
Y := cMargemSuperior;
// showmessage(inttostr(printer.PAgeheight))
end;
end;
procedure Imprima(texto: string);
{ procedure para imprimir texto encapsulada }
begin
NovaPagina;
printer.Canvas.TextOut(cMargemEsquerda, Y, texto);
Y := Y + AlturaLinha + cEspacoLinha;
end;
begin
printer.BeginDoc;
try
{ Usa na impressora a mesma fonte do memo }
printer.Canvas.Font.Assign(Memo.Font);
AlturaLinha := printer.Canvas.TextHeight('Tg');
PW := printer.PageWidth;
PH := printer.PageHeight;
Y := cMargemSuperior;
for I := 0 to Memo.Lines.Count - 1 do
begin
Lin := Memo.Lines[I]; // LinhaLida
TW := cMargemEsquerda + printer.Canvas.TextWidth(Lin); // TextoWidth
if TW > PW - cMargemDireita then // verifica se o texto lido é maior que a pagina
begin
repeat
LinI := '';
Tok := false;
repeat
if (pos(' ', Lin) <> 0) and (trim(Lin) <> '') then // presença do espaço no texto lido
begin
palavra := copy(Lin, 1, pos(' ', Lin));
TW := cMargemEsquerda + printer.Canvas.TextWidth(LinI + palavra);
if (TW <= PW - cMargemDireita) then // se texto cabe na pagina
begin
LinI := LinI + palavra;
delete(Lin, 1, pos(' ', Lin));
end
else
Tok := true;
end
else
begin // ausencia de espaço no texto lido
palavra := Lin;
TW := cMargemEsquerda + printer.Canvas.TextWidth(LinI + palavra);
if (TW <= PW - cMargemDireita) then // se texto cabe na pagina
begin
LinI := LinI + palavra;
Lin := '';
end
else
Tok := true;
end;
until Tok or (trim(Lin) = '');
Imprima(LinI); // linha impressa será diferente da lida pois não cabe na pagina a linha completa, restante da linha será impressa numa linha seguinte.
until Lin = '';
end
else // se texto lido menor que a pagina então imprima normal
Imprima(Lin); // linha impressa será a mesma que foi lida uma vez que cabe na pagina
end;
finally
printer.EndDoc;
end;
end;
|
Testei antes e já funcionava e este testei e tb vejo que funciona. O problema com palavra grande demais ainda existe. |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|