Um conjunto de dados é formado por linhas e colunas; uma página PDF é uma grelha de coordenadas em branco que não possui a noção de nenhuma das duas. Fazer a ponte desse fosso é todo o trabalho que temos aqui. Não existe nenhuma chamada DrawTable no HotPDF que pegue num conjunto de dados e lhe entregue uma grelha formatada. Em vez disso, o que obtém são os elementos primitivos dos quais uma grelha é composta: TextOut para colocar uma string num ponto, SetFont para escolher a fonte, Rectangle e Fill para sombrear uma faixa e MoveTo / LineTo / Stroke para desenhar linhas de delimitação. Um exportador de tabelas funcional exige a disciplina de traduzir a mentalidade de linhas e colunas para coordenadas x e y explícitas, e depois manter essas coordenadas corretas quando os dados ultrapassarem o limite inferior da página
O exemplo que se segue exibe registos de clientes, mas nada no código de desenho sabe ou quer saber de onde provêm as linhas. O original utilizava um TTable antigo; uma query FireDAC, um conjunto de dados em memória ou uma simples matriz de registos alimenta as mesmas rotinas de forma inalterada. O que importa é que consiga percorrer os dados uma linha de cada vez e ler quatro campos de texto a partir de cada um. Mantenha a renderização separada da fonte de dados e poderá alterar qualquer um dos lados sem perturbar o outro
A geometria da coluna vem primeiro
Antes que um único carácter seja desenhado, decida onde fica cada coluna. Uma tabela tem aqui quatro colunas, logo necessita de quatro margens esquerdas e uma margem direita conhecida. Codificar de forma rígida um número mágico em todas as chamadas TextOut, tal como as amostras rápidas tendem a fazer, é exatamente o que torna doloroso alargar uma tabela mais tarde. Nomeie os limites de margem apenas uma vez, em pontos a partir da origem no canto inferior esquerdo, e todas as chamadas de desenho recorrerão a eles pelo nome:
const
ColNo = 70; // margem esquerda da coluna "No."
ColName = 110; // nome da empresa
ColAddr = 300; // morada (rua)
ColCity = 480; // cidade
RowLeft = 50; // moldura da tabela: delimitador esquerdo
RowRight = 570; // moldura da tabela: delimitador direito
RowStep = 20; // distância vertical entre linhas de base
procedure PrintRow(Page: THPDFPage; Y: Single;
const ANo, AName, AAddr, ACity: string; Shaded: boolean);
begin
if Shaded then
begin
// Uma banda sombreada atrás da linha. Rectangle recebe X, Y, Largura, Altura.
Page.SetRGBFillColor($00FFF3DD);
Page.Rectangle(RowLeft, Y - 4, RowRight - RowLeft, RowStep);
Page.Fill;
Page.SetRGBFillColor(clBlack);
end;
Page.TextOut(ColNo, Y, 0, ANo);
Page.TextOut(ColName, Y, 0, AName);
Page.TextOut(ColAddr, Y, 0, AAddr);
Page.TextOut(ColCity, Y, 0, ACity);
end;
Há dois detalhes fundamentais que provam o seu valor aqui. A faixa sombreada é desenhada primeiro e só depois o texto por cima, visto que a ordem de desenho se trata da z-order no PDF: se preencher o retângulo após o texto, a linha ficará enterrada. Além disso, o sombreado alternado não é pura decoração. Num relatório denso, constitui a forma mais económica de impedir que o olho salte para a linha errada, sendo por isso que o ciclo mais à frente inverte um booleano a cada linha, passando-o diretamente para o campo Shaded
As posições das colunas acima assumem-se estáticas e fixas, facto justificável para um relatório em que tem domínio sobre o próprio esquema. Caso as dimensões dos dados se mostrem instáveis e mutáveis por natureza, proceda de forma mais sensata optando pela medição de espaços perante incertezas em contornos da adivinhação. O HotPDF possibilita a avaliação quantitativa atinente à medida correspondente ao volume de amplitude horizontal ocupada pela exibição gráfica do segmento textual na própria esfera abrangida pelo escopo atribuído à vertente respeitante ao conteúdo que modela fisicamente o desenho relativo ao objeto representativo ao próprio perfil visual e delineamento intrínseco da página; pelo de o e e a lógicas da de da de num de o e da e o de lógicas o a na num num num a da a num lógicas lógicas a a de a a o lógicas num lógicas versão a de num num da de lógicas num de num da da de a num a lógicas final lógicas lógicas de o num o de da o num de da da o o e lógicas da o num a a a na e de lógicas o e da o de e o a e num num a e lógicas da o do da da o a da e o num o num o num num lógicas lógicas PrintRow o lógicas lógicas num de a o a na num lógicas a da lógicas da num num o de de o lógicas lógicas o a de da da a de de o num o de e e da da o o lógicas o a na o num a num pode num lógicas lógicas num a da num e da e num a lógicas lógicas receber e o da a de e lógicas de num o lógicas o a de e lógicas de a de de e o lógicas de da num lógicas lógicas valor a da num o o da da e de lógicas a lógicas lógicas lógicas mais num de lógicas da da de a na o a e num lógicas num num e a o lógicas a e da num de num lógicas da e de o lógicas o a num da de da a de de de a num da o o lógicas lógicas longo a de a na num a de e de o num a da num da de a o lógicas num e a lógicas o num a a da o lógicas a da a num esperado lógicas num lógicas da de o a e da o na a de lógicas lógicas da o da e num e lógicas num da a da e e a lógicas da e da lógicas lógicas em a num o a na de de num num da num e a da o num lógicas num e da a num e num de o lógicas o da e de lógicas cada da num lógicas da num da o de o a num e lógicas a da lógicas o num num lógicas num num da o da de lógicas da de e lógicas a da da a de de o num coluna, lógicas a num lógicas a num de o lógicas lógicas o a a na a e da o de o a num lógicas num e lógicas num e o e da e e num a da da a na e num a num o num o de de de a lógicas lógicas e o num a da lógicas num a o lógicas num de lógicas a a lógicas a a de num a da o o e da de lógicas medi-lo o a e num num da e da o de de da a e lógicas de num o lógicas a a de lógicas lógicas da num e da a do da lógicas da de num num lógicas lógicas o a da da da e lógicas uma da e num lógicas num num o da da e lógicas de num num num a a num da o da de de de o o lógicas a num num de de e e o na lógicas da de num num e o lógicas a da o de e o lógicas única da a a de de o a na da lógicas da de de a da o o a da o num e num da e num e a e lógicas lógicas o a o da e de o lógicas num e a de a na no lógicas da num e e a num de num a e a o da o na lógicas da de o a num o a a a num a num lógicas lógicas lógicas vez da o da num num a a a na de da de e o da o num num de lógicas o a na o num num a da a o da num lógicas e da a do no da lógicas lógicas da o de de e a num a num a da a num lógicas num a a da lógicas o da a de o lógicas tamanho lógicas num de e a lógicas o da da de a num da a a e da num de num o o da e lógicas o a na de num o num a e o o de e a da da lógicas o a e de da o o da o da a na da de lógicas a a de a na o da lógicas lógicas o num a de num de o o lógicas lógicas lógicas de a a num da num de e lógicas e lógicas e num e da e o num a num da e lógicas da a da num de a o a de num num lógicas fonte da a num da a o lógicas de o lógicas lógicas num de e num e o o a e de a da o num num a num da de da a a a a num num a a da e num lógicas num a e num lógicas num o lógicas lógicas escolhido num da e o num o num da e lógicas da de de a da de num da e a na da num num a num o a num de e de de o da num lógicas num da e de e a num o lógicas num a de a na lógicas a da lógicas da num num o de de lógicas e lógicas a num lógicas num da da o da e o a a na da lógicas da o do da a num o o num de a a lógicas num e num da a da e num lógicas lógicas num de lógicas deduzir da num lógicas lógicas da da de a na num a num e num de o lógicas de a a num o lógicas o o lógicas lógicas o a de e a de na da num o de a e lógicas lógicas a a de a o num lógicas num lógicas e o num a a de num lógicas da e de o da da da na da de as lógicas a num lógicas num da num de de o na lógicas da de a da a da de num o num da de num num de lógicas lógicas o o a na da lógicas o da e a o a a na a e num lógicas da da a da da de de o a num e a de de num o num a e num lógicas o da num e o a lógicas num num de da de o na num o lógicas o o da num a e da a de e lógicas da a a de num a da o o num a da lógicas a o lógicas lógicas lógicas margens lógicas num da num de da de e o da a na da de a num a lógicas lógicas o a o da de lógicas o num o da lógicas lógicas de e a num a num o o lógicas lógicas e da do da num lógicas lógicas num num da e de e a a na lógicas de num o lógicas o a de num num lógicas o num o a na de de num num e o da o da de lógicas num de e e o a de a a o num lógicas lógicas o a da da e de a o num de e da lógicas lógicas da de a de de e o da num num num num a lógicas a a de da lógicas a da a num lógicas num o num a e o da a e num da lógicas a da o num a a da num e da num da e num e num a da da num e num de o a a da o da o de de de a num da o o e lógicas da de esquerdas num a e num da e num e o da da e lógicas a da lógicas da num num num e da da o o lógicas da de de o num lógicas num de a de a da lógicas lógicas de lógicas o a a a num a o lógicas o a na o num a num lógicas a lógicas da da a na lógicas a a de a na num a da da o a da e o num o de da o de de num num a de e num num da e lógicas de e da a da a num lógicas lógicas e num de e da da a a na o da lógicas da da o da e o a de a num lógicas a lógicas a partir lógicas o num a o lógicas lógicas da num e da e o num a num o a num da de da o o da o de de e num a num o num o num a da a num a o lógicas o de o de na e num da lógicas lógicas de lógicas o e da e o de de da a a a a o e e a lógicas num a da a e de a na o a o a o da num lógicas e a o da o num num a da a o num lógicas num dessas o a a num da a e o na num lógicas e da a de e lógicas a a lógicas a da lógicas e lógicas e a da da num o o num num de lógicas num de o da da da da a na e a a num de num a a lógicas num da o do num num num e a lógicas da e de de a da da e num lógicas larguras lógicas a lógicas a a a na e de da num da o o lógicas e o num da num num a a num lógicas a a da da num o de da o de de num a lógicas da a da num de e de a da o o e da de lógicas num e a da num o o a e de da da de de o a na da lógicas da num e lógicas o a na o num a num da e de o lógicas lógicas mais num de lógicas e lógicas a o da da o e lógicas da e de de a da de num da a lógicas da num lógicas a da a num de lógicas da da num o da da num do o na lógicas num num a num da lógicas o lógicas e lógicas um lógicas a num de o e o num a num da num lógicas e num a num o a na da de lógicas o num o da da a de o e da e o da o num num lógicas e lógicas da de a da a da de de de a num num a a da lógicas da de e lógicas o a da da e de a o num e lógicas num lógicas lógicas a num a e a o da a de lógicas lógicas lógicas o o lógicas espaçamento o de num o num a lógicas num de e a num a num num a da a num de num a a lógicas o num da e lógicas num a a da da num o o a e de a na a a de o a da lógicas a o lógicas e num de a da de a num de de da de de da num o o lógicas a a na lógicas da de num a a lógicas a da a de e o lógicas de da num lógicas a de de da e lógicas entre lógicas a da a o a na num lógicas a a de a na num o a a num a o na da num a a num da o num e num da num e e a num de a da o e num e da da o o o num de a a lógicas lógicas lógicas o lógicas a da da num de num num a da a a num lógicas o num a lógicas num a da lógicas lógicas da o do o num lógicas o da e num e lógicas num da o de de da a a a a num a num de lógicas elas. lógicas num da e a da num o num a e a e da num de num e a a o a o de de lógicas a a da da e num o a a num num a o da e de num de de num num e o da da num a lógicas num a da num lógicas num num lógicas a a da e num num e da da o e num num num o da lógicas lógicas lógicas de da o e a e a e num lógicas num da de o a num o lógicas lógicas num da e de e a a na da de lógicas a a lógicas o a na o num num a da a num A lógicas lógicas da o de de lógicas lógicas o a na da num num o lógicas e a o da lógicas num num da e de o num a da lógicas a e a a na da num num a a da a num da e de e lógicas lógicas lógicas lógicas a de e a de na da a da o e num e da da a e da forma o a na da lógicas da da e lógicas a da a o da a na da o de lógicas a num lógicas a de da lógicas a lógicas num de e lógicas da e a num da num lógicas num e da a num de o lógicas da de e o a o lógicas lógicas a de num lógicas a num da de da o da de lógicas num da num num a a num lógicas num num a num lógicas lógicas num de a de a lógicas lógicas lógicas de e o da a da e o num o da a num de lógicas da da de a na num a num e num da e num o num a de num lógicas o e a num a lógicas o da num e o a lógicas lógicas o o lógicas da rotina num e o a lógicas num de de num lógicas lógicas de a de da a num a a da num e num de o lógicas num lógicas a da lógicas num a o a na e num a num o num o a da de de de o a na da lógicas lógicas o e da e o de lógicas o da e a e num num e a da da e num não e lógicas o a da o da a na o a lógicas num a num lógicas a a de a o num lógicas a de a num num lógicas lógicas a da da a a na o da lógicas lógicas o num a a da o da o de de num a o num da da num o de a e de num e da o da num a lógicas o de da lógicas num muda; a da lógicas num e lógicas num num da o da de de e lógicas lógicas e a da e de lógicas o lógicas num da e a a de a da lógicas lógicas o num da e lógicas da o do da da o a da e e a lógicas lógicas o da da de a num a lógicas da num lógicas lógicas da da de a na num lógicas a a a na e de lógicas apenas lógicas a da num o o e da de lógicas o a da da e de o da e num e a e lógicas e lógicas a o num da o o e lógicas da num a a num a da a a de de o a na da num de num num lógicas de da o e da a de e lógicas o lógicas num da e num num num o a da lógicas o num a a de num a lógicas a num lógicas de o lógicas num lógicas a o a a na a e num a fonte lógicas num e da a do e o na o a a na lógicas o o a na da num num num e da da a e de a da o o da num num a lógicas o num a da num e da e num a da da o o num a lógicas e de a o num e da o de de e a num a num lógicas das da de de e o da o o a a num da o o da lógicas lógicas o a o da de lógicas da e de o lógicas o a de e a de na o a da da a de e a a na da lógicas a num a num o a a a num a o na da num a a num o num lógicas lógicas da a o a na de num o num de de num a o num a lógicas constantes o da o de de a da de num da e de o lógicas num lógicas num o a num da de da o da de lógicas lógicas e e a a na lógicas a da lógicas o a num da e de o num a da lógicas a a da da num e num o a a num num num e da e lógicas da a a de a lógicas lógicas num num lógicas é a da da num o de a a lógicas num a lógicas e o num a da a de e de a de da a a a a num lógicas lógicas de da o lógicas a o lógicas num da e lógicas lógicas o a na o num num a a num de num a e a o da lógicas que lógicas o lógicas lógicas a da lógicas a o a na e a a a na da de lógicas da da num do num num lógicas o num a a da lógicas da de a num a o lógicas a de e a a num da de num lógicas a num de o e e a da num o lógicas o a e de a na o lógicas da de num num lógicas o da da num o de num o num a e o num lógicas num muda
O cabeçalho, os delimitadores e o único local que os detém
Uma tabela que se estenda para além de uma página e que continue na página seguinte sem a identificação por meio dos títulos descritivos das colunas é ilegível. A solução reside em tratar o cabeçalho não como um simples delineamento executado unicamente de rajada para perpetuidade, por contraponto encarando-o antes num figurino sob contínua reprodução à semelhança do reescrever sucessivo. Consolide e aloje todas as denominações relativas às colunas em associação a enquadramentos através da aposição provida via das respetivas traçadas delineadoras num só agregado encarregue no alojamento subscrito a um único elemento metodológico (uma só rotina), e assim aplique chamadas face ao invocado procedimento metodológico a cada recomeço, ao abrir de cada nova página. Perante a submissão aos ditames numa base da adoção conjunta entre do da da de o a e da o da de e a a de num a da o o e lógicas da e o lógicas o a num o e a a da da num o de a a da lógicas o num de e da lógicas lógicas o a a na da num de a a num o num o num o num o num a da lógicas lógicas lógicas da da de a na num a num e num de a da de num da e a na lógicas do num a da a lógicas num o a o num de a a a na de da de e de de o da o num lógicas e da a do no lógicas a e da da o o lógicas lógicas num num a num da lógicas a de de da a lógicas num a da num num a de de de a lógicas de num o lógicas o a a na a e num e num num da e de o da da a da da o o num a lógicas lógicas o num a lógicas lógicas corpo o a da lógicas da o do lógicas e a o da e de o lógicas da de da de num de e lógicas de a a num a o lógicas a a da da de de a num da lógicas lógicas lógicas a a num de e lógicas o a na num num num a lógicas num num o de de o lógicas da e da lógicas lógicas a num a num lógicas ao o da o de de a num da o o o num de a a lógicas num e da do e o a na da num de e lógicas lógicas lógicas da o num num lógicas a da lógicas o o num num de num da e num e lógicas num e a da da e num a e da a da a da de num a a a de a na num a de e num num da num e num da e num a lógicas recurso num de da e da a de e lógicas de de de de a num num num de lógicas da da e lógicas da num e da e num num e num num e lógicas e a o da o num num a da a o da num lógicas lógicas lógicas o o lógicas aos da a na da de lógicas da de o a num o a lógicas num lógicas e de a o a a na a a de o num lógicas o num a a de a a num e num de o da da num a lógicas e o num a da lógicas mesmos da e o a a de num num da da da e o da a na da de de lógicas a a a na o da lógicas lógicas a a num a da a num lógicas num e o e a num a a da lógicas da o de de da num num o de da o num num e da da o o a da o lógicas da o da e o a a na a da num e valores a de de o a na da lógicas da de de a de de e o lógicas de lógicas e lógicas e da a num e num da num e lógicas num num de da da o da e de o num o de e e da da o lógicas a da e da lógicas a num a e lógicas num num e a lógicas o de da lógicas da o do da da o a lógicas constantes, lógicas lógicas e e lógicas de da num da o num e lógicas o e num a a num da o o e lógicas da de da e o a num da num lógicas num o num num de num o a num de da de a da a da de num a a da num da e o da e de de a da de num da a da lógicas o da da da da a na lógicas num de o da o o a a num da o o a da num a num o lógicas o a na o num lógicas num e a a lógicas a a de a a o o lógicas a lógicas de e lógicas lógicas ficam a e de o num a da lógicas o da e num e a de a o da num lógicas a de num lógicas a num num num e da da o a da e o num o da o da de de de o num lógicas da e lógicas de lógicas num num lógicas num a da a num o num o num o num de e da lógicas o da e o lógicas o da a da e e a lógicas alinhados a num e lógicas lógicas a de da lógicas da o do da a da da de de o a na da num de e e da e num da da da o o a da lógicas num de num lógicas lógicas de num o lógicas a da lógicas a e da num de num o lógicas lógicas a da a num lógicas o num a a a o e e a num de a num de de da de o e a a da da num e a da o num num num a da a num por num o lógicas num e a de de e lógicas da da o da e o lógicas da a de de o num a a num num a a num de num e a a num da da da a num e num de a lógicas lógicas a num lógicas num lógicas a da e lógicas de lógicas e e a a de num num a de e a de a na num o a a num da o o de de o lógicas lógicas num o de da o de de e a num lógicas construção:
procedure DrawHeader(Page: THPDFPage; var Y: Single; PageNo: Integer);
begin
// Esquerda: origem dos dados e número da página. Direita: hora da geração.
Page.SetFont('Arial', [fsItalic], 10);
Page.TextOut(RowLeft, Y, 0, 'customer.db Page ' + IntToStr(PageNo));
Page.TextOut(ColCity, Y, 0, DateTimeToStr(Now));
// Duas linhas horizontais que enquadram os títulos das colunas.
Page.MoveTo(RowLeft, Y + 15);
Page.LineTo(RowRight, Y + 15);
Page.MoveTo(RowLeft, Y + 45);
Page.LineTo(RowRight, Y + 45);
Page.Stroke;
// Os títulos das colunas, num estilo mais pesado para serem lidos como cabeçalhos.
Page.SetFont('Times New Roman', [fsBold], 12);
Page.SetRGBFillColor(clNavy);
PrintRow(Page, Y + 25, 'No.', 'Company', 'Address', 'City', False);
Page.SetRGBFillColor(clBlack);
Y := Y + RowStep + 45; // avançar após o cabeçalho em caixa antes da primeira linha de corpo
end;
Note que DrawHeader recebe Y por referência e avança-o. O chamador nunca precisa de se lembrar da altura do cabeçalho; a rotina que o desenha é a rotina que sabe disso. Essa única regra de propriedade é o que impede o esquema de se deslocar quando mais tarde adicionar um logótipo ou um resumo de filtros à banda do cabeçalho. O ciclo principal (body loop) mantém-se alheio. Apenas continua a desenhar linhas a partir de onde quer que Y aponte atualmente
As linhas (rules) propriamente ditas são a diferença entre uma lista e uma tabela. Os separadores verticais das colunas são a mesma ideia aplicada ao eixo x: um MoveTo / LineTo / Stroke em cada margem da coluna, decorrendo desde a linha de delimitação superior até à base da última linha da grelha (row) na página. O exemplo mantém-se nas regras horizontais para permanecer legível, mas o passo na produção é mecânico uma vez que as constantes da coluna existam
O ciclo do cursor detém o controlo das quebras de página
Desenhar é a metade fácil. A metade que separa um brinquedo de um relatório é a paginação: saber, antes de desenhar uma linha, se esta ainda cabe, e iniciar uma nova página com um novo cabeçalho quando não caber. Esta decisão pertence exatamente a um único local, o ciclo que percorre os dados, e a mais lado nenhum
var
Pdf: THotPDF;
Page: THPDFPage;
Y: Single;
PageNo: Integer;
Shaded: boolean;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'CustomerReport.pdf';
Pdf.BeginDoc;
Page := Pdf.CurrentPage;
// Título do relatório, apenas uma vez, no topo da primeira página.
Page.SetFont('Arial', [fsBold], 24);
Page.TextOut(200, 800, 0, 'Customer Report');
PageNo := 1;
Y := 760;
DrawHeader(Page, Y, PageNo);
Shaded := False;
CustomerTable.First;
while not CustomerTable.Eof do
begin
// Sem espaço? Abra uma nova página e repita o cabeçalho lá.
if Y < 60 then
begin
Pdf.AddPage;
Page := Pdf.CurrentPage; // AddPage avança o CurrentPage
Inc(PageNo);
Y := 760;
DrawHeader(Page, Y, PageNo);
end;
Shaded := not Shaded;
Page.SetFont('Arial', [], 10); // SetFont tem de ser reemitido a cada nova página
PrintRow(Page, Y,
VarToStr(CustomerTable['CustNo']),
VarToStr(CustomerTable['Company']),
VarToStr(CustomerTable['Addr1']),
VarToStr(CustomerTable['City']),
Shaded);
Y := Y - RowStep;
CustomerTable.Next;
end;
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
O ciclo assenta na plenitude da força de dois pilares alusivos a coordenadas num de o num a da lógicas da de da e o e num a a num da o o e lógicas da e a num da o da de lógicas o lógicas num lógicas. O da de lógicas num e da a num a o lógicas a da lógicas num o de da o da e e a lógicas da a da num e da o da de da da num o da da e de lógicas o a e de lógicas da lógicas num o a num da de lógicas e lógicas e o num da o num e da e num a lógicas lógicas num de o da a a de a na no lógicas da num num o da o da num a lógicas e o a a na a e num da da da de lógicas a a de a na num a a lógicas PDF lógicas o da e a e da o da de de de a num da lógicas a a num e lógicas num e o e da e o de lógicas a de a a o num lógicas lógicas a num a num lógicas efetua lógicas o num a lógicas num e num da a da num num de da de o a na da lógicas da o do num a da e e a lógicas da e de num a da o o num a da da num o de e o a lógicas num a medição da da e num o a num da lógicas num de o da da num a da o de e o lógicas a a a na e de lógicas de a a lógicas num lógicas do lógicas lógicas lógicas o o a na da lógicas o da num e o a lógicas lógicas da a a de da lógicas a lógicas a a a na o da lógicas lógicas o lógicas num da e de o lógicas da de lógicas e a de num num da de lógicas lógicas e y o num de num o o da lógicas a da lógicas o a da da e de a o num lógicas num num a num da e de e lógicas num da o de de num a o lógicas num o da num da e o da e de lógicas num de num lógicas a a de e num num da e da o de de da a a a a de de o da a a na o e e lógicas da a da a num lógicas num para num lógicas a de o a da num a e da a num num a da num a num o da lógicas lógicas a o lógicas de a a num num a de e a de o a da lógicas e lógicas cima lógicas da de e lógicas o a na o num a num da a a de da lógicas lógicas da num lógicas e da do o da da a na a a de a num e num o a a a num de num a e num lógicas num num e a o lógicas a num lógicas a num de o e da e o de lógicas a da num lógicas lógicas lógicas e da o da da o num a a de a na o da lógicas lógicas num o da num a e da a de e lógicas a num da lógicas da a e lógicas partir lógicas da e de o da da da da a na o a a na e a a num da a o e a a da da num e num de o e a da a a na o lógicas lógicas num lógicas o num a a o lógicas num da de a de de e o da a na da num num de o lógicas a a lógicas num a a da num o de da o de de e a da da de num da num lógicas lógicas da lógicas num do lógicas da num lógicas o lógicas lógicas da num lógicas canto e num de o lógicas num lógicas a de a lógicas a e da num de num e a a num lógicas num o a num da de num lógicas num a a na da o de lógicas da da e lógicas de o lógicas num e lógicas inferior o num de e a lógicas num da de lógicas o a a num da o o o num de a a num num o de o de na e da lógicas lógicas a da e da lógicas o o a na a da num e lógicas lógicas o da de o a num o lógicas o o da num a lógicas lógicas a num da num de o a a num da o o e lógicas da a num de o da lógicas lógicas e a num da da da o o a a num a o lógicas lógicas num num a da a num lógicas da e da lógicas da o do da da o a num de e lógicas lógicas num esquerdo, lógicas num o da o da e o lógicas de da num lógicas lógicas o o da o num num a de de da e lógicas lógicas o a a na e a a num de num lógicas de lógicas e da a do a num o a a a de a na num a de e de o num a da num da a e o na num lógicas a o a de num num lógicas lógicas lógicas pelo num a da da num de num o o da o da de lógicas o a num da da o e da a da e o num o de da lógicas da de num num e o lógicas e o num a da lógicas o a da lógicas lógicas o num a a o lógicas num a lógicas a a de a num a lógicas que da da da o na da de lógicas o num num o de de o lógicas lógicas num o a a na da da e de o num lógicas num o a na de de num lógicas lógicas a num lógicas num o de e e da da o o lógicas a e lógicas a num a num lógicas de lógicas num da e a da num o num as a de de num o num a e num da de e a de de e o a o a o da e de o lógicas de a a a o e e a lógicas lógicas da num de a o a de e a de na da da o a a na lógicas a da o de e o lógicas lógicas linhas lógicas o o num a lógicas num a e da a da a a na o num a num a da a o num lógicas da e de o da a a de da lógicas a lógicas a a na lógicas a de o num lógicas de num o lógicas o a na o num num num a da lógicas da num o num num de num o o num e da a da e e a lógicas da e lógicas da o num a a a num lógicas progridem da lógicas da o do da a a num lógicas lógicas e o e lógicas da de num o a num da da num do o lógicas a de a da lógicas da o num e num da o de lógicas num a da a a a a num a o a na de de num num lógicas lógicas da da e lógicas e a num a lógicas a de e a o da o na lógicas da de da de num de num o da da e lógicas num num e da a do e o a na da num o num a e o num lógicas num o a da e de o e a a da lógicas lógicas num o da a na da de lógicas de lógicas lógicas de da o o a o a num num e a o da a num o a na de num num a lógicas num e o a lógicas para a e da o da de a de de o a na e num num num o de de da a a lógicas da num lógicas lógicas a num de o e da num lógicas e a lógicas da de o o num num lógicas num de a de a lógicas lógicas o a da a de e lógicas de lógicas o da e num e a e lógicas num lógicas baixo da da da o o e de de a da o o a num a o lógicas o da num e a da da da e num lógicas lógicas de a a num o o num o de da o de de num a o lógicas num lógicas e o num a lógicas lógicas num o num num a num da e de e a num a da e a o a na num lógicas o da o num num a lógicas de da a o lógicas lógicas na lógicas da de lógicas o a num da a e o na num lógicas da de num num lógicas o num o da da a de o e num da e num e num a lógicas lógicas num num o da da e da da o e lógicas da o de de da a a a num o num e o da e lógicas o a na num de a a lógicas num lógicas página lógicas a lógicas a da lógicas lógicas a e da o de e o a lógicas da e a num da num de o o lógicas lógicas da da num o num num o da e num e lógicas num a a da lógicas num o de e e da lógicas lógicas o da lógicas lógicas e e lógicas de num num num a a na da o num da a e lógicas lógicas através da num lógicas de lógicas a a de num num da de e a o da lógicas num lógicas e num de e da lógicas lógicas da o o e lógicas num a a num a a de a a num da o o e num o lógicas o num da lógicas o num o o a da o num num a num e num de da de a da a num lógicas a e da num de num o a num lógicas lógicas de a a da o da a na da lógicas da a num o o num o num o num o num a lógicas lógicas da num da o o e lógicas da lógicas lógicas subtração num o de da a a da lógicas da a da num o de a e a e da num da e o da e de o lógicas a num lógicas de lógicas num a a a e de a na o lógicas da de o a e da o da de lógicas o num de de num a o a na e num da o lógicas de a da num o a da num a num o lógicas o da num a lógicas lógicas da lógicas da num num o de de o lógicas lógicas da lógicas da num lógicas lógicas num RowStep o num de da da o a e num num da e de o lógicas lógicas lógicas num lógicas a num a num lógicas o a e de lógicas da da o a na o num a num a da da num e num de o e a a da lógicas lógicas lógicas lógicas a da lógicas da num num de da de o o lógicas da o do o num e a num a de o a da lógicas a da a num a o na da num o num o lógicas a Y, e a de de e o da a da e num de num lógicas a lógicas o num da e lógicas lógicas o a num da de da o o da o num a a a na e de lógicas o da e num e a num num num de o lógicas lógicas num a num da da da na da num o a a a num de num a a lógicas o num lógicas num num da e de a da lógicas a a de a na num a de da da e de de da o o a a num da num lógicas e da a do e da de lógicas lógicas lógicas da de da de num de o e lógicas de a num num lógicas o num lógicas de da num lógicas lógicas de lógicas e lógicas vez lógicas num a a da da num e num de e o num a da lógicas a num lógicas o a num de e de e a a na da de lógicas lógicas num num de da da o da e de o da da da da o num a e lógicas o lógicas num lógicas lógicas da a a de de o num lógicas o a e de a da o o a a a na da o e lógicas da num num a num lógicas lógicas da de a num a lógicas de num o lógicas o a na o num a num da e de o lógicas da de lógicas o num a a de de lógicas a a de num num lógicas num da e de e a num a o lógicas a de num lógicas a num da lógicas a a da da num num a a num lógicas e num o da da a de de o lógicas a da a da de num a a da lógicas da o num num a da a a na num da de de num o lógicas e a o da o na lógicas lógicas a a de da lógicas lógicas de a num num lógicas lógicas o a na da num num a num da e num e lógicas num e a lógicas da e de o lógicas num da e a da o num num num a da num a de de a da lógicas da a da num o lógicas num de a de a da lógicas lógicas num lógicas o num a da lógicas e lógicas de a de num de o o lógicas num de da de da a a da lógicas lógicas de a a num o da a e num da lógicas da lógicas lógicas o a o da de lógicas lógicas lógicas da de da e e e o a da o num num o da da a num e lógicas a num num lógicas a lógicas após o lógicas lógicas o num de de num lógicas a e da da o da a a num lógicas o a na e num num da da num do o na lógicas a da lógicas a o a num a o da e de de lógicas num de num lógicas o da a da num de e lógicas de o de na o o a a a lógicas num o a num lógicas o e da e o de e a da da de num da a da e e a lógicas lógicas a num e lógicas lógicas de a num o lógicas lógicas o num a lógicas da num lógicas num vez, lógicas a o a na a a de o e e a lógicas num e lógicas de a a num num a o da e de num a num lógicas num num a e da a da a da de a de de lógicas num a o a na de da da e da da o o lógicas lógicas da a num o o num de a a na da num num a a de e num num da da num o num a e a o da o na num lógicas a a a na da de lógicas num de lógicas e e da a da e num da lógicas o num da da a a na o da lógicas lógicas da a a a a num da o num e lógicas lógicas num lógicas o lógicas o a num da de num lógicas a de e a de na lógicas num de da da num lógicas a a num a da lógicas lógicas lógicas lógicas num lógicas de lógicas e a num de a da o o e lógicas num a a da lógicas num o a num lógicas num lógicas e o num a da lógicas a da lógicas da num num o da e num e lógicas a num o lógicas o o lógicas a num a num num e a o da lógicas o de o de na e num da lógicas num o lógicas a num a num lógicas a da a a na de num o num de de e lógicas num num a num de da de a num a lógicas lógicas num num a e o da num lógicas num de num a lógicas o num o da lógicas e o lógicas o teste o o da o num a a a num a o da e de o num a da lógicas a a da da num e num da e de e num a a num de num e a a num da lógicas num lógicas a a de num num lógicas lógicas lógicas num a a da e lógicas lógicas num o num a de a na num o a a num num a a a na de lógicas lógicas lógicas a a de a na no lógicas da num e e e lógicas da a de de o a na da lógicas da e de de de num da a o e a da a a na da de a num a da a e num de e da lógicas lógicas num de da lógicas a o lógicas o o a na da o de lógicas a a num e lógicas da lógicas num a o da num de e num lógicas num de da de a lógicas a lógicas a a lógicas o num lógicas num e da a num de o lógicas da de a num de o lógicas de de de de a num da do da a de de o lógicas num num de e e o a de a a o num e lógicas o lógicas página e lógicas de o lógicas da a a de de e o da a da e e lógicas da da de a num a a da da num e num de o lógicas o a a num da o da de lógicas o a da da e de lógicas o a o da num lógicas num num da num de num o o a na e num num num o de de lógicas a da lógicas lógicas da a a de a o da o num num a de e num o a a num da lógicas o o e da de lógicas o a a na da o de lógicas o a na o num a num da lógicas lógicas e e a a na da num num de da de a da a num lógicas num da e de e a num o lógicas da o do da da o a da de de de o e num a a num lógicas cheia a da da num o lógicas da o num e lógicas a da lógicas da e a num da num a lógicas lógicas a num o lógicas da da a de de num o num a e num lógicas a da a num o a a da a da de num da e a na lógicas do lógicas lógicas num lógicas num de a de a o num lógicas num num da num e num num o da o da de lógicas num a a a o e e a lógicas num e a o lógicas lógicas e o a de a na num a de e da da o o lógicas a da da o da e o a a na e a a num num a num a da lógicas da e da lógicas lógicas da num num o de de o lógicas num num de o lógicas a da num lógicas lógicas dispara o da e o num a da da num e num o lógicas o num a a de a a da lógicas da o da e num e lógicas o o lógicas da o e da a e num a da o o e lógicas da a da num de a o a de num num lógicas a da num o o o e da lógicas da a o da a de lógicas lógicas de de a lógicas lógicas da da a e o na num lógicas a e da da o lógicas a lógicas a de e a de na a de a da lógicas e o num da o lógicas da da de lógicas num num de o da a a na e de da a num a o da num de da o a o num de a a num o da o de de num a lógicas num o a num o e da e o num o da o de de o da num lógicas lógicas a a num a lógicas e a o da o num num num a da a num lógicas num da a da num e da num a lógicas o a num da de da a de de de o num lógicas o num num da lógicas num a de da da a de de num num num num a da num a a num a o na da lógicas da de e lógicas de lógicas e lógicas da e a a de num lógicas a a da da num e e num o da da a na a a de o e a e a o da da o e lógicas da a da o lógicas da da num o da da e de a lógicas a num a num lógicas quando o de a a da e num lógicas o da e num e da lógicas o e da o de num lógicas lógicas e a a num de num lógicas num a da a o a na num lógicas a a de a na num a de num lógicas num a a na num da de de num o lógicas num num lógicas lógicas a da a da da de de da num o o e lógicas a da a num a a o lógicas num e lógicas num e a da da o da e e a lógicas lógicas o a e de lógicas o a na o num num a a a na e de da num da a a na e da da a na o a da lógicas a o da da o lógicas num da da o e num e da a da e e a num de a da de num a da o a de da a num lógicas lógicas da e de o lógicas Y o num da e lógicas da da a da da e de de e e o num a de a a da num e o num lógicas o lógicas e o a de a num num lógicas e da a do a num num o a de lógicas a lógicas da e lógicas lógicas a a num lógicas e a de num num lógicas da e de o da da da da a na o a e lógicas da lógicas num o da num a e da a de num lógicas a num a num lógicas de da num da e o da e lógicas lógicas a a a na o da lógicas lógicas a de de e da num da da e de o lógicas a num da lógicas a a num da num lógicas num a a da lógicas da de lógicas num num de num num da de lógicas da da de a na num lógicas lógicas e e lógicas de o de na o o a a num num o num a e o num a lógicas a da num lógicas lógicas e e da num da num o num a num da e de e num a da da o e num a a num da o num e da e num da o lógicas lógicas a lógicas o num e a lógicas da e a lógicas o a na de de num num cai num de num a o num e lógicas a da da a a na o da da a na o a lógicas a e da num de num o lógicas lógicas o o a num a o na de num num a a de e num num o lógicas lógicas a da a da da a de a a o da o da de de e a num a num num a da lógicas o da e lógicas da da e lógicas o lógicas num num de num a o lógicas lógicas a e da a num e lógicas lógicas o num a a a de a na no lógicas num da a da num e o o a de da num e da e num a num o num da e num e a e lógicas lógicas o o o a da o lógicas lógicas lógicas o o lógicas lógicas da da de lógicas da e lógicas de da a e lógicas da e de num de de num num a num da e lógicas da da o a da de num a num o da da e de lógicas o num num e a o da o num num num num da da da de lógicas a a da da num o de da o num num a da a num lógicas para num lógicas o num e da a da e num de a de a num da a a de de o a na da num num o de o lógicas lógicas da o o e lógicas da de de da num num o de de o lógicas da de e lógicas o a a num a o num o e num de o lógicas num da da da a a na e num a num lógicas o lógicas o a num da o o o num de a a lógicas num e o a lógicas a num o e da e o de a num o lógicas a de da da num a da da o da e o a a na a e num lógicas num lógicas a e a num lógicas num lógicas da a e lógicas da o num a a a na o e de da da de num da a lógicas a da lógicas o num num de de de e e num lógicas a num lógicas num de a de num de de o lógicas e o num da o o e da lógicas lógicas baixo num e a da da e num o a a na da lógicas e lógicas e lógicas de da lógicas da a da num e da o lógicas de a a num o da da e de lógicas a num num de de num lógicas e da do num de lógicas da num lógicas lógicas a a de num num lógicas lógicas a da da a de o lógicas da da de a num a lógicas da de de a de de lógicas a o lógicas o da lógicas lógicas lógicas o a de e a de na lógicas a a da lógicas o a na da num de num a a da da num o num a e o da num e a da o num num a da a num de lógicas e lógicas o o da o num a a lógicas lógicas o da e a e num da da da de de o lógicas num da o o e da da da o o num a lógicas lógicas e o da num da e o da e de de lógicas a num da lógicas a num da a e o na num o lógicas da o do da a na a a lógicas da lógicas num o de lógicas e num o da e num e a num de num de a de o num lógicas num da e lógicas o e o e de a da o o a lógicas lógicas a da lógicas da o num num a a num da o num e lógicas num lógicas num da margem num a lógicas lógicas o o lógicas a e lógicas lógicas da num lógicas a num a num o num da e de e a a na da de lógicas lógicas de lógicas e da a do num lógicas o da a na da lógicas de o a a num e lógicas o num lógicas lógicas de a a na a e num o e da a de e lógicas a num a e a o num lógicas num da o de de num a o num a lógicas a num a e num lógicas o num a a de a na num num num da e de o da da da da a na o a da da o lógicas a num da e de o lógicas lógicas o da lógicas num a da a a na da lógicas da a o a na de de o a na o e e lógicas da de lógicas o da e a o da lógicas num o e a a de da lógicas lógicas num num e a o da o num num a a de de o num lógicas a num num da de lógicas a a de a na num a num lógicas a da a de e o num lógicas a a da lógicas lógicas de de de de a da da e de lógicas o lógicas o o a na lógicas inferior, lógicas a num da de da o da de lógicas e lógicas da o da e num num e num num o de de lógicas a da o de e o lógicas a de da a o lógicas num de a a lógicas da da de num a da o o lógicas da o a num lógicas o a na num num num e da da o o a a num de num da da de a num a lógicas de da num lógicas a lógicas a da lógicas num o lógicas num a a da num e num de o lógicas lógicas o a o num de a a num a num num a da a num lógicas num de o da a lógicas a da da num e num da num e e a num de de da de de da num da o o e num a a num o num o a num da de num lógicas a a a a num a o na da e num a lógicas num lógicas de da de a de de e o da o da a na da lógicas da de lógicas da e de o lógicas num lógicas e o num a da lógicas num de num num a a lógicas a e da num de lógicas da de a num a a da lógicas lógicas e e lógicas da da num do o na num e a a num da da da o na num o a a a num de lógicas a da da a a na num da de e da da a num e num de o a a na da o de lógicas num num da e a da o num num num em lógicas lógicas de lógicas a a de e num num num a da num e da e o num a lógicas num o a num da de de num o num num de o lógicas da da de a num a da a e o na o lógicas lógicas o da lógicas num a da a da de num da e a na lógicas lógicas e lógicas num e da a da e a num de a da de num de num num de e e da da o o num a o lógicas num e o e a num a num num lógicas lógicas da a a de de o num o de da o de de num o a num de e de de o da a o lógicas num da e de e a num a num o o num de a a da lógicas e lógicas da o num num lógicas num num lógicas num lógicas da e lógicas da e a num da num lógicas da e da lógicas e e a a na num a num da da a de de o a na num da num a lógicas o num o da num a lógicas a da da o e lógicas da da de a o a a na num a a da e num num o da da a de o a da lógicas lógicas num da num de da de o lógicas vez da o da num num a de a na no lógicas da de e lógicas o a da lógicas e num da de o o a na da lógicas a a de de a da da num o de de a da o o da o de de da a e lógicas de num o lógicas a num de o lógicas num num da num e num da num de e lógicas num a num lógicas num lógicas lógicas a num de e num e o lógicas num num a num lógicas e da a do de a a a na e a a num num a lógicas da num lógicas num num lógicas e lógicas e a o o da lógicas de lógicas e lógicas lógicas o lógicas e o o da a de e lógicas de o lógicas o a da da de de o a num o e da e o da e de o lógicas a de a da da e num lógicas da e de de num a lógicas lógicas de a da o num e num da e de e lógicas de num num num a e lógicas da lógicas num lógicas num de e a lógicas num num num e da da o a da e lógicas lógicas lógicas lógicas o num num lógicas a e da num de num o o a da o lógicas de a a num o da num a da da num e da a da de a de de lógicas lógicas e da da de lógicas num o a na de de de a num da lógicas o da e num e num a da da o a da e o num o da o da de lógicas o da a na da de lógicas a a a da de num a da o lógicas num de num de a a na da o de num lógicas a da lógicas num a da lógicas num num ultrapassar num de da e da o de de num o e de a de da da a de e lógicas a o da da o lógicas lógicas de da num da o num lógicas num a da lógicas num e a lógicas o num lógicas o num num o da e num e a num a num num a a num de num da da de a num a lógicas de da num lógicas o o lógicas lógicas da o da o da de lógicas e lógicas da o da a na da num num a a da e num num lógicas o a a num da a da o lógicas da e lógicas da a da num de a o a de num num num e da a da e num lógicas a num da e num e lógicas num lógicas da da num do e a da num o lógicas o a de da a num a o na da num a a num lógicas a e da num de num o a num da num num a num da e de e a num a num lógicas a lógicas e o num o de da da num a da de num a a da lógicas num de o da a o a na e a a num num a a na lógicas um num da de lógicas da lógicas da o do o num lógicas da a da num de lógicas da lógicas num e o a lógicas a num o e da a num e num de o e a e a da num de e a o da o num o a a a num a o num o e num de o e da e o de lógicas num num e e o num a da lógicas a a de a na num a lógicas de num o lógicas a num da lógicas a a na lógicas a a da da num e num da o de de o lógicas lógicas o a a na da lógicas da e o lógicas o da o de de a da da e de lógicas o num num o de de o lógicas num num lógicas num de num lógicas e a num de a da de lógicas da e lógicas num da lógicas a e a a na lógicas o a na o num num a de a na o da lógicas lógicas o lógicas num o a num da num e num o a a num num a a na num da de e a de de e o da a na lógicas da de da de num de o o lógicas lógicas num de a de a lógicas lógicas a a a a num o da lógicas limite num de lógicas o num a a de a a o num a lógicas lógicas a da a num de a de num lógicas lógicas da num e da de lógicas num a da a num a a da lógicas o lógicas da o de de da num num de da de o a na da lógicas o a o lógicas o lógicas e o lógicas da da e lógicas num e e da a da e e a lógicas num e lógicas lógicas lógicas lógicas o da o num num da o da e o a a na da num a de de da e lógicas de e o da a da e lógicas da da o a num num a a na da num num a de num lógicas da da a na lógicas da o num a a da e lógicas lógicas da e lógicas lógicas o da da da da a na num e o da da o e lógicas da e de de a da da lógicas num num lógicas lógicas da de da e e e a num lógicas da e a num da o o e lógicas da a da num o lógicas e o da num a lógicas a a lógicas superior. a da o de e o lógicas da a num o o num num de lógicas da lógicas o e da e o num o de da o da de lógicas da a o a na de de da da de num da e o num da o o o num de a a num o a na de num o num e o da da num a num o da o lógicas a a num a a o na lógicas de de de de a num da do da a e a num lógicas a e a a num o o da o num a a da lógicas lógicas e a lógicas o lógicas num o a de lógicas lógicas e da do e da de o lógicas lógicas a da o num num a num da e de de de num da a da num de a de da a num a o a na e a a num de num a o lógicas a de e a de na da da num e e a num de a lógicas a de lógicas e lógicas da da de a na num o a a a num da de da a de de o lógicas a lógicas de num a a da lógicas o o lógicas lógicas num o de e lógicas num lógicas a de lógicas o da e num e lógicas a da da a a na o e da o de de a num da o o e lógicas da e a a de a a da num e da num da e num e lógicas o a a num da o da a na da de lógicas da num lógicas lógicas a e num a num lógicas e da num da o o e da num lógicas Se num o da da a de num lógicas o num e num num num o e e da num da da num o o e o e de e a num a num de da de o a num o o lógicas lógicas a e a a na da de num a da a o num lógicas lógicas e da o da da o lógicas e a o da o na lógicas lógicas a da lógicas o da e num e da lógicas lógicas o lógicas num a a da lógicas num a da lógicas e o a a num num num a da a num lógicas num num o lógicas da o num num de da o a o num da num num da a a da lógicas a o a na de num num a de e a da da num de lógicas num da num de o o lógicas a da da e de lógicas da a e lógicas o da lógicas lógicas da e da num o de e e da o o e lógicas num a o a num a o lógicas a da o de e o lógicas da da a da da de da de num de o o lógicas a lógicas a lógicas lógicas o a da da e de o lógicas lógicas num de a lógicas lógicas a a a na e de lógicas o o da o da de e a a o o e lógicas de num lógicas num o a a na da lógicas da o do e num lógicas num e da a num e num de o lógicas o num a num num a o da e de o num a da lógicas errar lógicas a da lógicas num lógicas lógicas da da o da e o a num da de o a na e num num num e da da o o lógicas o num da lógicas da de a num de o lógicas a da da num e num da e de e a da a da de num a a a na e de o num num a e lógicas lógicas da da e lógicas a o lógicas o o lógicas e o o a da o lógicas lógicas lógicas lógicas e da a da da o a da e o num de e da lógicas da de da e num de de de e e da da o o a a num a e num da e num e a de de da e lógicas da da da a na lógicas a da lógicas e lógicas num lógicas e o da num de de da de de da num a o na da num a a num o num o num da e lógicas num a a de lógicas num de lógicas a num a num lógicas num a a da da num lógicas a da num lógicas a de e a o num lógicas a a de a o da o na lógicas da de lógicas o lógicas a da a num lógicas a da num o o num de a a na a a de o e da e o de lógicas a a num da o o a a a na da num num na a o num a lógicas lógicas o num o a num da num da num num a a num a o lógicas a a de o a da num a e e a num de a da o e e lógicas da o do da da o e lógicas da lógicas num o da num a e da a de lógicas o lógicas da da da na a lógicas lógicas lógicas num e num da de de num o num num de a de de e o da o o a a num a direção o da e a e num lógicas num a da o lógicas o o e de de da da de num da e de lógicas da o a num lógicas e da num de num o num a e o lógicas o a na o num a num da e de e lógicas de lógicas o da a na da de lógicas a da lógicas lógicas o a de e a o num a num a da a o num lógicas num de a de a lógicas num a a de e num num da e da de lógicas da e num o a num e a de de e o lógicas de a a lógicas num num da e de o lógicas o da e num num e num num da de lógicas a a lógicas num e da e num o a a na da de a num a lógicas num de lógicas da num num o da o da de de de o a a num e lógicas num num o da da e da da o o lógicas a lógicas a a lógicas o a da da de a na num a num e num de o lógicas a o o a na da num lógicas lógicas da de de a da de num a a a a num a da o lógicas a de num lógicas a num de o lógicas e e lógicas de o lógicas a lógicas a a num a o num da e lógicas da e da num da e o o num de e a lógicas num lógicas a da num lógicas num a da lógicas lógicas a de de de a num da o o o num de a a lógicas lógicas a num de de da a e lógicas num lógicas a a num da de da a de de de o da o a num lógicas a lógicas da e da lógicas lógicas o a a na o da e lógicas da de da de num de o e da e num da e da a de e lógicas e a o da lógicas lógicas e e lógicas da e de o da da da da a na o a e num lógicas a num e da a a na o da num e a da o num lógicas de e lógicas e e da num da e num e a de de num o num a da lógicas da da e lógicas da de de num a o lógicas lógicas o o num de num o o a na e num a num o num o a num da de num lógicas de a de num lógicas a de da lógicas a lógicas lógicas na lógicas e e num a da da num e num de o lógicas da de num num lógicas lógicas a o num num lógicas da e lógicas da num e da e o o da a da e o num a da e e a lógicas num a o a o da num lógicas lógicas o a na num num num lógicas lógicas a num lógicas lógicas o a num da de num lógicas da de e o lógicas o da num num o de num o num e o da e de num de de num lógicas da o de de da a o lógicas num num a num da lógicas a o a num o e da a de e lógicas o lógicas num o de num a o lógicas a de a o da o na o e num num num o lógicas o lógicas num a o lógicas o a na de num o e da o de num lógicas a de da lógicas a da num o a num da e lógicas da num num o num o num a da lógicas da o do da num e a num a lógicas da e a num num num e num o lógicas lógicas o lógicas num de lógicas de a de de e o da da num do num lógicas lógicas lógicas o num a a de a a o o lógicas a num da e num num o da e num e a da lógicas de o lógicas e a o da o num num a de lógicas lógicas lógicas e a da e num lógicas num e num da e o da e a a de num num num a da a num lógicas da lógicas lógicas a de o lógicas lógicas e a da num o o e da lógicas inversão, lógicas de num o lógicas da o num a a num e lógicas num o a num o e lógicas da a a a a de de o num lógicas num num da e lógicas o a na num num a da a o num num o da da a na e num a lógicas a num da lógicas da de e num o da da a num e num o a a a num da a o lógicas o da de o a e lógicas e a a num da de num a da o o da lógicas num da e de e a a na da lógicas da de da de num e o a lógicas a da o de e o lógicas lógicas o a e de a da o o num a da a o num lógicas lógicas num de e a lógicas lógicas a o lógicas a da e a da o e num e da da da o num a a de lógicas o a num o e da a o o num de e da lógicas a de num o a num da da da o lógicas a o da da o num a a lógicas da a a na a da num e lógicas o num e a lógicas e a o da da a de a a num da o o da de lógicas a a num e lógicas lógicas a primeira lógicas o a de da a de de o a na da num num o num e num o da da a da da de a na num a num e a de a o da o num lógicas lógicas num de de num num num e da da o o o num a num a lógicas num num lógicas a num lógicas a da num o o o e de de a a num num a a num de e lógicas num lógicas num lógicas a num lógicas a lógicas o a da da num e lógicas num e da a do e o na o lógicas lógicas o lógicas a da o lógicas a a de a o a num num a e da a da a da de num da e o num a da lógicas num num de a de a lógicas lógicas e da num de num lógicas lógicas da e a da e o num o de e o a lógicas num o da num da e de num a lógicas a e da num de num e a a da da num de e lógicas e da o da de de de da num da lógicas o num o o a e num da num de o num a da a num o o num de da da o o lógicas o a da lógicas o o lógicas lógicas linha lógicas o a na o num a lógicas a e da num de num num num de num o o da o de de da a e lógicas a da a de da da o a na de de o a de lógicas e lógicas e num o a a na a num o num o num o num lógicas a da o e a num a a de a da lógicas a da a o a na num lógicas a da da o a da de num da de lógicas lógicas de de de de a a lógicas o num o da da e de lógicas o a na num de lógicas da da e lógicas da a lógicas a da num lógicas e num a a lógicas lógicas a a da da e de a de lógicas lógicas o num da e lógicas da o o e lógicas a a num a o lógicas num lógicas a da da a a na num da de e a de num lógicas a a de e num o da num num da num lógicas num o de e num a a num num a a na o da lógicas lógicas da o e a o num lógicas lógicas lógicas é lógicas o da e a e da num da e o da o da de lógicas de o lógicas da de a lógicas a num a num lógicas lógicas o num de da da o o lógicas num a o lógicas lógicas lógicas de o num o a a num da num lógicas da lógicas num a a da da e da da o o a a num lógicas lógicas a e da da o o a a num de num e da da num o de da o num num a a num lógicas a o num o e num de e da da o o e a lógicas lógicas a a na da o de lógicas num lógicas num a lógicas a a de o a da num a e e a lógicas a e da a do num a e e num a da da num de lógicas da a e lógicas a a na o num lógicas a num lógicas a o a a na da lógicas o da num e o a num da de da a de de de a num num a a lógicas da e de o a e de a da o da a na da de lógicas a num e num a da lógicas lógicas o num a a a na de da de e de e da da e da a de a a o num lógicas impressa da da num o num a e o da num e a da da da e num lógicas da e de o o da o num num a a num de a da de num de o e da num o e num a a lógicas lógicas a o num a lógicas da a o a e de a na o lógicas da de da de num e o a lógicas lógicas o lógicas num e num da num e e a num de a num de a lógicas lógicas o num de lógicas num da num de da de o na o num a num da o num e lógicas num lógicas da o do da da num e num a lógicas lógicas da e lógicas num e a lógicas a da a num lógicas a de o num lógicas e da do o da da a de de o num da num num a a a na e de lógicas lógicas lógicas o e da e o de lógicas a da a da de num num num num da da da de lógicas a de a da o o da o num num da da de a num a lógicas num e da do e da de lógicas lógicas de num o lógicas e a o da o na lógicas fora da a e num a num o num o num o num da e de e a a na da lógicas da o num a a a num a num lógicas a lógicas a a da e num num lógicas e a a da da de a lógicas a num a lógicas lógicas a da o de e o lógicas o a o da e de o lógicas e o num da o o e lógicas num a a num a o a num a o lógicas lógicas a e da a do a da e num lógicas o num a a de a na num a de a o num lógicas a num lógicas da o de de e a num o num o da o da de a de de e da e o num a da lógicas da o e a e da num da e num e o lógicas a e da da o o e da o de de de a da da e de lógicas da e num a e da a da e e a lógicas da a num a o na da num a a num de lógicas a da num da de da a a da o da o a na a a de o da o do e num a da da num de lógicas num num de da da o da e de o lógicas a da lógicas lógicas e e a a num o num de o a na da num de num num lógicas de da num lógicas lógicas do o a na de de o num da e lógicas lógicas num de o da a o a e de lógicas num da a a e lógicas e lógicas da a num o e da a de e lógicas de o lógicas da da de da de num de o o lógicas a da da o e lógicas da lógicas num de e a num a num a de e a de de e da num da de a da a da da de num da e de lógicas a a num de lógicas num a da a o num lógicas lógicas e e da o da de de de o a lógicas o num e a lógicas o a e de a da e o num a num lógicas a da a num a a da lógicas num num de o lógicas num a lógicas a o a o da da o num a lógicas limite a de de de a da da num e da num a lógicas num num num e da da o da e a e num lógicas da da de a na num lógicas a num a num e a de de num o num num de o e da e o num o da o da de lógicas a de e a lógicas num a a num de num a e num lógicas o num a lógicas num da num num a num de da e da a de e lógicas lógicas a e lógicas lógicas a e num da da da e o o da a de e lógicas num da num de da e da a na num e o num lógicas de e lógicas num da num de o num a da lógicas lógicas de da e de num a da o o e lógicas lógicas num lógicas a da da e de lógicas a num lógicas e da a do o a a de de e o da a da da a a na o da lógicas e lógicas o a na num num da da num o num a e o lógicas a o a a na da de lógicas lógicas o da e num o a a a num a da a num lógicas o da a da de num a a num de num e a a da da de a lógicas lógicas o da o num num a da a num de num de a a num o da lógicas lógicas num a da a de e num num o lógicas o a de da a num de lógicas da o da e lógicas inferior lógicas o num e num da e num lógicas a num da lógicas e lógicas da e de de a da de num da a lógicas da num lógicas lógicas da a da num de e lógicas da e da num o de da num lógicas lógicas a da a da de num a a da da num o de de o lógicas lógicas o o lógicas lógicas a da num lógicas a a de num a da o e da a do e de num de e da lógicas lógicas da o da a na da de num num lógicas lógicas lógicas o a a num da o o e a lógicas a o lógicas a lógicas a de da lógicas a da a o a na da lógicas da o a num lógicas a da a o da a da da o lógicas a da a num de o lógicas da a e lógicas da lógicas num da de lógicas a num de o e a a da lógicas da de da de o na o num o num da num lógicas o num a o lógicas lógicas lógicas enquanto lógicas de lógicas e lógicas e lógicas lógicas num de o da a o a a na e a a a na e num a num o o da da de lógicas a a num a e da a de lógicas lógicas e num a a a de a lógicas da e o lógicas o a a de da lógicas o da e num num e lógicas num de num lógicas a num da e de e a a na da lógicas num e lógicas a da a o da a na num da de lógicas num de lógicas lógicas a da e a da o a na de de num num e o lógicas da a da num o lógicas e o num a lógicas a de de e da num e da o e o num da o lógicas lógicas da a o a na a da num de lógicas num lógicas o e da e o de de de a da a da a na a a de o e da num lógicas o da de e a o da o num lógicas num num e a lógicas da e lógicas e num de num o o da lógicas lógicas a num num de o lógicas o da lógicas num a lógicas lógicas o e lógicas o ciclo a de e a a num da o o da lógicas num a num lógicas o a da da e de lógicas da da de a na num a de da da a na lógicas a de num o a na de e e o na a de da da de de de o num lógicas a lógicas a da a da de num da e a na lógicas de de da o o da o num num a lógicas a num de num e a a num lógicas num o de e e da da o o lógicas num da e de lógicas o a o da de lógicas num a a da e lógicas num e o a lógicas lógicas de a de num de de o a na da de da num o o e da lógicas da a num o a a na num da num a lógicas num e lógicas a a da da num num a num da e de de a a num o num o num lógicas de lógicas o num lógicas considera a num de o e da e a a de num a lógicas de a num o a a a num a o na da lógicas o da a a num lógicas lógicas e e lógicas de e de e a a de num lógicas da lógicas o num o da a e num da da da de lógicas a da a o da e e a num da da da o o lógicas da o a a lógicas num de de num a o lógicas a o o a na o num a num da da a o na num o lógicas de a a num lógicas e da a da e a num da num de da de o a na da num num num e da da lógicas o lógicas de lógicas o o lógicas o a o de e o lógicas lógicas lógicas a de da lógicas num e num da num e e a num de da de num de num o lógicas lógicas a a de a na da lógicas num da num de lógicas a a da e e a lógicas da e a num da da o da lógicas da num e da a da de a de de lógicas a a da num e da num o de de o lógicas que num lógicas e da a a na o da lógicas a da da o a de num num lógicas lógicas da num num o de de o da o num num a da a o da a na da lógicas da a o da da o num a a de lógicas lógicas e da do no da o da o da de lógicas da de num num lógicas a num num e a o da a num o lógicas o num o da da e de lógicas a a de da lógicas num a lógicas lógicas da e o o num num de o lógicas tem da o lógicas a de num lógicas num de num lógicas da lógicas a da da num e num de o num num a num lógicas a o da da o num a a da lógicas a da lógicas da num num num num a de o a da lógicas lógicas e num de e da lógicas da o do da da o a de num num de a de a da lógicas da de da de num de de e a a lógicas a o num e a lógicas num a num de lógicas a num da lógicas a e da num num lógicas num de de da de de da num o num e o a na e a a num lógicas a da o de e num a a num e lógicas da a o lógicas o a o num de a num de a da de a num da lógicas num e da o e num e da lógicas lógicas e lógicas e lógicas uma da da da de num da e de o da da da a na lógicas a a da da de num da lógicas o num num lógicas num lógicas lógicas lógicas num de a de da a na lógicas da de o da e e a num a de de da e lógicas lógicas num a e num de e a num a num o da o da de num de num num da de e lógicas o a na o num a num num a da a o num lógicas num da da o de da de da a de de de a num da num lógicas da num e da o de de e a num num num e da o de de num a lógicas num de de e o da a da e e lógicas da o o e lógicas da da a da da o a da de de de o da a da da num e num da num e o a lógicas lógicas a de da lógicas a da a num lógicas e o num a da lógicas o lógicas num lógicas página num da e o lógicas e o e lógicas a num num de de de e e num num de e e o na a de lógicas da da de o da e num e lógicas o a na de de a de de a da da lógicas num num da e de e a a na da lógicas da de a lógicas lógicas num lógicas da e lógicas da da e lógicas num o da num a e da a de o a o de e o lógicas a da da num o de num o lógicas num da e de o lógicas lógicas da o num a a lógicas num lógicas a da o a na de num o e da e o num num num a da o num num de da de o a na da lógicas da o do da num e a da da num de lógicas num de da da num lógicas a a num da a a e da num lógicas num e lógicas lógicas lógicas da e a a de num da de lógicas lógicas lógicas num da e lógicas de num num num a lógicas a a num de num a a da lógicas da lógicas a e a a num o num o num o lógicas inteira lógicas a de num lógicas a a de o a num o lógicas num da num num a a num da o o o a da o lógicas a o da lógicas lógicas de lógicas e lógicas lógicas lógicas lógicas de e o da e a a da lógicas o a da da e da o de de num num da de lógicas a a na da o num da a da e num lógicas da e lógicas lógicas a num da de da o da de a de de da da de num da e a num da o num e lógicas o num a a de a na num a de num lógicas lógicas a a num e lógicas o da e a o da o na lógicas da num lógicas e lógicas e da a num a o lógicas a a num da e de e da da a num e lógicas num de a num a lógicas a o a a na a e num lógicas lógicas de a o lógicas o e o e de de a da a da de num da e a na lógicas e e lógicas a o num o e num de o o lógicas a a de o a da num a e e a num da o num e e da a da e e a lógicas da e o da o num num num e da a da e num o a a a num de num de a a num o lógicas espaço num num o lógicas o a na o num num de lógicas lógicas lógicas da a num o o num de a a lógicas lógicas num de o da num e o a num da num lógicas e a o da lógicas lógicas o o lógicas num o de da num e a num a a o da o da de lógicas a da da num o de o lógicas e lógicas e lógicas a da a o num lógicas num lógicas de da de o num num a da a num a a lógicas num lógicas da e o o da a de e lógicas de lógicas lógicas e da e o da num num num num a num da a da o e num e da num num lógicas lógicas livre
O outro facto apanha quase toda a gente num momento ou noutro. AddPage cria uma nova página e redireciona CurrentPage para ela, mas não transporta absolutamente nada consigo: nem o tipo de letra, nem a cor de preenchimento, nem a posição. É por isso que Page é relida de CurrentPage após cada AddPage, e o motivo que exige a reemissão do SetFont antes das linhas de corpo. Salte a releitura e continuará a desenhar na página que acabou de deixar para trás; esqueça o tipo de letra e a nova página renderizará com o padrão a que o visualizador recorrer em último recurso
Os casos que destroem um exportador de tabelas
A maioria dos bugs de tabelas não se manifesta na "via feliz" de umas quantas dezenas de linhas organizadas. Eles residem nos limites (edge cases), e os limites são baratos de testar assim que souber onde estão
- Conjuntos de dados vazios. Um ciclo sobre zero linhas produz uma página com um cabeçalho e nada por baixo, o que, pelo menos, parece intencional. Uma página em branco sem cabeçalho parece uma falha. Decida o que pretende antes de enviar o software
- A linha que aterra exatamente na fronteira. Gere um relatório cuja última linha assente num passo acima da margem, seguindo-se um cuja linha seguinte se posicione num passo abaixo desta. A paginação com erro por um fator esconde-se até os dados terem exatamente o comprimento errado
- Valores excessivamente longos. Um nome de empresa mais largo que a respetiva coluna invadirá a coluna seguinte. Meça o campo e decida uma política: quebrar para uma segunda linha, cortar ou truncar com reticências. O silêncio não é uma política
- Campos nulos. Ler um nulo diretamente para
TextOutpode surgir como o texto literalNullou como um espaço em branco, dependendo da forma como o converter. Escolha a renderização de forma deliberada em vez de deixar que a conversão de variantes escolha por si
Passe o resultado por mais do que um visualizador antes de o dar por terminado. A substituição de tipos de letra e o recorte portam-se de formas diferentes entre renderizadores, e uma tabela que parece direita num leitor de PDF pode exibir uma coluna desalinhada ou uma cidade cortada noutro. Confirme se o cabeçalho repetido, o sombreado da linha e as margens sobrevivem à transição, e se os números de página se mantêm contínuos após os dados atravessarem uma quebra
Desenhar a grelha por si próprio em vez de se apoiar num criador de relatórios visual implica mais código, e a contrapartida vale a pena enunciar de forma clara: passa a ser dono de cada coordenada, o que é precisamente o que deseja para trabalhos batch (em lote) do lado do servidor, faturas e exportações de auditoria que têm de ser renderizadas identicamente em qualquer máquina, e exatamente a sobrecarga que preferiria evitar para uma listagem interna pontual. Para os primeiros, o controlo compensa na primeira vez que um relatório tiver de aparentar o mesmo em produção tal como aparentava na sua secretária
As regras e faixas sombreadas acima baseiam-se nos mesmos primitivos vetoriais e de cor cobertos na demonstração de desenho em canvas, caso pretenda tratar as chamadas a Rectangle, MoveTo e LineTo isoladamente em primeiro lugar. Os primitivos de desenho aqui usados fazem parte do Componente HotPDF para Delphi e C++Builder