Array
(
)

Criando TQRLabel em tempo de execução

Jrjoliv2003
   - 30 set 2004

1º Dúvida:
Estou tentado criar QrLabel em tempo de execução. Existe uma quantidade que é passada tb em tempo de execução. Porém não aparece nada. Eu acho que tem alguma coisa errada no código. Coloco esse código no BeforePrint da banda Detail.
var
campo:TQRLabel;
begin
campo:=TQRLabel.Create(QuickRep1.Bands.DetailBand.Parent);
with campo do
Begin
Left:=pos+20;
Top:=0;
end;
campo.Caption:=ADOQuery1Campo.Text;
end;
end;

2º Dúvida:
Como eu posso saber o nome de cada componente criado para inserir dados tb em tempo de execução?

Valeu a força!!!

JR.


Thomaz_prg
   - 01 out 2004

Bom, onde você colocou
campo:=TQRLabel.Create(QuickRep1.Bands.DetailBand.Parent);

Tente colocar,
campo:=TQRLabel.Create(QuickRep1.Bands.DetailBand);

É que da forma com a qual você estava fazendo, você estava vinculando o QRLabel ao relatorio e não a band, por isso não aparecia nada.


E quanto ao name, após você ter criado o componente, isto é, após voce ter colocado a linha acima citada, indique o nome do componente:

Por exemplo:
campo.name := ´qrlabelcampo1´;


Jrjoliv2003
   - 01 out 2004

Fiz esse código e continua não parecendo nada:

l:=150;
for j:=1 to 4 do
Begin
campo:=TQRLabel.Create(QuickRep1.Bands.DetailBand);
with campo do
Begin
l:=l+20;
left:=l;
top:=32;
Name:=´QRLabelNome´+inttostr(j);
Caption:=´Teste´;
end;
end;

Como devo colocar o item Parent?

Valeu a força!!!

JR.


Rômulo Barros
   - 01 out 2004

Ontem, 30/09/04, precisei criar diversos componentes QRLabel em run time e tb não consegui. Terminei deixando uns 40 fixos no relatório.


Jrjoliv2003
   - 01 out 2004

Fiz esse código e continua não parecendo nada:

l:=150;
for j:=1 to 4 do
Begin
campo:=TQRLabel.Create(QuickRep1.Bands.DetailBand);
with campo do
Begin
l:=l+20;
left:=l;
top:=32;
Name:=´QRLabelNome´+inttostr(j);
Caption:=´Teste´;
end;
end;

Como devo colocar o item Parent?

Valeu a força!!!

JR.


Rômulo Barros
   - 01 out 2004


Citação:
Como devo colocar o item Parent?


#Código

Parente := QuickRep1.Bands.DetailBand;



Rhosaka
   - 01 out 2004

antes de chamar o preview ou print do quickreport chame o metodo prepare;

QuickReport1.Prepare;
QuickReport1.PreviewModal;

[]´s


Thomaz_prg
   - 01 out 2004

Bom, tente assim:
procedure TForm1.Button1Click(Sender: TObject);
var
campo:TQRLabel;
begin
campo := TQRLabel.Create(nil);
campo.ParentReport := QuickReport2;
campo.Parent := QuickReport2.QRBand1;
campo.Name := ´NOMEDOCAMPO´;
campo.Top := 0;
campo.Left := 0;
campo.Caption := ´Teste de Criação em Tempo de Execução´;
QuickReport2.Prepare;
QuickReport2.Preview;
end;

Bom, criando diretamente dentro do relatório pode ocasionar um erro. Tente criá-los antes de imprimir. Mais ou menos da forma com que está acima.


Jrjoliv2003
   - 01 out 2004

Blz. Deu certo!

Ficou assim:

var
campo:TQRLabel;
i, L:integer;
begin
L:=120;
for i:=1 to 4 do
Begin
L:=L+10;
campo := TQRLabel.Create(nil);
campo.ParentReport := QuickRep1;
campo.Parent := QuickRep1.QRBand1;
campo.Name := ´Name´+inttostr(i);
campo.Top := 0;
campo.Left := L;
campo.Caption := ´Teste´;
QuickRep1.Prepare;
QuickRep1.Preview;
end;
end;

Valeu a força!!

Gostaria de levantar uma nova questão: montar um array dinâmico para armarzenar uma quantidade de QRLabel´s em tempo de execução. Como poderia declarar um array mas determinar o tamanho em tempo de execução.

JR.


Rômulo Barros
   - 01 out 2004

#Código

Var
vetLabels : Array of qrlabels;
...
SetLength(vetLabels,5);
...



Jrjoliv2003
   - 03 out 2004

Blz. Deu certo. Está criando. Porém quando fecho a visualização de impressão e o programa gera essa exception:

Exception EIvalidPointe in module ProjectCurso.exe at 00003CC5
Invalid pointer operation..


O q é isso?

Valeu a força!!

JR.


Jrjoliv2003
   - 04 out 2004

Para ficar melhor explicado:

tenho um form chamado FormPricipal em que declarei como pública uma
variável:
aula: array of TQRLabel;

Quando clico no botão, são executados comandos de criação dos
label´s conforme a quantidade passada. Conforme vou criando tb vou
posicionando nos devidos lugares:
SetLength(aula,qtd_comp);
for i:=1 to qtd_comp do
Begin
aula[i]:=TQRLabel.Create(nil);
aula[i].ParentReport:=FormImpFichaChamada.QuickRep1;
aula[i].Parent:=FormImpFichaChamada.QuickRep1.Bands.PageHeaderBand;
aula[i].left....

preparo e chamo o relatório:
FormImpFichaChamada.QuickRep1.Prepare;
FormImpFichaChamada.QuickRep1.Preview;

Até aí tudo bem tudo aparece perfeito.
Qunado fecho o Relatório e fecho o FormPrincipal aparece o erro.
Tenho a impressão que tenho que liberar a memória mas não sei como fazer isso.

Valeu a Força!!!

JR.


Thomaz_prg
   - 04 out 2004

Para destruir:

Var
o:TObject;


o := QuickReport1.FindCOmponent(´qrlabel1´);
if (o Nil) AND (o is TQrLabel ) then
(o as TQrLabel).Free;


Jrjoliv2003
   - 04 out 2004

Vou testar!!
Qualquer resultado renvio resposta.

Valeu a força!!

JR.


Jrjoliv2003
   - 04 out 2004

Galera não tô conseguindo!!
O código que está no botão é esse:

Está declara uma variável pública aula: array of TQRLabel;

procedure TFormPrincipal.BitBtn1Click(Sender: TObject);
var
qtd_comp, i, left_aula, left_traco, left_dt, linha1_top, linha2_top, linha3_top:integer;
begin
left_aula:=125;
linha1_top:=60;

{Número de Aulas}
FormImpFichaChamada.IBQImpNumAulas.Last;
qtd_comp:=FormImpFichaChamada.IBQImpNumAulas.RecordCount;
FormImpFichaChamada.IBQImpNumAulas.First;

SetLength(aula,qtd_comp);

{criando os QRLabel}
for i:=1 to qtd_comp do
Begin
aula[i]:=TQRLabel.Create(nil);
aula[i].ParentReport:=FormImpFichaChamada.QuickRep1;
aula[i].Parent:=FormImpFichaChamada.QuickRep1.Bands.PageHeaderBand;
aula[i].Name:=´QRLabelAula´ + inttostr(i);
aula[i].Top:=linha1_top
left_aula:=left_aula + 88;
aula[i].Left:=left_aula;
aula[i].Caption:=´Teste´;
end;
FormImpFichaChamada.QuickRep1.Prepare;
formimpfichachamada.QuickRep1.Preview;
end;

Ao clicar no botão ele abre o relatório normalmente.
O erro que aparece quando fecho tudo:

Exception EIvalidPointe in module ProjectCurso.exe at 00003CC5
Invalid pointer operation..

Quem puder ajudar....

JR.


Jrjoliv2003
   - 05 out 2004

Galera!!

Infelizmente não estou em minha máquina. Mas como estou empenhado em resolver este problema, simulei uma nova situação com o problema em uma outra máquina. Durante a implementação lembrei que um array começa do 0 e não do 1. Meu código está com o problema está assim:

for i:=1 to qtd_comp do
Begin
aula[i]:=TQRLabel.Create(nil);

Quando mudeu para zero não deu mais o erro!!!!

Ficou:

for i:=0 to qtd_comp-1 do
Begin
aula[i]:=TQRLabel.Create(nil);

Vou testar assim que puder e eviarei resposta!!!

JR.


Jrjoliv2003
   - 06 out 2004

Galera - Resolvido!!

Realmente era probelam no índice passado no array. Fiz um teste com o projeto que estava com problema e tudo funcionou.
Ficou assin:


for i:=0 to qtd_comp-1 do
Begin
aula[i]:=TQRLabel.Create(nil);

Valeu !!!

JR.


Rômulo Barros
   - 20 out 2004

:arrow: Acontece a mesma coisa comigo quando utilizo array dinâmico. Ajuda aew, galera !!!