Como criar QRShape em tempo de execução?
Olá amigos
Estou precisando criar alguns objetos em tempo de execução no QuickReport
Consegui criar TQRLabel com sucesso. Mas não estou conseguindo criar os TQRShape.
Ao executar o preview do relatório, os componentes do tipo TQRShape geram erro de acesso na função GetCanvas da classe TQRPrinter na unit QRPrntr;
function TQRPrinter.GetCanvas;
begin
result := FCanvas; //ERRO DE ACESSO AQUI
end;
Abaixo o código de minha implementação
Aguém tem uma idéia do problema?
Qualquer ajuda é bem-vinda?
Estou precisando criar alguns objetos em tempo de execução no QuickReport
Consegui criar TQRLabel com sucesso. Mas não estou conseguindo criar os TQRShape.
Ao executar o preview do relatório, os componentes do tipo TQRShape geram erro de acesso na função GetCanvas da classe TQRPrinter na unit QRPrntr;
function TQRPrinter.GetCanvas;
begin
result := FCanvas; //ERRO DE ACESSO AQUI
end;
Abaixo o código de minha implementação
procedure TnplanilhaProducaoImpressao.QRGroup1BeforePrint(
Sender: TQRCustomBand; var PrintBand: Boolean);
var
campoCab, campoDet : TQRLabel;
separadorCab : TQRShape;
i : integer;
begin {CRIA A LISTA DE CAMPOS DE ACORDO COM OS AVIAMENTOS VINCULADOS AO PRODUTO}
dmq.QplanilhaProducaoAviamentos.Close;
dmq.QplanilhaProducaoAviamentos.ParamByName(´PCODIGO´).AsString := dmq.QplanilhaProducaoCODIGO.AsString;
dmq.QplanilhaProducaoAviamentos.Open;
if dmq.QplanilhaProducaoAviamentos.IsEmpty = False then
begin
listaSeparadorCab := TList.Create;
listaCamposCab := TList.Create;
listaCamposDet := TStringList.Create;
i :=1;
dmq.QplanilhaProducaoAviamentos.First;
while not dmq.QplanilhaProducaoAviamentos.Eof do
begin
//separador da group header ou cabeçalho
separadorCab := TQRShape.Create(QuickRep1);
separadorCab.Parent := QRGroup1;
separadorCab.Tag:= 0;
separadorCab.VertAdjust := 0;
separadorCab.Left := 510 + (i * 50);
separadorCab.Top:= 31;
separadorCab.Width := 1;
separadorCab.Height := 20;
separadorCab.Frame.Color := clBlack;
separadorCab.Frame.DrawTop := False;
separadorCab.Frame.DrawBottom := False;
separadorCab.Frame.DrawLeft := False;
separadorCab.Frame.DrawRight := False;
separadorCab.Shape := qrsRectangle;
separadorCab.RoundFactor := 0;
separadorCab.Brush.Style := bsSolid;
separadorCab.Brush.Color := clRed;
separadorCab.Pen.Color := clRed;
separadorCab.Name := ´separadorCab´ + IntToStr(i);
listaSeparadorCab.Add(separadorCab);
//campos da group header ou cabeçalho
campoCab := TQRLabel.Create(Self);
campoCab.Parent := QRGroup1;
campoCab.Alignment := taCenter;
campoCab.Font.Style := [fsBold];
campoCab.Left := 463 + (i * 50);
campoCab.Top:= 34;
campoCab.Width := 42;
campoCab.AutoSize := False;
campoCab.Name := ´campoCab´ + IntToStr(i);
TQRLabel(campoCab).Caption := dmq.QplanilhaProducaoAviamentosSIGLA.AsString;
listaCamposCab.Add(campoCab);
//campos da banda detalhe
campoDet := TQRLabel.Create(Self);
campoDet.Parent := BandaDetalhe;
campoDet.Alignment := taRightJustify;
campoDet.Left := 463 + (i * 50);
campoDet.Top:= 1;
campoDet.Width := 42;
campoDet.AutoSize := False;
campoDet.Name := ´campoDet´ + IntToStr(i);
listaCamposDet.AddObject(dmq.QplanilhaProducaoAviamentosQUANTIDADE.AsString, campoDet); //guarda na propriedade strings da listaCampos a QUANTIDADE DO AVIAMENTO, lembrando que um produto pode ter n aviamentos
i := i + 1;
dmq.QplanilhaProducaoAviamentos.Next;
end;
end;
end;Aguém tem uma idéia do problema?
Qualquer ajuda é bem-vinda?
Delmar
Curtidas 0
Respostas
Delmar
24/06/2009
Trago mais informações, pois tentei simular em outras bandas
Dado que eu preciso criar estes objetos no envento BeforePrint da banda, pois eles variam em quantidade e informações conforme o registro corrente,
ao executar o evento BeforePrint da banda:
a) objetos do tipo TQRLabels são criados e renderizados com sucesso.
b) porém objetos do tipo TQRShape são criados com sucesso, mas não conseguem ser renderizados, é como se o objeto canvas não tivesse sido criado, gerando violação de acesso no GetCanvas conforme a mensagem anterior.
Dado que eu preciso criar estes objetos no envento BeforePrint da banda, pois eles variam em quantidade e informações conforme o registro corrente,
ao executar o evento BeforePrint da banda:
a) objetos do tipo TQRLabels são criados e renderizados com sucesso.
b) porém objetos do tipo TQRShape são criados com sucesso, mas não conseguem ser renderizados, é como se o objeto canvas não tivesse sido criado, gerando violação de acesso no GetCanvas conforme a mensagem anterior.
GOSTEI 0
Delmar
24/06/2009
Se alguém desejar simular
A)Crie uma nova aplicação
B) Coloque um botão e no seu evento OnClick o código
C) Coloque um QuickRep e uma banda Detalhe com altura de 151 px ou 40 mm e no evento BeforePrint da banda Detalhe declare
e entre o begin e o end do procedimento cole o código abaixo
Execute a aplicação, se eu não esqueci de nenhum código, a simulação será igual, considerando que eu uso a versão 5.02 do QR e D7
Se colher o mesmo erro, comente a parte do QRShape e verá que o QRLabel é renderizado.
No aguardo de uma possível solução continuamos pesquisando. Por qualquer ajuda, sou grato.
A)Crie uma nova aplicação
B) Coloque um botão e no seu evento OnClick o código
QuickRep1.Preview;
C) Coloque um QuickRep e uma banda Detalhe com altura de 151 px ou 40 mm e no evento BeforePrint da banda Detalhe declare
var lb : TQRLabel; sh : TQRShape;
e entre o begin e o end do procedimento cole o código abaixo
lb := TQRLabel.Create(Form1); with lb do begin Parent := DetailBand1; Left :=50; Top :=10; Caption := ´LIXO´; Font.Size := 12; end; sh := TQRShape.Create(Form1); with sh do begin Parent := DetailBand1; Left :=50; Top :=10; Height := 100; Width := 200; end;
Execute a aplicação, se eu não esqueci de nenhum código, a simulação será igual, considerando que eu uso a versão 5.02 do QR e D7
Se colher o mesmo erro, comente a parte do QRShape e verá que o QRLabel é renderizado.
No aguardo de uma possível solução continuamos pesquisando. Por qualquer ajuda, sou grato.
GOSTEI 0
Gabriele Felice
24/06/2009
Conseguiu?
Estou tentando e não estou conseguindo.
Estou tentando e não estou conseguindo.
GOSTEI 0