ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

margem inferior

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Dom Fev 16, 2014 11:20 pm    Assunto: margem inferior Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Fev 17, 2014 12:27 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Fev 17, 2014 12:35 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Seg Fev 17, 2014 11:38 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Fev 17, 2014 3:28 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Fev 17, 2014 4:02 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Qui Fev 20, 2014 1:44 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Fev 20, 2014 3:30 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB