GARANTIR DESCONTO

Fórum Alinhamento vertical (em relação ao eixo y) em componentes QRLabel e QRDBText (top, middle, bottom) #414812

29/03/2012

0

Prezados colegas da lista

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)

Delmar Observação)

Responder

Posts

29/03/2012

Joel Rodrigues

Rapaz, confesso que até hoje também não vi nada sobre. De fato é uma deficiência dos componentes, mas como o QuickReport não é open source, não podemos editar seu código, certo?
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.
Responder

Gostei + 0

29/03/2012

Delmar Observação)

Então, se é (Open Source) Código Aberto ou não, fico na dúvida, pois já vi muitas vezes trechos de códigos falando sobre preview personalizado. Agora gratuito (Free) para comercializar certamente nã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.
Responder

Gostei + 0

29/03/2012

Delmar Observação)

Mais um pequeno progresso

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.
Responder

Gostei + 0

29/03/2012

Delmar Observação)

Outra dica, configure para True as propriedades DrawTop e DrawBottom na propriedade Frame do QRLabel para visualizar o alinhamento Middle ou Bottom dentro do próprio componente.
Responder

Gostei + 0

06/04/2012

Delmar Observação)

RESOLVIDO, FUNCIONANDO, TESTADO E APROVADO EM DOCUMENTOS IMPRESSOS. Eu mesmo montei a (solução/fórmulas) e demais recursos adicionais para o QuickReport com uma propriedade VerticalAlignment no object inspector com taTop, taVerticalAlignment e taBottom. Quando o fabricante precisar é só me chamar.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar