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.

Loviedo 04-05-2007 12:49:37

Se me olvidaba. No es bueno abandonar cuando encontramos un problema, hay que intentarlo siempre, despúes podemos decidir cambiar a lo que más nos intereses. Lo que aprendemos con esfuerzo, nunca se olvida.
Solo es un consejo amigable.
Saludos.

MaMu 04-05-2007 13:39:28

Si loviedo, yo opino lo mismo que vos.
Ahora tengo un problema, y la verdad es que no puedo determinar la causa. Yo tengo varios reportes ya creados: Empleados.rav y Remitos.rav, pero...

yo ejecuto esto al mostrar el form del preview

Código Delphi [-]
procedure TImpresion.FormShow(Sender: TObject);
var root,reporte,titulo:string;
begin
ADOQuery1.Open;
ADOQuery2.Open;
root:=ExtractFilePath(Application.ExeName);
titulo:='empleados';
Label2.Caption:='INFORME DE '+titulo;
reporte:=titulo+'.rav';
RvNDRWriter1.FileName:=root+reporte;
VrScrollText1.Active:=True;
RvRenderPreview1.Active:=True;
RvRenderPreview1.Render(RvNDRWriter1.FileName);
Label3.Caption:='Página'+IntToStr(RvRenderPreview1.CurrentPage)+' de '+IntToStr(RvRenderPreview1.Pages);
end;

Con el titulo, que en este caso vale "empleados", me ejecuta todo sin problemas, pero cuando le cambio el titulo a "remitos" (en ambos caso formo el nombre y ruta real de los reportes *.rav) me sale este error:

Código Delphi [-]
Unexpected header code [82] found in report file

Que es lo que pasa? Ambos reportes estan creados igual.

Help Me!!! es super importante.

Saludos y Gracias

Loviedo 04-05-2007 14:58:27

No soy experto, lo poco que se lo he aprendido de otros.
No entiendo el motivo de dos ficheros '.rav'. Supongo que son dos aplicaciones distintas.
Cuando en mi aplicacion cambio el path tengo que indicarle al RvProject.ProjectFile el nuevo camino del .rav, por lo que parto de cero, es decir: RvProject.close....
Saludos y suerte.

MaMu 04-05-2007 15:06:34

Usando el sentido comun, a mi entender, es como que el propio Rave me trunca las cabeceras de los reportes, como un error propio del Rave. No necesitare algun parche para delphi 7 ? algo que corrija esos errores? Porque ejecuto ambos reportes desde el designer y funcionan lo mas bien.
No estoy utilizando Stream ni RvProject1, simplemente lo paso de un RvWrite a un RvRenderPrepiview, asi:

Código Delphi [-]
RvRenderPreview1.Render(RvNDRWriter1.FileName);

Y de esta forma, me anda un solo rav, los demas no. Y cree uno atras de otro. Que puede ser?

Loviedo 04-05-2007 15:17:29

Soy jubilado, no me dedico a esto de la programación, solo me gusta. Si me dices tu correo (mensaje privado) lo que puedo hacer es enviarte mi aplicación.
Saludos.

MaMu 04-05-2007 15:45:28

Pero fijate, mira que curioso. Abri un rav que me anda y uno que no.

Este es el que me anda, se puede ver que tiene cuerpo completo



[delphi]Zá Rave Report  ' A 0A €> €>)\?=…ë>    D , P  A 0A)ÿÿÿ *+ 3Arial4 5? 7 9 8 : ; < = > 6 >Í̘@G HI JtÚ: ÈB ÈB  ÿ76 >ïîž@Sïîî=?Âõ<š™>ö(œ?Gestión de Remitos 2007ÍÌì?G€€€ €? €? ð@ €?" †Í BM†Í 6 ( ð I   PÍ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 33£@ €? ð@¤pÝ? €?ffæ? ð@ffæ??7 6A§
>tÚ¨@S0–ü=?Âõ<çû)>shÑ?LISTADO DE USUARIOS/EMPLEADOSÍÌŒ?S0–ü=?Âõ<çû)>G €?¦›ü? ð@¦›ü?? 6 >Í̘@S~±ä=tÚ<š™>ýbù?Empleado €?S~±ä=tÚ<š™>ýbù?Teléfono33@S~±ä=tÚ<š™>ýbù?Turnofff@S~±ä=tÚ<š™>ýbù?Fecha de RegistroÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>K@Mariano €?S~±ä=tÚ<š™>K@4522811033@S~±ä=tÚ<š™>K@ Full Timefff@S~±ä=tÚ<š™>K@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>±ä@Bruno €?S~±ä=tÚ<š™>±ä@4521836633@S~±ä=tÚ<š™>±ä@ Full Timefff@S~±ä=tÚ<š™>±ä@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>K~@Laura €?S~±ä=tÚ<š™>K~@4504581733@S~±ä=tÚ<š™>K~@ Turno Mañanafff@S~±ä=tÚ<š™>K~@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>å#@Fedra €?S~±ä=tÚ<š™>å#@4504581733@S~±ä=tÚ<š™>å#@Temporalfff@S~±ä=tÚ<š™>å#@
02/05/2007ÍÌœ@S~±ä=tÚ<š™>S~±ä=tÚ<š™>~±,@Arthur €?S~±ä=tÚ<š™>~±,@
154973033133@S~±ä=tÚ<š™>~±,@
Indefinidofff@S~±ä=tÚ<š™>~±,@
02/05/2007ÍÌœ@S~±ä=tÚ<š™> €?š™!A ð@š™!AR
[/code]








