Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
El fallo que veo es obvio, pero a la vez complejo.

Código Delphi [-]
with  TRinventarios.Create (Application) do
Cuando se crea, ¿qué nombre tendrá el componente? Pues si TRinventarios tiene en su propiedad Name = Rinventarios tendrá ese nombre, y después al crear otro componente, es decir, al volver a pasar por esa línea se volverá a crear otro componente con el mismo nombre, de ahí el error.

pero ¿como es posible? si estamos haciendo un free en el bloque finally?. Bueno, posiblemente ocurra al pulsar el boton que crea ese informe dos veces, que ordenará crear ese QuickReport 2 veces.

Opciones no excluyentes, para solucionarlo:
- Quita el Application y usa nil como parámetro, ya que realmente te encargas tú de destruirlo.

- Cuando pulses el boton para ver el preview, inhabilita (boton.enable := false) dicho botón hasta que se cierre el preview.

- Usa una variable para guardar el quickreport recien creado, así delphi le asignará nombres distintos y no tendrás el error que da:
Código Delphi [-]
var Ri : TRinventarios;
begin
ri := TRinventarios.Create (nil) ;
with ri  do 
Begin 
try     
  ///Procedemiento almacenado que mostrara el reporte
       Consulta.Close;
       Consulta.SQL.Clear;
       Consulta.SQL.Text := 'SELECT * FROM CONSULTAINVENTARIO()';
       Consulta.SQL.Active := True; 
       Preview; 
  finally   
    freeandnil(ri);    
  end; 
End

En este caso cuando creas 2 quickreports (por pulsar el boton 2 veces), Delphi le asignará los nombres (propiedad name) "TRInventarios_1" y "TRInventarios_2", por tanto ya no da el error.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #2  
Antiguo 23-01-2007
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 21
Vlady Va por buen camino
Gracias Lepe por tu valiosicima colaboración te cuento que he hecho lo que me dices pero el problema persiste el error que me pararece es el siguiente:


Project Inventarios.exe raised exeption class EAccesViolation with message 'Access violation at address 424D4F4E'. Read of address 42D4F4E. Process stopped. Use step or Run to continue.

Luego de aparecerme este error me aparece el siguiente error:

A Component named QRStandardPreview already exists.

Despues de que me aparece esto ya no puedo volver a previsualizar un reporte y tengo que iniciar la aplicación, este error no aparece siempre solo de vez en cuando y hasta ahora no he podido saber el motivo, apesar de aplicar todas las ideas expuestas en este foro.
Responder Con Cita
  #3  
Antiguo 23-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
He leido que si tienes el qreport en forms autocreate (projects-> options) y después lo llamas de esta forma (creandolo de nuevo) ocurre ese error, ¿por casualidad lo tienes así?

Hasta ahora no me había percatado de este otro detalle:
Código Delphi [-]
Consulta.SQL.Active := True;

En realidad debe decir Consulta.Open o Consulta.Active := true, pero vamos, el error lo daría en compilación, por lo que creo que es un fallo de escribir en el foro.

Quizás también podrías usar PreviewModal en lugar de Preview, algunas veces me ha solucionado problemas de ese estilo.

Lo que está claro es que el access violation es culpable, después de eso puede dar casi cualquier fallo. El access violation se produce por estar leyendo en un objeto que ya no existe, que se ha destruido previamente. En este sentido, ¿donde tienes el objeto Consulta? ¿en un Datamodule?, ¿en el TQRInventarios?.

Saludos

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 23-01-2007
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 21
Vlady Va por buen camino
Lepe muchas gracias por tu ayuda y por brindarme tus valiocisiomos conocimientos, no puedo utilizar el previewmodal ya que desde este no se puede imprimir, o si se puede como se hace?.

Los formularios no se autocrean me he fijado muy bien en esto y esta bien solo secrean en el momento que los necesito.

En cuanto a tus preguntas te cuento los objetos de consulta algunas veces estan en un datamodulo otra estan en el mismo formulario que se va a mostrar es decir no existe consistencia, algunas veces funcionan bien y otras no aqui te escribo un codigo donde el objeto de consulta se encuenta en el mismo formulario a mostrar y en este se presenta en ocaciones el problema:

Código Delphi [-]
procedure TPrincipal.ConsultarInventario1Click(Sender: TObject);
Var
   Ri : TRinventarios3;
begin
    Ri := TRinventarios3.Create(Nil);
    with Ri do
    Begin
      try
      Query1.Close;
      Query1.SQL.Clear;
      Query1.SQL.Text := 'SELECT * FROM CONSULTAINVENTARIO ('  +   Inttostr(DataM.Recepcionista['N_Turno']) +  ')';
      Query1.Active := True;
      preview;
      Query1.Close;
      finally
        FreeAndNil(Ri);
      end
    End
end;

la cosulta que se muestra llama a un procedimiento con esto no existe ningun problema en las consultas el problema radica en mostrar el preview de los reportes

Gracias

Última edición por Vlady fecha: 24-01-2007 a las 14:57:02.
Responder Con Cita
  #5  
Antiguo 25-01-2007
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 24
aladelta Va por buen camino
Hola a todos:

Si no he entendido mal, a mi me pasaba lo mismo a la hora de crear los reports. Y venga a darme el follon con el error de que elcomponente ya existe...

Yo lo tengo solucionado de la siguiente forma y te lo comento por si te puede valer y te ayuda..mira...

Descrubri, aunque sea obvio, que aunque pulses cerrar en la ventana del preview del report, realmente el componente no se destruye, y tenemos el problema, en el boton de crear el preview tengo esta llamada a una funcion que me busca el componente y si existe lo recupera y lo muestra de nuevo, de esta manera me evito tener que crearlo de nuevo y el error, ademas, puedes cerrar o minimizar la ventana para despues recuperarla de nuevo

Código Delphi [-]
      if not buscaqr('qrevolutivo',wsmaximized) then qrevolutivo.PreviewModeless;

y la funcion de busqueda hace esto
Código Delphi [-]
function Tmaster.buscaqr(buscar:string;wstate:TwindowState):boolean;
var i:integer;
begin
  result:=false;
  for i:=0 to Screen.FormCount-1 do
  begin
    if pos('QRStandardPreview',Screen.Forms[i].Name)>0 then
      if TQuickrep(TQRPreview(Screen.Forms[i].controls[4]).qrprinter.parentreport).name=buscar then
        begin
          Screen.Forms[i].WindowState:=wstate;
          result:=true;
          exit;
        end;
  end;
end;

prueba esta idea, y ya comentas por si tengo errores....

Un saludo...
Responder Con Cita
  #6  
Antiguo 25-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Más o menos ese es el tema que quería comentar, es decir, las distintas posibilidades de mostrar la presentación preliminar:

Código Delphi [-]
   qrReport1.PreviewModal; // aqui usaremos distintas formas.
   ShowMessage('se ve o no se ve');
   qrReport1.Free;

- PreviewModal: es una ventana modal, no puedes cambiar a otra ventana hasta cerrarla, y el código que lo invoca se queda parado en esa línea. . El código se ejecuta tal y como está escrito, de forma que el programa no llega a la línea del ShowMessage hasta que se cierre la ventana del preview, una vez aceptado el ShowMessage, después se libera el quickreport.

- PreviewModeless: se muestra la ventana pero el código sigue "corriendo", es decir, se muestra el preview y el ShowMessage, es posible que el showmessage se muestre antes porque el el preview tarde en cargar todos los datos. Es más, si aceptamos el ShowMessage con rapidez, debido a que es Modeless, no se verá el informe porque se puede ejecutar la línea qrReport1.Free antes de que se haya mostrado en pantalla el QuickReport.

- Preview: Se comporta como un PreviewModal pero realmente no es una ventana modal al 100 %, es decir, mientras estas viendo el Preview, podrías mover el foco a otra ventana del programa y volver de nuevo a esta. El código se ejecuta como el PreviewModal. Por el hecho de poder pasar el foco a otra ventana, el usuario podría lanzar otra ventana de presentación preliminar y causar errores al crear una ventana que ya existe (hay que tenerlo en cuenta si se usa este método, por ejemplo inhabilitando el botón de mostrar el preview si ya se ha pulsado).

Desde la presentación preliminar, se puede usar el botón imprimir sin importar cual de los 3 métodos anteriores, se haya usado para llamar a dicha presentación.

