Fórum Alinhamento vertical (em relação ao eixo y) em componentes QRLabel e QRDBText (top, middle, bottom) #414812
29/03/2012
0
Depois de algumas pesquisas e, de fato, não me lembro jamais ter visto o que estou procurando, vim pedir ajuda aqui.
AMBIENTES
A) Delphi 7 Enterprise e QuickReport 5.02
B) Delphi 2010 Arquiteto e QuickReport 5.04.2
PROBLEMA
Alinhamento vertical (em relação ao eixo y) em componentes QRLabel e QRDBText do QuickReport (top, middle, bottom). Colegas, NÃO É ESCREVER NA VERTICAL. Para escrever na vertical tem o QRAngLbl ou o canvas. Também NÃO BUSCO OUTROS COMPONENTES. É dentro do ambiente supracitado.
O que eu preciso, seria o equivalente a uma propriedade VerticalAlignment com as opções (top, middle, bottom).
O que eu já tentei, mas não funcionou:
SetTextAlign(QRLabel1.Handle, TA_BOTTOM); //alinhar pelo rodapé do QRLabel, mas não surtiu efeito
O que eu penso que poderia ser feito: modificar o código fonte do QuickReport, mas não sei aonde.
Todas sugestões serão bem-vindas.
Juntos podemos chegar a uma solução, solução que poderia ajudar muitos profissionais.
Pois acredito que muitos, assim como eu, já colocou uma banda detalhe, configurou, por exemplo, 5 mm de altura na banda detalhe, centralizou os QRLabels e QRDBTexts dentro da banda detalhe afastando-os um pixel do topo e um pixel do rodapé (idem 0.3 mm) da banda detalhe, escolheu o tipo e o tamanho da fonte solicitada pelo cliente, mas o texto sempre fica mais no topo do que no centro ou no rodapé internamento ao próprio componente.
E aí começa empurrar os QRLabels e QRDBTexts mais para baixo, afastando mais pixels do topo da banda, mas aí a altura dos QRLabels e QRDBTexts não dão mais certo, começam ultrapassar o rodapé da banda, enfim, perde um monte de tempo ajeitando a posição e altura do QRLabel, e as vezes, até diminuindo o tamanho da fonte para ter algum resultado mais centralizado em relação as linhas da banda detalhe (configurações do frame).
Caso não me expressei bem, não fazendo compreender claramente a solução que desejo, por favor, peçam mais detalhes.
Aos moderadores e demais colegas: caso já existir esta solução em outro tópico, só passar o link na resposta, que em seguida, peço para remover estes tópico, para evitar a duplicidade do tópico para um mesmo problema.
Atenciosamente
Delmar Wichnieski
Delmar Observação)
Curtir tópico
+ 0Posts
29/03/2012
Joel Rodrigues
Uma saída, seguindo sua ideia de alterar o código, seria criar um novo Label herdando do QrLabel, mas foge da sua realidade, pois você não deseja outro componente.
Talvez programar a posição (top e left) do QrLabel em tempo de execução resolvesse, mas quem vai ficar programando em cada relatório e para cada label, não é mesmo?
Ao meu ver, atualmente, é melhor migrar para outra ferramenta de relatório que disponha de mais recursos ou adequar-se ao que está ao nosso alcance com o Quick.
Boa sorte.
Gostei + 0
29/03/2012
Delmar Observação)
Mas quem sabe sabe os primeiros progressos sejam adotados pelo fabricante para que seu produto tenha mais recursos.
Na unit unit QRCtrls, na procedure procedure TQRCustomLabel.PaintToCanvas
commente a linha
VPos := StartY + I * LineHeight;
e use o código da linha abaixo para alinhamento Middle:
VPos := Trunc( (Height - (FFormattedLines.Count * LineHeight)) / 2) + 1 + (I * LineHeight); //ALTURA (Height) MENOS O QUE CONSOME (FFormattedLines.Count * LineHeight) É IGUAL AO RESTO. DIVIDE O RESTO PARA QUE FIQUE METADE EM CIMA E METADE EM BAIXO. SOMA MAIS UM. E SOMA O CONTADOR I VEZES A ALTURA DA LINHA (LineHeight) PARA QUE AS DEMAIS LINHAS SEJAM DESLOCADAS PELA PRÓPRIA ALTURA PARA BAIXO.
ou use o código da linha abaixo para alinhamento Bottom:
VPos := Height - (FFormattedLines.Count * LineHeight) + (I * LineHeight); //ALTURA (Height) MENOS O QUE CONSOME (FFormattedLines.Count * LineHeight) É IGUAL AO RESTO. E SOMA O CONTADOR I VEZES A ALTURA DA LINHA (LineHeight) PARA QUE AS DEMAIS LINHAS SEJAM DESLOCADAS PELA PRÓPRIA ALTURA PARA BAIXO.
Porém, este código não funciona para o preview e não possui testes para que seja oficialmente adotado. Mas funciona se apenas compilar o formulário contendo um QuickReport, uma banda Título, por exemplo, com um QRLabel dentro dela.
Agora estou trabalhando para modificar o código da procedure TQRCustomLabel.PrintToCanvas.
Gostei + 0
29/03/2012
Delmar Observação)
Na procedure TQRCustomLabel.PrintToCanvas
na declarações das variáveis
acrescentar de
X, Y: extended;
para
X, Y, YTop : extended;
substituir este trecho de código
while (FCurrentLine <= FFormattedLines.Count - 1) and CanPrint do
begin
PrintLine(FCurrentLine);
inc(FCurrentLine);
end;
Por este
YTop := Y; //incluir esta linha para YTop receber o valor de Y
while (FCurrentLine <= FFormattedLines.Count - 1) and CanPrint do
begin
//Y := YTop + ((Size.Height - (FFormattedLines.Count * LineHeight)) / 2) + (FCurrentLine * LineHeight); //descomente a linha para alinhamento Middle
//Y := YTop + (Size.Height - (FFormattedLines.Count * LineHeight)) + (FCurrentLine * LineHeight); //descomente a linha para alinhamento Bottom
PrintLine(FCurrentLine);
inc(FCurrentLine);
end;
Fiz apenas um teste com uma banda cabeçalho, uma banda título e uma banda sumário. Não sei que implicações ainda poderá causar em bandas filhas, detalhes, subdetalhes, bandas de agrupamento.
É preciso testar em vários relatórios para ver o que acontece. Também apenas visualizei no preveiw, não enviei para a impressora para ver se iria fidelizar.
Não esqueça, se for modificar, salve uma cópia da unit original.
Obs: não estou incentivando piratear nada, apenas compartilhando algumas horas de estudo nas units do QuickReport e compartilhando o conhecimento sobre os trechos de códigos que consegui criar.
Acredito que a desenvolvedora pode bem mais do que eu (do que nós), não sei porque até hoje não acordou para oferecer este tipo de alinhamento.
Abraço e retornem os testes, outros ajustes, testes em outras bandas, etc, etc, etc.
Gostei + 0
29/03/2012
Delmar Observação)
Gostei + 0
06/04/2012
Delmar Observação)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)