Como criar QRShape em tempo de execução?

Delphi

24/06/2009

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

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

Delmar

Curtidas 0

Respostas

Delmar

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.


GOSTEI 0
Delmar

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

Gabriele Felice

24/06/2009

Conseguiu?
Estou tentando e não estou conseguindo.
GOSTEI 0
POSTAR