Saludos

MaMu 04-05-2007 15:46:35

Y este es el que no me anda

[delphi]
<DIV class=frame_codigo_delphi><DIV class=texto_codigo_delphi id=delphi_div_463b387dc5b5c>
RAVEœ Report2 TRaveProjectManager RaveProject
CompileNeeded FalseFullName RaveProject
Categories
Parameters PIVars UnitsFactor €ÿ?  DataView1
TRaveDataView € ¥B‘„ìe"N†±¤ÊwÂapØxÄ
!›Í§I°ÊN2™L’ Œa6Ì ‚1ÔØl'M¦P4F ‡Æ èɸÜe1?
&ótÆf
ŽÑ# LÊtžÏè43pÄ
`?c)$Üt2™Ì§"48Ød S"“£I?¾r2›M'Cx e2ÙèÓ@M¶ßq¹Ýe²ûÜÖýp¹] …3IèÊ 2U¨,½`±Y,Æ@…ªr11›!Õù]ß7…ètv dºa2šjtF]&/?È䂸9Lèr4›Œ÷‹8G=¸Í&+m×My2aAž_7[„غt©?ß¶Çd2@ –ò
2•
3>!?Ç?¨ƒ

ÛÛ…üŒN¾¾?ù|Æ??7••yÖ©ìfÀ×À1ñÉõs×§d„a7õ…†!( Œx`VJW'¥ë^Ðb~ŸA|p‘¥=Ö…]d‹F¾1LÔ'z?ã˜î2??ø‚?žhš ŠY°^†c¨ÂD?wd”d8õÖ`ßäÒX‡¥¨ÍÞ€À‰Yy™u…c<SPAN class=comment>{^ôÝk G1¼b\f?Ùg)Ñ+—_‰ép™[” æ„1mƒ×D,l??âŠJ$þ?&P‰ãeÁoÑá„n{@ø

Loviedo 04-05-2007 16:51:44

Si uno funciona tienen que funcionar los demás.
Sigo sin entender el ¿Por qué? de dos ficheros .rav, cuando en uno se puede almacenar todos los report que se deseen, sólo hay que indicarselo en la propiedad 'RvProject1.SelectReport'.
Por ejemplo: 'Empleados.rav' contiene los reports 'Domicilio', 'Turnos', 'Vestuario' etc.
Código Delphi [-]
RvProject1.ProjectFile := 'Empleados' 
RvProject1.Engine := Rvwriter1;
RvProject1.open;
if n = 1 then
  RvProject1.SelectReport('Domicilio',true)
else if n = 2 then
  RvProject1.SelectReport('Turnos',true)
else if n = 3 then
  RvProject1.SelectReport('Vestuario',true);
....
Saludos

MaMu 04-05-2007 17:37:34

Cita:

Empezado por Loviedo
Si uno funciona tienen que funcionar los demás.
Sigo sin entender el ¿Por qué? de dos ficheros .rav, cuando en uno se puede almacenar todos los report que se deseen, sólo hay que indicarselo en la propiedad 'RvProject1.SelectReport'.
Por ejemplo: 'Empleados.rav' contiene los reports 'Domicilio', 'Turnos', 'Vestuario' etc.

Ahhh, es porque el programita que estoy haciendo es un visualizador de archivos rav, es decir de reportes en general, y de ahi exporto a pdf y html. Es para poder abrir reportes de cualquier otra aplicación.

Saludos

Loviedo 04-05-2007 17:59:42

En www.nevrona.com existe algo similar ESBRaveViewer que es libre, la pena es que no viene con los fuentes.

Saludos.



La franja horaria es GMT +2. Ahora son las 00:07:44.

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