Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Alguien me enseña a hacer un preview? (https://www.clubdelphi.com/foros/showthread.php?t=43075)

MaMu 01-05-2007 09:20:44

Alguien me enseña a hacer un preview?
 
Tengo Rave Report 5, y Fast Report.

Pero quiciera poder hacer una vista previa en un Form, y realmente no se como. Todos los tutoriales que baje, solo enseñan a utilizar el diseñador.
Mi idea es hacer un reporte y dejarlo guardado en un archivo, y este poder visualizarlo antes de imprimir, en un form cualquiera.

Agradecere todo tipo de ayuda, ya sean sugerencias, tutoriales, una mano... lo que sea.

Gracias

Loviedo 01-05-2007 19:20:59

1 Archivos Adjunto(s)
Creo que esto puede ayudarte.
Saludos.

MaMu 02-05-2007 01:11:58

Gracias por el ejemplo, esta muy claro. El unico problema que tengo ahora, es que si bien ya tengo creado los reportes con el Rave, no me deja precargarlos para compilarlos dentro del ejecutable, si lo intento al cargarlo me tira un error. Lo que pienso es que este error se puede deber a que la ruta de origen del archivo rav es muy larga, es decir exederia alguna limitacion de caracteres para la ruta de archivos, ya que si lo pongo en otra carpeta, mas corta, lo carga sin problemas, muy similar a cuando ensamblo con el MPLab para los uC, tenia el mismo error. No se si esto le sirve a alguien como dato.
Con esta ayuda que me diste, voy a diseñar algun reporteador y mandarlo al objet repository a ver que sale, un saludo y gracias.

MaMu 02-05-2007 04:54:22

Bueno, a ver si entendi bien los pasos a seguir para generar un preview porque no lo logre hacer funcionar:

Los componentes Rave que necesito

- 1 RvProject que contiene el reporte "mi_reporte.rav"
- 1 RvNDRWriter
- 1 RvRenderPreview
- 1 RvRenderPrinter

Otros

- 1 ScrollBox
- 1 Button

Y los pasos a seguir para generar el reporte son los siguientes

1) Designo una variable a usar como TMemoryStream
Código:


var
NDRStream: TMemoryStream;

2) Creo el MemoryStream con el reporte que esta almacenado en RvProject
Código:


NDRStream := TMemoryStream.Create;
RvProject1.SaveToStream(NDRStream);

3) Al RvNDRWriter le asigo como Stream, la variable creada como
MemoryStream, la cual a esta altura, deberia contener el reporte
Código:


RvNDRWriter1.Stream := NDRStream;


4) Ejecuto el reporte, RvProject.Execute
Código:


RvProject1.Execute;

5) Cargo el RvRenderPreview con el Stream
Código:


RvRenderPrinter1.Render(NDRStream);

6) Si lo quiero visualizar, RvRenderPrinter.Render(mi_stream)
Código:


RvRenderPrinter1.Render(NDRStream);

7) Al salir, liberamos el Stream con Free.
Código:


NDRStream.Free;


Esta bien asi? me olvide de algo? Porque no lo puedo hacer andar.
Me dice, "el sistema no puede hallar la ruta especificiada" y no entiendo porque, el reporte existe, y esta en el mismo directorio del proyecto.

Saludos

MaMu 02-05-2007 07:44:50

Lo mas sencillo que se me ocurrio, es hacerlo mediante:

Código:

RvRenderPreview1.Render(RvNDRWriter1.FileName);
Y bueno, todo lo demas, Reglas, Tamaño de hoja, Zooms, exportaciones, queda a criterio de cada uno.

Saludos

Loviedo 02-05-2007 11:07:53

No tengo muchos conocimientos, los problemas los resuelvo con lo que aportan otros. Esto es como lo uso.
Saludos

MaMu 02-05-2007 11:13:09

Cita:

Empezado por Loviedo
No tengo muchos conocimientos, los problemas los resuelvo con lo que aportan otros. Esto es como lo uso.
Saludos

Me salta demasiado error haciendo un TMemoryStream, pero si lo hago asi:

Código:

RvRenderPreview1.Render(RvNDRWriter1.FileName);

no me da problemas. El tema es que el Stream lo necesito, llegado el caso que quiera exportar a otro formato.

Saludos.

Loviedo 02-05-2007 11:19:10

He intentado adjuntar otro archivo, pero no me lo ha admitido.
Este es el codigo del Datamodule.
Código Delphi [-]
implementation

uses mFunct, RVClass, RVProj, RVCsStd, Aviso1, Prever1;

{$R *.DFM}

procedure TDM.DataModuleCreate(Sender: TObject);
begin
  RvProject1.ProjectFile := mPath+'\MiComunidad.rav';
end;


procedure TDM.VerDocumento1(numero:integer;Texto1:string);
var
  MyPage: TRavePage;
  MyText1,MyText2,MyText3,MyText14,MyText15,MyText6: TRaveText;
  MyText16,MyText17,MyText18,MyText19,MyText20,MyText21,MyText22: TRaveText;
  Texto2,Texto3: string;
begin
  RvProject1.Engine := Rvwriter1;
  RvProject1.open;
  if Numero = 1 then
    begin
      With RvProject1.ProjMan do
        begin
          MyPage := FindRaveComponent('Diario1.Page1',nil) as TRavePage;
          MyText1 := FindRaveComponent('Text9',MyPage) as TRaveText;
          MyText1.Text := Texto1;
          MyText2 := FindRaveComponent('Text2',MyPage) as TRaveText;
          MyText2.Text := Texto2;
          MyText3 := FindRaveComponent('Text3',MyPage) as TRaveText;
          MyText3.Text := Texto3;
          MyText14 := FindRaveComponent('Text14',MyPage) as TRaveText;
          MyText14.Text := Format('%*.*f',[8,2,sumahaber-sumadebe]);
        end;
      RvProject1.SelectReport('Diario1',true);
    end
  else if Numero = 2 then
    begin
      With RvProject1.ProjMan do
        begin
          MyPage := FindRaveComponent('Mayor1.Page1',nil) as TRavePage;
          MyText1 := FindRaveComponent('Text9',MyPage) as TRaveText;
          MyText1.Text := Texto1;
          MyText2 := FindRaveComponent('Text2',MyPage) as TRaveText;
          MyText2.Text := Texto2;
          MyText3 := FindRaveComponent('Text3',MyPage) as TRaveText;
          MyText3.Text := Texto3;
          MyText14 := FindRaveComponent('Text14',MyPage) as TRaveText;
          MyText14.Text := Format('%*.*f',[8,2,sumahaber-sumadebe]);
        end;
      RvProject1.SelectReport('Mayor1',true);
    end;

  Fprevio := TFprevio.Create(Application);
  try
    Fprevio.ShowModal;
  finally
    Fprevio.Free;
  end;
  RvProject1.close;
end;

end.

saludos

MaMu 02-05-2007 11:26:43

EL codigo del DM esta muy claro, no tengo problemas en la generacion del reporte, puedo generarlo por codigo o simplemente con el designer, mi problema esta en el Stream:

Código:

NDRStream := TMemoryStream.Create;
RvProject1.ProjectFile:='c:\mi_programa\mi_reporte.rav';
RvProject1.Engine := RvNDRWriter1;
RvProject1.open;
RvProject1.SaveToStream(NDRStream);
RvNDRWriter1.Stream := NDRStream;
RvRenderPrinter1.Render(NDRStream); //ERROR

EL error que me salta es : Invalid Project Format.

Saludos

Loviedo 02-05-2007 11:33:00

A mi no me da ningún tipo de error, quizás el problema esté en los 'uses'.
Saludos.

MaMu 02-05-2007 11:38:40

Mmm a esta altura no se

Código:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, RpRenderPrinter, RpRender, RpRenderCanvas,
  RpRenderPreview, RpBase, RpFiler, RpDefine, RpRave, RpCon, RpConDS,
  StdCtrls, RpSystem;