Incluso sin mostrar la presentación preliminar, puede imprimirse el quickReport por código :
Código Delphi [-]
  // creamos el quickreport y abrimos las consultas
  qrReport1.print;

Yo suelo usar PreviewModal porque es más cómodo para mi, como programador, además si el usuario abre 3 o 4 presentaciones al mismo tiempo, él mismo se marea con tantas ventanas, así le obligo a "seguir un orden de trabajo" .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 25-01-2007 a las 11:57:40.
Responder Con Cita
  #7  
Antiguo 26-01-2007
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 21
Vlady Va por buen camino
Gracias aladelta y Lepe por su ayuda les cuento:

Antes de probar la idea de aladelta de utilizar la función para comprabar primero si ya existe un preview creado quiero seguir las sugerencias de Lepe pero tengo un inquietud con el previewmodal, pues este cuando lo utilizo con formularios creados mediante la opción de delphi File-New-Report me aparece inabilitados los botones de impresión y configuración de impresora, pero cuando utilizo reportes seleccionados y puesto sobre un formulario estas opciones si aparecen habilitados asi utilice el previewmodal que es lo que necesito el unico inconveniente es que tengo cerca de 60 reportes y la gran mayoria los tengo creados mediante la primera opción y el paso de todos estos a la segunda forma seria volver a construir todo, si lepe me puede sugerir como puedo crear esto formularios con previewmodal y me aparesca habilitado la opcion de imprimir. Para mayor compresión voy a mostrar las dos forma en que llamo a los preview;


Código Delphi [-]
procedure TPrincipal.ConsultarInventario1Click(Sender: TObject);
Var
   Ri : TRinventarios3;
begin
    Ri := TRinventarios3.Create(Nil);
    with Ri do
    Begin
      try
      Query1.Close;
      Query1.SQL.Clear;
      Query1.SQL.Text := 'SELECT * FROM CONSULTAINVENTARIO ('  + Inttostr(DataM.Recepcionista['N_Turno']) +  ')';
      Query1.Active := True;
      previewModal;
      Query1.Close;
      finally
        FreeAndNil(Ri);
      end
    End
end;

Esta es la primera forma en que creo los formularios y me aparece desabilitados los botones de impresión.

Código Delphi [-]
procedure TItemFactura.LMDButton8Click(Sender: TObject);
begin
     //Consulta de Impresion
    Application.CreateForm(TVistaRecibo, VistaRecibo);
    with VistaRecibo do
    Begin
    try
      Query1.Close;
      Query1.SQL.Clear;
      Query1.SQL.Add('SELECT O.Habitacion, O.N_Orden, C.Nombres, C.Cedula, C.Telefono, C.Apellidos, O.Fecha_Llegada, ');
      Query1.SQL.Add('I.Fecha, I.Cantidad, I.Valor, I.IVA, S.Nombre, S.Valor, S.Iva FROM Orden_Servicio O, Cliente C, ItemServicio I, Servicio S');
      Query1.SQL.Add('WHERE O.N_Orden = ''' + inttostr(ConOrden['N_Orden']) + ''' AND ''' + inttostr(ConOrden['N_Orden']) + '''= I.Orden AND I.Servicio = S.Codigo AND O.Cliente = C.IdCliente ORDER BY I.Fecha ASC');
      Query1.Active := True;
      QuickRep1.PreviewModal;
    finally
      Free;
    end
    end
end;

Cuando los formulacios los llamo de esta forma si me aparece habilitadas las opciones de impresión.

Muchas gracias por la atención prestada.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mostrar DXF Churi Gráficos 1 08-01-2007 14:33:20
Error al querer mostrar mensaje con JS YaninaGenia .NET 0 27-07-2006 16:00:45
mostrar o no mostrar un control en un DBCTRLGRID segun la fila gesteban OOP 0 10-11-2005 17:21:11
Urgente...error al querer mostrar form2 redlyon13 Varios 1 01-12-2003 15:32:12
Error al mostrar formulario jmselesan OOP 2 13-08-2003 21:11:14


La franja horaria es GMT +2. Ahora son las 19:21:33.


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
Copyright 1996-2007 Club Delphi