Agurado comentarios. Criando o seu Preview personalizado para o Rave Report por Adriano Guedes.
Existem vários dicas por ai de como fazer isto, mas essa com certeza nos da liberdade de criar um preview com a nossa cara. Primeira parte: Componentes e Propriedades 1. Um formulário 1.1. Name Form_Visualizacao 2. Coloque no Form_Visualizacao um Painel 2.1. Align alTop 2.2. Name Painel 3. Coloque no Form_Visualizacao um ScrollBox (Additional) 3.1. Align alClient 3.2. Name ScrollBox1 (Para diferenciar da propriedade ScrollBox do RvRenderPreview) Agora vamos colocar componentes do Rave (Rave). 4. RvSystem 4.1. Name ReportSystem 5. RvRenderPreview 5.1. Name RvRenderPreview 5.2. ScrollBox ScrollBox1 6. RvRenderPrint 6.1. Name RvRenderPrint 7. RvRenderPDF 7.1. Name RvRenderPDF 8. RvRenderHTML 8.1. Name RvRenderHTML 9. RvRenderRTF 9.1. Name RvRenderRTF 10. RvRenderText 10.1. Name RvRenderText 11. RvNDRWriter 11.1. Name RvNDRWriter Vamos colocar as caixas de dialogo (Dialogs). 12. OpenDialog 12.1. DefaultExt NDR (coloque apenas as três letras sem ponto) 12.2. Filter 12.2.1. FilterName Rave Report (*.ndr) 12.2.2. Filter *.ndr 12.3. Name OpenDialog 12.4. Options 12.4.1. ofPathMustExist True 12.4.2. ofFileMustExist True 13. SaveDialog 13.1. DefaultExt NDR (coloque apenas as três letras sem ponto) 13.2. Filter 13.2.1. FilterName Filter 13.2.2. Adobe Acrobat (*.pdf) *.pdf 13.2.3. Formato Rich Text (*.rtf) *.rtf 13.2.4. Página da Web (*.html) *.html 13.2.5. Rave Report (*.ndr) *.ndr 13.2.6. Texto sem formatação (*.txt) *.txt 13.3. Name SaveDialog 13.4. Options 13.4.1. ofOverwritePrompt True 13.4.2. ofPathMustExist True 14. PrintDialog 14.1. Name PrintDialog 14.2. Options 14.2.1. poPageNums True 14.2.2. poSelection True 14.3. PrintRange prAllPages Segunda parte: Procedure, Property e Class Em Interface escreva o código abaixo: Protected {Protegendo as propriedades} Vari_Pagi_Numero: integer; Vari_OnGenerate: TNotifyEvent; Vari_Arqu_Entrada: String; Vari_Stre_Entrada: TStream; Vari_OnAfterPreviewPrint: TNotifyEvent; Private Public Class Procedure Most_Arquivo(Const Vari_Arqu_Nome: String); Property Pagi_Numero: integer read Vari_Pagi_Numero write Vari_Pagi_Numero; Property OnGenerate: TNotifyEvent read Vari_OnGenerate write Vari_OnGenerate; Property OnAfterPreviewPrint: TNotifyEvent read Vari_OnAfterPreviewPrint write Vari_OnAfterPreviewPrint; Property Arqu_Entrada: String read Vari_Arqu_Entrada write Vari_Arqu_Entrada; Property Stre_Entrada: TStream read Vari_Stre_Entrada write Vari_Stre_Entrada; end; Declare a variável Vari_Arqu_Aberto: String; Em Implementation escreva o código abaixo: (Declare as procedures em Interface) procedure TForm_Visualizacao.Abri_Arquivo(const Vari_Arqu_Nome: string); begin Try with RvRenderPreview do begin InputFileName := Vari_Arqu_Nome; NDRStream.Free; Render(InputFileName); PrintDialog.MaxPage := RvRenderPreview.Pages; Caption := Application.Title + ' - ' + ExtractFileName (InputFileName); end; Except MessageDlg(Vari_Arqu_Nome + chr(13) + 'O ' + Application.Title + ' não pode ler este arquivo.' + chr(13) + 'Este não é um arquivo válido ou não há suporte para o formato atualmente.',mtWarning,[mbOK],0); end; end; Procedure TForm_Visualizacao.Inic_ReportSystem; Begin If Vari_Arqu_Entrada <> '' Then Begin RvRenderPreview.NDRStream := TFileStream.Create (Vari_Arqu_Entrada, fmOpenRead Or fmShareDenyWrite); End Else Begin RvRenderPreview.NDRStream := Vari_Stre_Entrada; End; RvRenderPreview.Render; ReportSystem.PreviewShowEvent(RvRenderPreview); End; Class Procedure TForm_Visualizacao.Most_Arquivo(Const Vari_Arqu_Nome: String); Begin With TForm_Visualizacao.Create(Application) Do Begin Abri_Arquivo(Vari_Arqu_Nome); Visible := true; End; End; Terceira parte: Botões e eventos Coloque sobre o Painel doze botões, dois edits (um edit para mostrar a pagina atual e outro para mostrar o fator de zoom e seus respectivos labels) e 1 label para mostrar o total de paginas do relatório. 1. 1º edit 1.1. properties 1.1.1. name Edit_Pagina 1.1.2. text 1 1.2. Events 1.2.1. OnKeyDown If Key = 13 then begin RvRenderPreview.RenderPage(StrToInt(Edit_Pagina.Text)); end; 2. 2º edit 2.1. properties 2.1.1. name Edit_Zoom 2.1.2. text 100 2.2. Events 2.2.1. OnKeyDown If Key = 13 then begin RvRenderPreview.ZoomFactor := StrToFloat (Edit_Zomm.Text); end; 3. label para o total de páginas 3.1. capiton 100 3.2. name Labe_Paginas Agora no RvRenderPreview, no evento OnPageChange adicione o código with RvRenderPreview do begin Edit_Pagina.Text := IntToStr(CurrentPage); Edit_Zomm.Text := FloatToStr(ZoomFactor); Labe_Paginas.Caption := IntToStr(Pages); end; 4. 1º Botão 4.1. properties 4.1.1. caption Abrir 4.1.2. name Butt_Abrir 4.2. events 4.2.1. OnClick if OpenDialog.Execute then begin try Abri_Arquivo(OpenDialog.FileName); Vari_Arqu_Aberto := OpenDialog.FileName; Except Vari_Arqu_Aberto := ''; end; end; 5. 2º Botão 5.1. properties 5.1.1. caption Salvar 5.1.2. name Butt_Salvar 5.2. events 5.2.1. OnClick If SaveDialog.Execute then Begin If Vari_Arqu_Aberto <> '' then begin Vari_Arqu_Entrada := Vari_Arqu_Aberto; end; If Vari_Arqu_Entrada <> '' Then Begin RvRenderPreview.NDRStream := TFileStream.Create (Vari_Arqu_Entrada, fmOpenRead Or fmShareDenyWrite); End Else Begin RvRenderPreview.NDRStream := Vari_Stre_Entrada; End; Case SaveDialog.FilterIndex of 1: begin RvRenderPDF.OutputFileName := SaveDialog.FileName; RvRenderPDF.Render(RvRenderPreview.NDRStream); end; 2: begin RvRenderRTF.OutputFileName := SaveDialog.FileName; RvRenderRTF.Render(RvRenderPreview.NDRStream); end; 3: begin RvRenderHTML.OutputFileName := SaveDialog.FileName; RvRenderHTML.Render (RvRenderPreview.NDRStream); end; 4: begin {Ainda não descobri o código para gerar o NDR} end; 5: begin RvRenderText.OutputFileName := SaveDialog.FileName; RvRenderText.Render (RvRenderPreview.NDRStream); end; end; end; 6. 3º Botão 6.1. properties 6.1.1. caption Imprimir 6.1.2. name Butt_Imprimir 6.2. events 6.2.1. OnClick If Vari_Arqu_Aberto = '' then begin If Vari_Arqu_Entrada <> '' Then Begin RvRenderPreview.NDRStream := TFileStream.Create (Vari_Arqu_Entrada, fmOpenRead Or fmShareDenyWrite); End Else Begin RvRenderPreview.NDRStream := Vari_Stre_Entrada; End; RvRenderPrinter.Render(RvRenderPreview.NDRStream); End Else begin RvRenderPrinter.Render(Vari_Arqu_Aberto); end; 7. 4º Botão 7.1. properties 7.1.1. caption Primeira Página 7.1.2. name Butt_Primeira 7.2. events 7.2.1. OnClick RvRenderPreview.RenderPage(1); 8. 5º Botão 8.1. properties 8.1.1. caption Página anterior 8.1.2. name Butt_Anterior 8.2. events 8.2.1. OnClick RvRenderPreview.PrevPage; 9. 6º Botão 9.1. properties 9.1.1. caption Próxima Página 9.1.2. name Butt_Proxima 9.2. events 9.2.1. OnClick RvRenderPreview.NextPage 10. 7º Botão 10.1. properties 10.1.1. caption Última Página 10.1.2. name Butt_Ultima 10.2. events 10.2.1. OnClick RvRenderPreview.RenderPage(RvRenderPreview.Pages); 11. 8º Botão 11.1. properties 11.1.1. caption Mais zoom 11.1.2. name Butt_Mais_Zoom 11.2. events 11.2.1. OnClick RvRenderPreview.ZoomIn; 12. 9º Botão 12.1. properties 12.1.1. caption Menos Zoom 12.1.2. name Butt_Meno_Zoom 12.2. events 12.2.1. OnClick RvRenderPreview.ZoomOut; 13. 10º Botão 13.1. properties 13.1.1. caption Largura da Página 13.1.2. name Butt_Larg_Pagina 13.2. events 13.2.1. OnClick RvRenderPreview.ZoomFactor := RvRenderPreview. ZoomPageWidthFactor; 14. 11º Botão 14.1. properties 14.1.1. caption Página Inteira 14.1.2. name Butt_Pagi_Inteira 14.2. events 14.2.1. OnClick RvRenderPreview.ZoomFactor := RvRenderPreview.ZoomPageFactor; 15. 12º Botão 15.1. properties 15.1.1. caption Sair 15.1.2. name Butt_Sair 15.2. events 15.2.1. OnClick Close; No evento OnClick do Butt_Imprimir está escrito um código que imprime todo o relatório, com o código a baixo podemos controlar outros itens de impressão como: • Imprimir página selecionada (página atual); • Imprimir páginas de um intervalo; • Número de cópias; if PrintDialog.Execute then begin RvRenderNDR.RecoverPrinter; RvRenderPrinter.Collate := PrintDialog.Collate; StatusBar.Panels[3].Text := RPDev.Device; If PrintDialog.PrintRange = prPageNums then begin RvRenderPrinter.FirstPage := PrintDialog.FromPage; RvRenderPrinter.LastPage := PrintDialog.ToPage; end else If PrintDialog.PrintRange = prAllPages then begin RvRenderPrinter.FirstPage := 1; RvRenderPrinter.LastPage := RvRenderPreview.Pages; end; If Vari_Arqu_Aberto = '' then begin If Arqu_Entrada <> '' Then Begin RvRenderPreview.NDRStream := TFileStream.Create (Arqu_Entrada, fmOpenRead Or fmShareDenyWrite); End Else Begin RvRenderPreview.NDRStream := Stre_Entrada; End; end; If PrintDialog.PrintRange = PrSelection then begin RvRenderPrinter.RenderPage(RvRenderPreview.CurrentPage); end Else begin If Vari_Arqu_Aberto = '' then begin RvRenderPrinter.Render(RvRenderPreview.NDRStream); end Else begin RvRenderPrinter.Render(Vari_Arqu_Aberto); end; end; If PrintDialog.PrintRange = prPageNums then begin RvRenderPrinter.FirstPage := 1; RvRenderPrinter.LastPage := RvRenderPreview.Pages; end; RvRenderPrinter.Collate := True; RvRenderPrinter.Copies := 1; end; Quarta parte: Sobrepondo o Preview do Rave Para que tudo isso funcione, temos que sobrepor o Preview do Rave pelo Preview personalizado. Vá ate o ReportSystem do seu projeto, e no evento OverridePreview digite o código abaixo: Case OverrideMode Of omCreate: Begin OverrideForm := TForm_Visualizacao.Create(self); OverrideForm.Caption := ReportSystem.TitlePreview; OverrideForm.Width := ReportSystem.SystemPreview.FormWidth; OverrideForm.Height := ReportSystem.SystemPreview.FormHeight; OverrideForm.WindowState := ReportSystem.SystemPreview.FormState; (OverrideForm As TForm_Visualizacao).ReportSystem := ReportSystem; End; omShow: Begin ReportSystem.SystemPreview.InitPreview((OverrideForm As TForm_Visualizacao).RvRenderPreview); If Assigned(ReportSystem.OnPreviewSetup) Then Begin ReportSystem.OnPreviewSetup((OverrideForm As TForm_Visualizacao).RvRenderPreview); End; (OverrideForm As TForm_Visualizacao).Arqu_Entrada := ReportSystem.SystemFiler.Filename; (OverrideForm As TForm_Visualizacao).Stre_Entrada := ReportSystem.SystemFiler.Stream; (OverrideForm As TForm_Visualizacao).Inic_ReportSystem; If soPreviewModal In ReportSystem.SystemOptions Then Begin OverrideForm.ShowModal; End Else Begin OverrideForm.Show; End; End; omWait: Begin If Not (soPreviewModal In ReportSystem.SystemOptions) Then Begin Repeat Sleep(250); Application.ProcessMessages; Until Not OverrideForm.Visible; End; End; omFree: Begin If (ReportSystem.SystemFiler.StreamMode In [smTempFile, smFile]) Then Begin (OverrideForm As TForm_Visualizacao).RvRenderPreview.NDRStream.Free; (OverrideForm As TForm_Visualizacao).RvRenderPreview.NDRStream := Nil; (OverrideForm As TForm_Visualizacao).RvRenderPrinter.NDRStream.Free; (OverrideForm As TForm_Visualizacao).RvRenderPrinter.NDRStream := Nil; End; FreeAndNil(OverrideForm); End; End; Agora é só compilar o seu projeto, e o preview do Rave será substituído por este. Como temos pouca documentação sobre o Rave e seus componentes, não foi fácil chegar a esta solução. Para chegar a este ponto, utilizei a documentação disponibilizada pela Nevrona, textos e arquivos encontrados em dicas e truques e também do arquivo de documentação "ravedevguide5.pdf". Embora grande parte tenha sido desenvolvida com o velho método de tentativa e erro. Infelizmente o arquivo de documentação e muito extenso e contem itens não disponibilizados para a versão 5.0.8. (Versão que estou utilizando). Em dicas e truques tem um preview que somente visualiza as páginas de um relatório, utilizando o zoom especificado no RpSystem de sua aplicação. Imprimir com ele nem pensar. Como a minha intenção e mostrar como criar o seu preview, não descrevi a aparência de seu preview, limitei a descrever a funcionalidade esperada de um preview customizado. O layout deve ser definido por você, com figuras, menus, botões, etc... A funcionalidade pode ser aprimorada com os conhecimentos de cada um. Lembre-se que a aparência de seu preview deve lembrar o seu software. É possível criar seu próprio formulário de configuração de impressão, mas a caixa de dialogo PrintDialog é suficiente, por ser uma janela padrão do Windows acredito que o usuário não terá grandes duvidas na sua utilização. Traduza as textos do ReportSystem do seu projeto, eles se sobrepõe ao do Preview personalizado. Você pode ainda colocar no evento onActivate do Form_Visualizacao o código abaixo, que ira fazer que todas as vezes que você abrir o Preview o relatório seja exibido da largura da página. RvRenderPreview.ZoomFactor := RvRenderPreview.ZoomPageWidthFactor; Agora preciso descobrir como salvar o relatório em NDR (formato nativo do Rave), já disponibilizei os formatos RTF, TXT, PDF e HTML. Assim o preview personalizado não vai deixar nada a desejar, com relação ao preview original. Para aumentar a funcionalidade do preview, quero descobrir como converter arquivos RTF, TXT, PDF e HTML em NDR, para que possam ser abertos pelo preview. Ainda necessito de documentação sobre os componentes da guia Rave. A resposta para gerar o NDR esta em um destes componentes, mas eu ainda não a encontrei. O problema e pegar o NDRStream do RvRenderPreview e gerar o NDR. Se fosse simplesmente gerar o NDR ao executar o relatório, seria muito simples. Altera se a propriedade DefultDest do ReportSystem para rdFile, a propriedade OutPutFileName para o nome do arquivo que deseja gerar, altere a propriedade DoNativeOutPut para False, execute o relatório, e teremos um ndr, mas não é essa a necessidade dentro do preview. Toda ajuda e bem vinda. Agurado comentarios. Adriano Guedes -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html