Código:

var
  Form1: TForm1;
  NDR: TMemoryStream;

Tendre que seguir buscandole la vuelta.

Saludos

MaMu 02-05-2007 12:10:11

Hasta ejecutanto:

Código:

RvRenderPreview1.Render('mi_reporte.rav');
Me funciona, pero sigue el mismo error en el TMemoryStream, no se, "cosa e mandinga, vio?"

Saludos

MaMu 02-05-2007 12:16:02

Hasta ejecutanto:

Código:

RvRenderPreview1.Render('mi_reporte.rav');
Me funciona, pero sigue el mismo error en el TMemoryStream, no se, "cosa e mandinga, vio?"
Necesito una recomendacion, quiero armar un procedure que me imprima directamente el reporte, sin abrir ningun dialgo de imprimir ni nada, asi directamente como esta y setear todo por codigo. Que consideraciones debo tener? (tamaño papel, color o negro, copias, etc..)Una suerte de...

Código:

procedure imprimedirecto(ProjectFile:string);
Saludos

Loviedo 02-05-2007 15:19:09

El fallo puede ser que destruye el NDRStream antes de tiempo. Yo lo hago cuando cierro el form del previo.
Saludos.

MaMu 03-05-2007 06:00:39

Lo destruyo al salir en el evento OnClose del Form principal de la aplicación.
A mi entender, es como que el Stream está vacio, otra explicación no tengo.

Saludos

Loviedo 03-05-2007 11:15:06

En el componente TRvNDRWrite la propiedad StreamMode debe ser smUser.

El RvProject.Engine apunta al TRvNDRWrite.
El NDRStream debes destruirlo en el onClose del previo, ya que lo estás creando en el onCreate del mismo, evitará crear múltiples instancias cada vez que visualice un report.
Saludos.

MaMu 04-05-2007 04:49:09

Y como puedo hace para mandar a imprimir un reporte ya creado, por ejemplo "mi_reporte.rav", pero quiero mandarlo a imprimir directamente sin hacer ningun preview.

Saludos

Caral 04-05-2007 05:00:30

Hola mamu
No se en rave, pero en qreport:
Para imprimir, directamente:
Código Delphi [-]
begin
       try
     QReport1.Print;
      finally
     QReport1.Free;
      end; 
   end;
Para hacer un Preview:
Código Delphi [-]
begin
       try
     QReport1.Preview;
      finally
     QReport1.Free;
      end; 
   end;
Asi de simple, la verdad no se porque no usas QReport, que viene con delphi.
Saludos

MaMu 04-05-2007 10:48:40

Cita:

Empezado por Caral
Asi de simple, la verdad no se porque no usas QReport, que viene con delphi.

Porque no lo tengo instalado, al menos no me aparece en la paleta de componentes, en que bpl esta?. Uso Delphi 7.
Ahora bien, yo elegi Rave, porque me es muy comodo modificar los reportes con el Designer, lo que me ahorra tiempo a la hora de tener que modificar el codigo del programa y hasta a veces ni es necesario. De todas maneras son muchos los que me han sugerido que me vuelque al QReport, asi que proximamente voy a empezar a ver el tema.

Saludos y gracias.

Loviedo 04-05-2007 12:01:25

Esto me funciona perfectamente.

Código Delphi [-]
procedure TFMain.Button1Click(Sender: TObject);
var
  NDRStream:  TMemoryStream;
begin
  DM.Query5.Open;
  NDRStream := TMemoryStream.Create;
  try
    DM.RvProject1.open;
    DM.RvProject1.SelectReport('DomiciliarRecibos',true);
    DM.RvProject1.SaveToStream(NDRStream);
    DM.RvWriter1.Stream:=NDRStream;
    DM.RvProject1.Execute;
    DM.RvPrinter1.Render(NDRStream);
    DM.RvProject1.close;
    DM.Query5.Close;
  except
    NDRStream.Free;
  end;
end;

Saludos.


La franja horaria es GMT +2. Ahora son las 16:10:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi