Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 11 de Julho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
256 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Dicas]  Justifica Texto
Publicado por ActiveDelphi : Terça, Junho 17, 2008 - 11:49 GMT-3 (1401 leituras)
Comentários comentar   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Esta dica apresenta uma função capaz de justificar um texto de acordo com uma quantidade limitada de caracteres por linha.

A dica se aplica quando se usa uma fonte VGA, ou seja, uma fonte onde cada caractere ocupa o mesmo espaço, como "Courier" e "MS Serif".

Segue abaixo a função:

function Justifica(const texto: TStringList; Colunas: integer): TStringList;
var
  Tamanho, x, y, z: Integer;
  Lista: TStringList;
  LinhaCompleta, Inicio, Resto: String;
begin
  Lista := TStringList.Create;
  for x := 0 to Texto.Count - 1 do
  begin
    // Substitui tab por tres espaços
    while Pos(''#9'', Texto.Strings[x]) > 0 do
      Texto.Strings[x] := Copy(Texto.Strings[x], 1,
        Pos(''#9'', Texto.Strings[x]) - 1) +
        ' ' + Copy(Texto.Strings[x], Pos(''#9'', Texto.Strings[x]) + 1,
        Length(Texto.Strings[x]));
    // a última coluna é um espaço
    if Length(TrimRight(Texto.Strings[x])) <= Colunas then
      Lista.Add(TrimRight(Texto.Strings[x]))
    else
    begin
      if Copy(Texto.Strings[x], 1, Colunas + 1) = ' ' then
        Lista.Add(Copy(Texto.Strings[x], 1, Colunas))
      else
      begin
        LinhaCompleta := Texto.Strings[x];
        y := Colunas;
        while (LinhaCompleta <> '') do
        begin
          for y := Colunas downto 1 do
          begin
            Inicio := Copy(LinhaCompleta, 1, y);
            Resto := Copy(LinhaCompleta, y + 1, Length(LinhaCompleta));
            if (Inicio= '') then
              break
            else if Length(TrimRight(LinhaCompleta)) <= Colunas then
            begin
              Lista.Add(TrimRight(Inicio));
              LinhaCompleta := '';
              break;
            end
            else if (Inicio[y] = ' ') then
            begin
              if Inicio <> '' then
              begin
                Inicio := TrimRight(Inicio);
                // justifica o texto
                while Length(Inicio) < Colunas do
                begin
                  if Inicio = '' then
                    break;
                  Tamanho := Length(Inicio);
                  for z := Tamanho downto 1 do
                  begin
                    if inicio[z] = ' ' then
                    begin
                      Inicio := (Copy(Inicio, 1, z) + ' ' +
                         Copy(Inicio, z + 1, Length(Inicio)));
                      if (Length(Inicio) = Colunas) then
                        break;
                    end
                    else if (Pos(' ', Inicio) = 0)then
                    begin
                      Lista.Add(TrimRight(Inicio));
                      Inicio := '';
                      break;
                    end;
                  end;
                end;
                Lista.Add(TrimRight(Inicio));
                LinhaCompleta := Resto;
                break;
              end
              else
                Break;
            end;
          end;
          if LinhaCompleta <> Resto then
            LinhaCompleta := Resto;
        end;
      end;
    end;
  end;
  Result := Lista;
end;

Para testar, adicione 2 Memos e um Button. Em ambos os Memos, desative a propriedade WordWrap, para que ele não quebre as linhas automaticamente. Em seguida, no evento onClick do Button, faça:

  Memo2.Lines := Justifica(TStringList(Memo1.Lines), 48);

Segue abaixo um exemplo de como fica o resultado.


Figura 1 - Exemplo de resultado da função

Até mais!

Por: michelle_araujo
Contato: michelle_araujo@click21.com.br



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados