Fórum Como criar QRShape em tempo de execução? #371585
24/06/2009
0
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
Curtir tópico
+ 0Posts
24/06/2009
Delmar
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
24/06/2009
Delmar
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
03/08/2018
Gabriele Felice
Estou tentando e não estou conseguindo.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)