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

 

Responder a