Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Erro ao executar


António44

Question

Já tentei de varias maneiras para mostrar o relatorio quando se dá o duplo click no file da report guardada,agora tentei esta procedure no preview e não dá ...quer dizer a report é mostrada na perfeicão muda as paginas tudo correcto apenas quando executa retorna sempre um erro '''Access violation at address 0045D643 in module Gestor.exe read of adress 00000000.

Aqui a procedure....

procedure TfrmPreview.Resgata;
begin
    QRPreview.QRPrinter.Load(ParamStr(1));
   Caption := 'A gerar relatório, por favôr aguarde...';
      if QRPreview.QRPrinter.Title = '' then
          QRPreview.QRPrinter.Title := (ParamStr(1));
            if QRPreview.QRPrinter.PageCount = 1 then
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' pagina'
        else
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' paginas';

        bPleaseInit := True;
  Init;
end;
Esta roda em primeiro lugar Main Form.
procedure TVisualizar.QuickRep1Preview(Sender: TObject);
begin
  Application.CreateForm(TfrmPreview, frmPreview);
  with frmPreview do
  begin
        if ParamCount > 0 then
   if FileExists(ParamStr(1)) then
   begin
pQuickReport:= QuickRep1;
QRPreview.QRPrinter := TQRPrinter(Sender);
Resgata;
show;
  end  else
Caption := 'A gerar relatório, por favôr aguarde...';
pQuickReport:= QuickRep1;
QRPreview.QRPrinter := TQRPrinter(Sender);
Show;
 end;
   end;
end.
Aqui o code completo se executar o executavel ele roda na perfeição mas quando dou duplo click no report guardado...funciona mas dando o erro já descrito em cima. Main form.
unit UnitVisualizar;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, Qrctrls, quickrpt, DBTables, ExtCtrls,qrprntr,Registry,ShlObj,
  qrextra,qrhtml;


type
  TVisualizar = class(TForm)
    QuickRep1: TQuickRep;
    QRBand1: TQRBand;
    QRLabel1: TQRLabel;
    QRLabel2: TQRLabel;
    procedure FormCreate(Sender: TObject);
    procedure QuickRep1Preview(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
            WhichPreviewToUse: integer;
        bCanPrint: boolean;
          procedure RegistrarExtensaoQRP;
  end;

var
  Visualizar: TVisualizar;

implementation

uses Unit1;

{$R *.DFM}

procedure TVisualizar.RegistrarExtensaoQRP;
var
_reg: TRegistry;
begin
_reg := TRegistry.Create;
try
_reg.RootKey := HKEY_CLASSES_ROOT;
_reg.LazyWrite := False;
_reg.OpenKey('GestorV', True);
_reg.WriteString('', 'Relatórios do Gestor de portarias');
_reg.CloseKey;
_reg.OpenKey('GestorV\shell\open\command', True);
_reg.WriteString('', ParamStr(0) + ' "%1"');
_reg.CloseKey;
_reg.OpenKey('GestorV\DefaultIcon', True);
_reg.WriteString('', ParamStr(0) + ',0');
_reg.CloseKey;
_reg.OpenKey('.QRP', True);
_reg.WriteString('', 'GestorV');
_reg.CloseKey;

finally
_reg.free;
end;
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;

procedure TVisualizar.FormCreate(Sender: TObject);
begin
RegistrarExtensaoQRP;
WhichPreviewToUse := 0;
bCanPrint := True;
with QuickRep1 do
begin
preview;
end;
free;
end;
procedure TVisualizar.QuickRep1Preview(Sender: TObject);
begin
  Application.CreateForm(TfrmPreview, frmPreview);
  with frmPreview do
  begin
        if ParamCount > 0 then
   if FileExists(ParamStr(1)) then
   begin
pQuickReport:= QuickRep1;
QRPreview.QRPrinter := TQRPrinter(Sender);
Resgata;
show;
  end  else
Caption := 'A gerar relatório, por favôr aguarde...';
pQuickReport:= QuickRep1;
QRPreview.QRPrinter := TQRPrinter(Sender);
Show;
 end;
   end;
end.
Preview...
unit unit1;


interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, Spin, qrprntr,quickrpt,qrextra,qrhtml,
  Buttons,Mylabel, TFlatSpeedButtonUnit,TypInfo,ShlObj;

type
  TfrmPreview = class(TForm)
    Panel1: TPanel;
    QRPreview: TQRPreview;
    sePage: TSpinEdit;
    seZoom: TSpinEdit;
    SaveDialogExport: TSaveDialog;
    SpinEditCopies: TSpinEdit;
    Panel2: TPanel;
    sbFirstPage: TFlatSpeedButton;
    sbPreviousPage: TFlatSpeedButton;
    sbNextPage: TFlatSpeedButton;
    sbLastPage: TFlatSpeedButton;
    myLabel3d1: TmyLabel3d;
    ZoomToFit: TFlatSpeedButton;
    ZoomTo100: TFlatSpeedButton;
    ZoomToWidth: TFlatSpeedButton;
    PrintSetup: TFlatSpeedButton;
    Print: TFlatSpeedButton;
    myLabel3d2: TmyLabel3d;
    lblCopies: TmyLabel3d;
    Load: TFlatSpeedButton;
    Save: TFlatSpeedButton;
    BitBtnExit: TFlatSpeedButton;
    Bevel1: TBevel;
    procedure Init;
    procedure sePageChange(Sender: TObject);
    procedure seZoomChange(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure cmdExitClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
    procedure FormCreate(Sender: TObject);
    procedure sbFirstPageClick(Sender: TObject);
    procedure sbPreviousPageClick(Sender: TObject);
    procedure sbNextPageClick(Sender: TObject);
    procedure sbLastPageClick(Sender: TObject);
    procedure ZoomToFitClick(Sender: TObject);
    procedure ZoomTo100Click(Sender: TObject);
    procedure ZoomToWidthClick(Sender: TObject);
    procedure PrintSetupClick(Sender: TObject);
    procedure PrintClick(Sender: TObject);
    procedure SaveClick(Sender: TObject);
    procedure CancelReport;
    procedure LoadClick(Sender: TObject);
    procedure BitBtnExitClick(Sender: TObject);
  private
    { Private declarations }
  public
    pQuickreport : TQuickRep;
    bPleaseInit : Boolean;
    sTitle : string;
    bCanPrint: boolean;
    procedure Resgata;
    { Public declarations }
         

  end;

var
  frmPreview: TfrmPreview;

implementation
uses  UnitVisualizar;
{$R *.DFM}

procedure TfrmPreview.sePageChange(Sender: TObject);
begin
  Application.ProcessMessages;
  QRPreview.PageNumber:=sePage.Value;
end;

procedure TfrmPreview.seZoomChange(Sender: TObject);
begin
  Application.ProcessMessages;
  QRPreview.Zoom:=seZoom.Value;
end;

procedure TfrmPreview.Init;
begin
  if bPleaseInit then
  begin
    sePage.MaxValue := QRPreview.QRPrinter.PageCount;
    sePage.MinValue := 1;
    sePage.Value := 1;

    QRPreview.Zoom:=100;
   ZoomTo100.Down := True;

    seZoom.Value:=QRPreview.Zoom;

    bPleaseInit := False;
  end;
end;
procedure TfrmPreview.FormShow(Sender: TObject);
var
  OffSet: integer;
begin
 bPleaseInit := True;
if not bCanPrint then
  begin
    Print.Enabled := bCanPrint;
    Print.Visible := bCanPrint;
    PrintSetup.Enabled := Print.Enabled;
    PrintSetup.Visible := Print.Enabled;
    lblCopies.Visible := Print.Enabled;
    SpinEditCopies.Enabled := Print.Enabled;
    SpinEditCopies.Visible := Print.Enabled;

    OffSet := Load.Left - lblCopies.Left;
    Load.Left := Load.Left - Offset;
    Save.Left := Save.Left - Offset;
    BitBtnExit.Left := BitBtnExit.Left - Offset;
end;

    end;
procedure TfrmPreview.cmdExitClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  QRPreview.QRPrinter := nil;
  Action := caFree;
  release;
end;

procedure TfrmPreview.QRPreviewPageAvailable(Sender: TObject;
  PageNum: Integer);
begin
  Init;
  sePage.MaxValue := PageNum;

  if PageNum = 1 then
    Caption := QRPreview.QRPrinter.Title + ' -  1 página'
  else
    Caption := QRPreview.QRPrinter.Title + ' -  ' + IntToStr(PageNum) + ' páginas';

  case QRPreview.QRPrinter.Status of
    mpReady: Caption := Caption + ' pronto';
    mpBusy: Caption := Caption + ' ocupado';
    mpFinished: Caption := Caption + ' concluido';
  end;
end;

procedure TfrmPreview.FormCreate(Sender: TObject);
begin
  sbFirstPage.Glyph.Handle := LoadBitmap(hinstance, 'QRFIRSTPAGEBITMAP');
  sbPreviousPage.Glyph.Handle := LoadBitmap(hinstance, 'QRPREVPAGEBITMAP');
  sbNextPage.Glyph.Handle := LoadBitmap(hinstance, 'QRNEXTPAGEBITMAP');
  sbLastPage.Glyph.Handle := LoadBitmap(hinstance, 'QRLASTPAGEBITMAP');
  ZoomToFit.Glyph.Handle := LoadBitmap(hinstance, 'QRZOOMTOFITBITMAP');
  ZoomTo100.Glyph.Handle := LoadBitmap(hinstance, 'QRZOOMTO100BITMAP');
  ZoomToWidth.Glyph.Handle := LoadBitmap(hinstance, 'QRZOOMTOWIDTHBITMAP');
  PrintSetup.Glyph.Handle := LoadBitmap(hinstance, 'QRPRINTSETUPBITMAP');
  Print.Glyph.Handle := LoadBitmap(hinstance, 'QRPRINTBITMAP');
  Load.Glyph.Handle := LoadBitmap(hinstance, 'QROPENBITMAP');
  Save.Glyph.Handle := LoadBitmap(hinstance, 'QRSAVEBITMAP');

{ Load strings for hints }

  //ZoomToFit.Hint := LoadStr( SqrZoomToFit );
  //ZoomTo100.Hint := LoadStr( SqrZoom100 );
  //ZoomToWidth.Hint := LoadStr( SqrZoomToWidth );
  //sbFirstPage.Hint := LoadStr( SqrFirstPage );
  //sbLastPage.Hint := LoadStr( SqrLastPage );
  //sbPreviousPage.Hint := LoadStr( SqrPrevPage );
  //sbNextPage.Hint := LoadStr( SqrNextPage );
  //PrintSetup.Hint := LoadStr( SqrPrinterSetup );
  //Print.Hint := LoadStr( SqrPrintReport );
  //Save.Hint := LoadStr( SqrSaveReport );
  //Load.Hint := LoadStr( SqrLoadReport );

  WindowState := wsMaximized;
  FormStyle := fsStayOnTop;
  bCanPrint := True;
end;

procedure TfrmPreview.sbFirstPageClick(Sender: TObject);
begin
  Application.ProcessMessages;
  sePage.Value := 1;
  QRPreview.PageNumber:=sePage.Value;
end;

procedure TfrmPreview.sbPreviousPageClick(Sender: TObject);
begin
  Application.ProcessMessages;
  if sePage.Value > 1 then
  begin
    sePage.Value := sePage.Value - 1;
    QRPreview.PageNumber:=sePage.Value;
  end;
end;

procedure TfrmPreview.sbNextPageClick(Sender: TObject);
begin
  Application.ProcessMessages;
  if sePage.Value < QRPreview.QRPrinter.PageCount then
  begin
    sePage.Value := sePage.Value + 1;
    QRPreview.PageNumber:=sePage.Value;
  end;
end;

procedure TfrmPreview.sbLastPageClick(Sender: TObject);
begin
  Application.ProcessMessages;
  sePage.Value := QRPreview.QRPrinter.PageCount;
  QRPreview.PageNumber:=sePage.Value;
end;

procedure TfrmPreview.ZoomToFitClick(Sender: TObject);
begin
  Application.ProcessMessages;
  QRPreview.ZoomToFit;
  seZoom.Value:=QRPreview.Zoom;
end;

procedure TfrmPreview.ZoomTo100Click(Sender: TObject);
begin
  Application.ProcessMessages;
  QRPreview.Zoom:=100;
  seZoom.Value:=QRPreview.Zoom;
end;

procedure TfrmPreview.ZoomToWidthClick(Sender: TObject);
begin
  Application.ProcessMessages;
  QRPreview.ZoomToWidth;
  seZoom.Value:=QRPreview.Zoom;
end;

procedure TfrmPreview.PrintSetupClick(Sender: TObject);
begin
  {
     With 2.0j, QuickReport will set the report's tag property to -1 if the
     user cancels the printersetup.  By checking for this value, we can call
     the print method directly from setup if the users selects OK
  }
  with pQuickReport do
  begin
    tag := -1; { Just in case you are using an older version }
    PrinterSetup;
    if tag = 0 then
      print;
  end;
end;

procedure TfrmPreview.PrintClick(Sender: TObject);
begin
  Print.Enabled := False;
  QRPreview.qrprinter.Print;
  Print.Enabled := True;
end;

procedure TfrmPreview.SaveClick(Sender: TObject);
var
  aExportFilter : TQRExportFilter;
{$ifndef win32}
  FileExt : string;
  I : integer;
{$endif}
begin
  aExportFilter := nil;
  with TSaveDialog.Create(Application) do
  try
    Filter := QRExportFilterLibrary.SaveDialogFilterString;
{    DefaultExt := cQRPDefaultExt;}
    if Execute then
    begin
    {$ifdef win32}
      if FilterIndex = 1 then
      begin
        if Pos('.', Filename) = 0 then
          Filename := Filename + '.qrp';
        QRPreview.QRPrinter.Save(Filename);
      end
      else
      begin
        try
          aExportFilter := TQRExportFilterLibraryEntry(
            QRExportFilterLibrary.Filters[FilterIndex - 2]).ExportFilterClass.Create(Filename);
          QRPreview.QRPrinter.ExportToFilter(aExportFilter);
        finally
          aExportFilter.Free
        end
      end
    {$else}
      FileExt := ExtractFileExt(Filename);
      if copy(FileExt, 1, 1) = '.' then delete(FileExt, 1, 1);
      if (FileExt = '') or (FileExt = cQRPDefaultExt) then
        QRPreview.QRPrinter.Save(Filename)
      else
      begin
        for I := 0 to QRExportFilterLibrary.Filters.Count - 1 do
        begin
          if TQRExportFilterLibraryEntry(QRExportFilterLibrary.Filters[I]).Extension = FileExt then
          try
            aExportFilter := TQRExportFilterLibraryEntry(
              QRExportFilterLibrary.Filters[I]).ExportFilterClass.Create(Filename);
            QRPreview.QRPrinter.ExportToFilter(aExportFilter);
          finally
            aExportFilter.Free;
          end;
        end;
      end;
    {$endif}
    end;
  finally
    Free;
  end;
end;

procedure TfrmPreview.CancelReport;
begin
  if pQuickReport.qrprinter.status = mpBusy then
    if MessageDlg('Fechar visualizacão ?', mtConfirmation, mbOKCancel,0) = mrOK then
    begin
      QRPrinter.Cancel;
      QRPreview.qrprinter := nil;
    end;
end;

procedure TfrmPreview.LoadClick(Sender: TObject);
begin
  with TOpenDialog.Create(Application) do
  try
    Filter := 'QuickReport files (*.qrp)|*.qrp';
    if Execute then
      if FileExists(FileName) then
      begin
        QRPreview.QRPrinter.Load(Filename);
        QRPreview.PageNumber := 1;
        QRPreview.PreviewImage.PageNumber := 1;
        if QRPreview.QRPrinter.Title = '' then
          QRPreview.QRPrinter.Title := Filename;
        if QRPreview.QRPrinter.PageCount = 1 then
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' pagina'
        else
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' paginas';
        bPleaseInit := True;
        Init;
      end
      else
        ShowMessage('Este ficheiro não pode ser visualizado: ' + FileName);
  finally
    free;
  end;
end;

procedure TfrmPreview.BitBtnExitClick(Sender: TObject);
begin
Application.terminate;
end;

procedure TfrmPreview.Resgata;
begin
    QRPreview.QRPrinter.Load(ParamStr(1));
   Caption := 'A gerar relatório, por favôr aguarde...';
      if QRPreview.QRPrinter.Title = '' then
          QRPreview.QRPrinter.Title := (ParamStr(1));
            if QRPreview.QRPrinter.PageCount = 1 then
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' pagina'
        else
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' paginas';

        bPleaseInit := True;
  Init;
end;

end.

Não consigo que funcione logo abrindo o report guardado sem dar erro, já tentei o Debuguer mas tb não encontro o erro...quando dou duplo click na report guardada vejo pelo gestor de tarefas do win que a memória fica em carga e depois de fazer ok na mensagem do erro ela liberta ...mas porquê e onde???

agradecido.

Abraço

Edited by António44
Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Isso é erro de violação de endereço de memória.... durante a execução uma de suas rotinas, ele está tentando atribuir um valor a um endereço de memória ocupado por outro valor.

verifique as rotinas de operação interna ... use o debug do delphi para achar a rotina com o problema

abraço

Link to comment
Share on other sites

  • 0
Isso é erro de violação de endereço de memória.... durante a execução uma de suas rotinas, ele está tentando atribuir um valor a um endereço de memória ocupado por outro valor.

verifique as rotinas de operação interna ... use o debug do delphi para achar a rotina com o problema

abraço

Não consigo que funcione logo abrindo com duplo click no report guardado sem dar erro, já tentei o Debuguer mas tb não encontro o erro...quando dou duplo click na report guardada vejo pelo gestor de tarefas do win que a memória fica em carga e depois de fazer ok na mensagem do erro ela liberta ...mas porquê e onde???

agradecido.

Abraço

Link to comment
Share on other sites

  • 0

veja o código correto

unit FReportPreview;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ExtCtrls, Spin, qrprntr,quickrpt,qrextra{,qrhtml,qr2const},
Buttons;

type
TfrmPreview = class(TForm)
Panel1: TPanel;
QRPreview: TQRPreview;
Label1: TLabel;
Label3: TLabel;
sePage: TSpinEdit;
seZoom: TSpinEdit;
SaveDialogExport: TSaveDialog;
sbFirstPage: TSpeedButton;
sbPreviousPage: TSpeedButton;
sbNextPage: TSpeedButton;
sbLastPage: TSpeedButton;
ZoomToWidth: TSpeedButton;
ZoomTo100: TSpeedButton;
ZoomToFit: TSpeedButton;
PrintSetup: TSpeedButton;
Print: TSpeedButton;
BitBtnExit: TBitBtn;
lblCopies: TLabel;
SpinEditCopies: TSpinEdit;
Load: TSpeedButton;
Save: TSpeedButton;
procedure Init;
procedure sePageChange(Sender: TObject);
procedure seZoomChange(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure cmdExitClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
procedure FormCreate(Sender: TObject);
procedure sbFirstPageClick(Sender: TObject);
procedure sbPreviousPageClick(Sender: TObject);
procedure sbNextPageClick(Sender: TObject);
procedure sbLastPageClick(Sender: TObject);
procedure ZoomToFitClick(Sender: TObject);
procedure ZoomTo100Click(Sender: TObject);
procedure ZoomToWidthClick(Sender: TObject);
procedure PrintSetupClick(Sender: TObject);
procedure PrintClick(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure BitBtnExitClick(Sender: TObject);
procedure CancelReport;
procedure LoadClick(Sender: TObject);
private
{ Private declarations }
public
pQuickreport : TQuickRep;
bPleaseInit : Boolean;
sTitle : string;
bCanPrint: boolean;
{ Public declarations }
end;

var
frmPreview: TfrmPreview;


implementation

{$R *.DFM}

ResourceString

rspagina = 'página';
rspaginas = 'páginas';
rsListo = ' Listo';
rsOcupado = ' Ocupado';
rsFinalizado = ' Finalizado';
rsParaElreporte = 'Parar este reporte?';
rsImposibleLoadArchivo = 'Não é possivel carregar o arquivo selecionado: ';

procedure TfrmPreview.sePageChange(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.PageNumber:=sePage.Value;
end;

procedure TfrmPreview.seZoomChange(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.Zoom:=seZoom.Value;
end;

procedure TfrmPreview.Init;
begin
if bPleaseInit then
begin
sePage.MaxValue := QRPreview.QRPrinter.PageCount;
sePage.MinValue := 1;
sePage.Value := 1;

{ Force the preview to come up in the zoom setting that we want}
QRPreview.ZoomToFit;
ZoomToFit.Down := True;

seZoom.Value:=QRPreview.Zoom;

bPleaseInit := False;
end;
end;
procedure TfrmPreview.FormShow(Sender: TObject);
var
OffSet: integer;
begin
{ Signal ourselves that we need to update the form }
bPleaseInit := True;

{ If the caller reports want to disable printing, then it will set}
{ the following boolean to false }
if not bCanPrint then
begin
Print.Enabled := bCanPrint;
Print.Visible := bCanPrint;
PrintSetup.Enabled := Print.Enabled;
PrintSetup.Visible := Print.Enabled;
lblCopies.Visible := Print.Enabled;
SpinEditCopies.Enabled := Print.Enabled;
SpinEditCopies.Visible := Print.Enabled;

OffSet := Load.Left - lblCopies.Left;
Load.Left := Load.Left - Offset;
Save.Left := Save.Left - Offset;
BitBtnExit.Left := BitBtnExit.Left - Offset;
end;
end;

procedure TfrmPreview.cmdExitClick(Sender: TObject);
begin
Close;
end;

procedure TfrmPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ You must clear the preview's qrpinter property}
QRPreview.QRPrinter := nil;
{ tell Delphi to free this form automaticly }
Action := caFree;
end;

procedure TfrmPreview.QRPreviewPageAvailable(Sender: TObject;
PageNum: Integer);
begin
Init;
sePage.MaxValue := PageNum;

{ Display the number of rendered pages }
if PageNum = 1 then
Caption := QRPreview.QRPrinter.Title + ' - 1 '+ rspagina
else
Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(PageNum) + rspaginas;

{ Here's one way to show the current status of the report }
case QRPreview.QRPrinter.Status of
mpReady: Caption := Caption + ' ' + rsListo;
mpBusy: Caption := Caption + ' ' + rsOcupado;
mpFinished: Caption := Caption + ' ' + rsFinalizado;
end;
end;

procedure TfrmPreview.FormCreate(Sender: TObject);
begin
// Load the glyphs into the buttons
sbFirstPage.Glyph.Handle := LoadBitmap(hinstance, 'QRFIRSTPAGEBITMAP');
sbPreviousPage.Glyph.Handle := LoadBitmap(hinstance, 'QRPREVPAGEBITMAP');
sbNextPage.Glyph.Handle := LoadBitmap(hinstance, 'QRNEXTPAGEBITMAP');
sbLastPage.Glyph.Handle := LoadBitmap(hinstance, 'QRLASTPAGEBITMAP');
ZoomToFit.Glyph.Handle := LoadBitmap(hinstance, 'QRZOOMTOFITBITMAP');
ZoomTo100.Glyph.Handle := LoadBitmap(hinstance, 'QRZOOMTO100BITMAP');
ZoomToWidth.Glyph.Handle := LoadBitmap(hinstance, 'QRZOOMTOWIDTHBITMAP');
PrintSetup.Glyph.Handle := LoadBitmap(hinstance, 'QRPRINTSETUPBITMAP');
Print.Glyph.Handle := LoadBitmap(hinstance, 'QRPRINTBITMAP');
Load.Glyph.Handle := LoadBitmap(hinstance, 'QROPENBITMAP');
Save.Glyph.Handle := LoadBitmap(hinstance, 'QRSAVEBITMAP');

{ Load strings for hints }

{ ZoomToFit.Hint := 'Ajustar na Tela';
ZoomTo100.Hint := 'Aumentar em 100%';
ZoomToWidth.Hint := 'Aumentar em toda a Tela';
sbFirstPage.Hint :='Primera Página';
sbLastPage.Hint := 'Ultima Página';
sbPreviousPage.Hint := 'Página previa';
sbNextPage.Hint := 'Próxima página';
PrintSetup.Hint := 'Setar a Impressora';
Print.Hint := 'Imprimir arquivo';
Save.Hint := 'Salvar arquivo ';
Load.Hint := 'Abrir arquivo';}

{ this is temporary. Not exists the resourcestring in qr2const.rc }
// Exit.Caption := LoadStr( SqrCancel );
{ You can put code in here to control how the form behaves}
WindowState := wsMaximized;
FormStyle := fsStayOnTop;
{ We can disable functionality at runtime }
bCanPrint := True;
end;

procedure TfrmPreview.sbFirstPageClick(Sender: TObject);
begin
Application.ProcessMessages;
sePage.Value := 1;
QRPreview.PageNumber:=sePage.Value;
end;

procedure TfrmPreview.sbPreviousPageClick(Sender: TObject);
begin
Application.ProcessMessages;
if sePage.Value > 1 then
begin
sePage.Value := sePage.Value - 1;
QRPreview.PageNumber:=sePage.Value;
end;
end;

procedure TfrmPreview.sbNextPageClick(Sender: TObject);
begin
Application.ProcessMessages;
if sePage.Value < QRPreview.QRPrinter.PageCount then
begin
sePage.Value := sePage.Value + 1;
QRPreview.PageNumber:=sePage.Value;
end;
end;

procedure TfrmPreview.sbLastPageClick(Sender: TObject);
begin
Application.ProcessMessages;
sePage.Value := QRPreview.QRPrinter.PageCount;
QRPreview.PageNumber:=sePage.Value;
end;

procedure TfrmPreview.ZoomToFitClick(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.ZoomToFit;
seZoom.Value:=QRPreview.Zoom;
end;

procedure TfrmPreview.ZoomTo100Click(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.Zoom:=100;
seZoom.Value:=QRPreview.Zoom;
end;

procedure TfrmPreview.ZoomToWidthClick(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.ZoomToWidth;
seZoom.Value:=QRPreview.Zoom;
end;

procedure TfrmPreview.PrintSetupClick(Sender: TObject);
begin
{
With 2.0j, QuickReport will set the report's tag property to -1 if the
user cancels the printersetup. By checking for this value, we can call
the print method directly from setup if the users selects OK
}
with pQuickReport do
begin
tag := -1; { Just in case you are using an older version }
PrinterSetup;
if tag = 0 then
print;
end;
end;

procedure TfrmPreview.PrintClick(Sender: TObject);
begin
Print.Enabled := False;
QRPreview.qrprinter.Print;
Print.Enabled := True;
end;

procedure TfrmPreview.SaveClick(Sender: TObject);
var
aExportFilter : TQRExportFilter;
{$ifndef win32}
FileExt : string;
I : integer;
{$endif}
begin
aExportFilter := nil;
with TSaveDialog.Create(Application) do
try
Filter := QRExportFilterLibrary.SaveDialogFilterString;
{ DefaultExt := cQRPDefaultExt;}
if Execute then
begin
{$ifdef win32}
if FilterIndex = 1 then
begin
if Pos('.', Filename) = 0 then
Filename := Filename + '.qrp';
QRPreview.QRPrinter.Save(Filename);
end
else
begin
try
aExportFilter := TQRExportFilterLibraryEntry(
QRExportFilterLibrary.Filters[FilterIndex - 2]).ExportFilterClass.Create(Filename);
QRPreview.QRPrinter.ExportToFilter(aExportFilter);
finally
aExportFilter.Free
end
end
{$else}
FileExt := ExtractFileExt(Filename);
if copy(FileExt, 1, 1) = '.' then delete(FileExt, 1, 1);
if (FileExt = '') or (FileExt = cQRPDefaultExt) then
QRPreview.QRPrinter.Save(Filename)
else
begin
for I := 0 to QRExportFilterLibrary.Filters.Count - 1 do
begin
if TQRExportFilterLibraryEntry(QRExportFilterLibrary.Filters[I]).Extension = FileExt then
try
aExportFilter := TQRExportFilterLibraryEntry(
QRExportFilterLibrary.Filters[I]).ExportFilterClass.Create(Filename);
QRPreview.QRPrinter.ExportToFilter(aExportFilter);
finally
aExportFilter.Free;
end;
end;
end;
{$endif}
end;
finally
Free;
end;
end;

procedure TfrmPreview.BitBtnExitClick(Sender: TObject);
begin
Close;
end;

procedure TfrmPreview.CancelReport;
begin
if pQuickReport.qrprinter.status = mpBusy then
if MessageDlg(rsParaElreporte, mtConfirmation, mbOKCancel,0) = mrOK then
begin
QRPrinter.Cancel;
QRPreview.qrprinter := nil;
end;
end;

procedure TfrmPreview.LoadClick(Sender: TObject);
begin
with TOpenDialog.Create(Application) do
try
Filter := 'QuickReport files (*.qrp)|*.qrp';
if Execute then
if FileExists(FileName) then
begin
QRPreview.QRPrinter.Load(Filename);
QRPreview.PageNumber := 1;
QRPreview.PreviewImage.PageNumber := 1;
if QRPreview.QRPrinter.Title = '' then
QRPreview.QRPrinter.Title := Filename;
if QRPreview.QRPrinter.PageCount = 1 then
Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + rspagina
else
Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + rspaginas;
bPleaseInit := True;
Init;
end
else
ShowMessage(rsImposibleLoadArchivo+ FileName);
finally
free;
end;
end;

end.

abraço

Link to comment
Share on other sites

  • 0

Está bom mas o problema é quando quero carregar o report salvo...usando '' QRPreview.QRPrinter.Load(ParamStr(1));''

procedure TfrmPreview.Resgata;
begin
    QRPreview.QRPrinter.Load(ParamStr(1));
   Caption := 'A gerar relatório, por favôr aguarde...';
      if QRPreview.QRPrinter.Title = '' then
          QRPreview.QRPrinter.Title := (ParamStr(1));
            if QRPreview.QRPrinter.PageCount = 1 then
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' pagina'
        else
          Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' paginas';

        bPleaseInit := True;
  Init;
end;
Executo aprocedure aqui quando chamo OnPreview .
unit UnitVisualizar;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, Qrctrls, quickrpt, DBTables, ExtCtrls,qrprntr,Registry,ShlObj,
  qrextra,qrhtml,qr2const;


type
  TVisualizar = class(TForm)
    QuickRep1: TQuickRep;
    QRBand1: TQRBand;
    QRLabel1: TQRLabel;
    QRLabel2: TQRLabel;
    procedure FormCreate(Sender: TObject);
    procedure QuickRep1Preview(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
            WhichPreviewToUse: integer;
        bCanPrint: boolean;
          procedure RegistrarExtensaoQRP;
  end;

var
  Visualizar: TVisualizar;

implementation

uses Unit1;

{$R *.DFM}

procedure TVisualizar.RegistrarExtensaoQRP;
var
_reg: TRegistry;
begin
_reg := TRegistry.Create;
try
_reg.RootKey := HKEY_CLASSES_ROOT;
_reg.LazyWrite := False;
_reg.OpenKey('GestorV', True);
_reg.WriteString('', 'Relatórios do Gestor de portarias');
_reg.CloseKey;
_reg.OpenKey('GestorV\shell\open\command', True);
_reg.WriteString('', ParamStr(0) + ' "%1"');
_reg.CloseKey;
_reg.OpenKey('GestorV\DefaultIcon', True);
_reg.WriteString('', ParamStr(0) + ',0');
_reg.CloseKey;
_reg.OpenKey('.QRP', True);
_reg.WriteString('', 'GestorV');
_reg.CloseKey;

finally
_reg.free;
end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;

procedure TVisualizar.FormCreate(Sender: TObject);
begin

RegistrarExtensaoQRP;
WhichPreviewToUse := 0;
bCanPrint := True;
With QuickRep1 do
begin
Preview;
end;
free;
end;
procedure TVisualizar.QuickRep1Preview(Sender: TObject);
begin
Application.CreateForm(TfrmPreview, frmPreview);
with frmPreview do
  begin
        if ParamCount > 0 then
   if FileExists(ParamStr(1)) then
   begin
pQuickReport:= QuickRep1;
QRPreview.QRPrinter := TQRPrinter(Sender);
bCanPrint := Self.bCanPrint;
resgata;
show;
  end  else
Caption := 'A gerar relatório, por favôr aguarde...';
pQuickReport:= QuickRep1;
QRPreview.QRPrinter := TQRPrinter(Sender);
 bCanPrint := Self.bCanPrint;
Show;
 end;
   end;
end.

Retorna sempre o erro quando vou ao ficheiro guardado e dou um duplo click nele ele abre o preview mostra a report mas retona erro.

Abraço amigo Jhonas.

Link to comment
Share on other sites

  • 0
Está bom mas o problema é quando quero carregar o report salvo...usando '' QRPreview.QRPrinter.Load(ParamStr(1));''

Perceba, que o procedimento abaixo, faz a mesma coisa que o seu procedimento (procedure TfrmPreview.Resgata)

e não ocorre nenhum erro ... com a diferença que não é preciso usar o TRegistry;

OBS: pelo fato de voce estar usando o TRegistry pode ser isso a causa do erro

Porque voce não substitui essa parte do código para ser se funciona no seu código ( ou use todo o código que te passei ... está funcionando perfeitamente )

procedure TfrmPreview.LoadClick(Sender: TObject);
begin
with TOpenDialog.Create(Application) do
try
Filter := 'QuickReport files (*.qrp)|*.qrp';
if Execute then
if FileExists(FileName) then
begin
QRPreview.QRPrinter.Load(Filename);
QRPreview.PageNumber := 1;
QRPreview.PreviewImage.PageNumber := 1;
if QRPreview.QRPrinter.Title = '' then
QRPreview.QRPrinter.Title := Filename;
if QRPreview.QRPrinter.PageCount = 1 then
Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + rspagina
else
Self.Caption := QRPreview.QRPrinter.Title + ' - ' + IntToStr(QRPreview.QRPrinter.PageCount) + rspaginas;
bPleaseInit := True;
Init;
end
else
ShowMessage(rsImposibleLoadArchivo+ FileName);
finally
free;
end;
end;

abraço

Link to comment
Share on other sites

  • 0
erceba, que o procedimento abaixo, faz a mesma coisa que o seu procedimento (procedure TfrmPreview.Resgata)

e não ocorre nenhum erro ... com a diferença que não é preciso usar o TRegistry;

OBS: pelo fato de voce estar usando o TRegistry pode ser isso a causa do erro

Porque voce não substitui essa parte do código para ser se funciona no seu código ( ou use todo o código que te passei ... está funcionando perfeitamente

Jhonas usando o botão pra carregar esta bom.

rocedure TfrmPreview.LoadClick(Sender: TObject);
begin
with TOpenDialog.Create(Application) do
try

mas eu queria que ao dar um duplo em qualquer report ela carregasse logo no meu Preview.!!! e é ai que dá o erro ela carrega logo sem ter que ir no Opendialog se eu tirar a parte do meu codigo ela funciona bem carrega a report em branco e não a que eu queria com os dados depois se ir pelo botão ela corre normal.

Não sei se eu me estou explicando mal ...você esta entendendo?

Abraço.

Link to comment
Share on other sites

  • 0

mas eu queria que ao dar um click duplo em qualquer report ela carregasse logo no meu Preview.!!!

usando o TOpenDialog1, ele já faz isso ao voce selecionar o QRP

mas se voce esta querendo dar um click duplo num arquivo QRP sem ser pelo delphi, voce deve associar o arquivo QRP ao seu programa .exe, como é feito pelo windows

Meu Computador > Ferramentas > Opções de Pasta > Tipos de arquivo

abraço

Link to comment
Share on other sites

  • 0
mas se voce esta querendo dar um click duplo num arquivo QRP sem ser pelo delphi, voce deve associar o arquivo QRP ao seu programa .exe, como é feito pelo windows

É exactanmente isso que o programa faz com aquele code do Registro a extensão .QRP está registada no Windows sem ter que recorrer ao tipo de arquivo e com o meu code com o click duplo no arquivo ele abre o EXE e o arquivo QRP,logo mostrando os dados as paginas tudo certinho só que quando mostra a 1ª página dá aquela mensagem de erro sempre '''Access violation at address 0045D643 in module GestorV.exe read of adress 00000000.

Mas funciona,não fica bloqueado passa as paginas ,imprime etc... mesmo depois se quizer abrir outro pelo OpenDialog tudo bem funciona perfeitamente.

Amigo Jhonas tem jeito de eu mandar pra você o fonte completo.

Abraço.

Edited by António44
Link to comment
Share on other sites

  • 0

Fazendo alguns testes com o seu codigo, entendi exatamente o que voce esta querendo

o uso do registry do windows é para associar o seu exe explicitamente com a extensão QRP

executando pelo delphi não ocorre o problema de violação de endereço, porem executando por fora o erro ocorre ( violação de endereço de memoria )

vou mesclar algumas rotinas do seu código com o meu código ... em alguns relatorios ocorre o erro de (metafile is not valid)

isso porque no relatorio tem figuras .... entretanto o codigo que te passei não abre o seu relatorio por estar vinculado ao registro do windows

como já te envie o codigo, voce tambem pode tentar modifica-lo ... vou fazer algumas alterações e depois te informo

abraço

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...