PDA

Ver la Versión Completa : Error al mostrar previews


Vlady
11-01-2007, 17:47:39
Hola: Estoy trabajando con delphi 5 y Firebird 2 tengo un problema, cuando muestro los previews de los reportes me aparece en algunas ocaciones y no siempre el siguiente error "A component named QRstadandardpreview already exists" este error me parece de vez en cuando y una vez aparece ya no me deja mostrar ningun preview de ningun reporte: este es el codigo que utilizo para mostrar los previews

with TRinventarios.Create (Application) 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
free;
end;
End


Cabe anotar que este error no siempre aparece y no siempre aparece en el mismo reporte y una vez aparece no me vuelve a mostrar ningun reporte y tengo que reiniciar la aplicacion. Ademas estoy utilizando QuickReport

Gracias por la atencion prestada

droguerman
11-01-2007, 21:28:58
seguramente hay algun componente que estás creando en tiempo de ejecución, luego de que has llamado al constructor create asignale un nombre cualquiera o sino destruye los reportes luego de usarlos

BuenaOnda
11-01-2007, 23:30:40
me parece que te falta liberar el componete... deberias destruirlo..una vez utilizado. ;)

Onti
12-01-2007, 00:11:18
Me parece que le problema mas que con la consulta es con el QuickReport

Vlady
13-01-2007, 02:47:59
si debo liberar el componente segun dice buenaOnda como lo puedo hacer, igual no esta la instrucción free, que me libera el componente o eso creo yo. Y si Oti el problema no esta en la consulta pues igual me corre perfecto el problema lo tengo en la liberación del recurso, lo cual no se como hacer.

Onti
13-01-2007, 17:57:04
Aqui (http://www.clubdelphi.com/foros/showthread.php?t=20599&highlight=previewmodal) hay una referencia de como utilizar y liberar el recurso de impresion

Gabriel
14-01-2007, 00:54:44
Algunas veces, me ha pasado lo mismo, al intentar visualizar con una impresora por defecto, en la que Quick report, no era capaz de generar un preview sobre esa impresora.
intenta cambiar de impresora activa i ya nos diras.

Saludos
Gabriel

Vlady
17-01-2007, 18:36:56
Gracias por sus respuestas: En hilo que me sugiere Oti tengo un pequeño inconveniente y es que yo creo mis reporestes por la opcion del menu new y selecciono reporte de alli pero estos no tiene el metodo Onclose o no se como acceder a el si alguien tiene una sugerencia le agradeceria

Erik_Magnus
20-01-2007, 05:50:00
Hola: Estoy trabajando con delphi 5 y Firebird 2 tengo un problema, cuando muestro los previews de los reportes me aparece en algunas ocaciones y no siempre el siguiente error "A component named QRstadandardpreview already exists" este error me parece de vez en cuando y una vez aparece ya no me deja mostrar ningun preview de ningun reporte: este es el codigo que utilizo para mostrar los previews


Cabe anotar que este error no siempre aparece y no siempre aparece en el mismo reporte y una vez aparece no me vuelve a mostrar ningun reporte y tengo que reiniciar la aplicacion. Ademas estoy utilizando QuickReport

Gracias por la atencion prestada


La solución de ese problema es usar previews personalizados , estos son faciles de hacer y te ahorran ese problema, en la pagina www.qusoft.com viene por ahi como hacerlo (o al menos venia) , de todos modos si no viene puedes preguntar por esta via

Lepe
20-01-2007, 10:07:19
El fallo que veo es obvio, pero a la vez complejo.


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:

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

Vlady
23-01-2007, 01:20:07
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.

Lepe
23-01-2007, 11:23:48
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:

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

Vlady
23-01-2007, 18:16:11
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:


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

aladelta
25-01-2007, 01:38:32
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

if not buscaqr('qrevolutivo',wsmaximized) then qrevolutivo.PreviewModeless;


y la funcion de busqueda hace esto
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...

Lepe
25-01-2007, 11:54:19
Más o menos ese es el tema que quería comentar, es decir, las distintas posibilidades de mostrar la presentación preliminar:


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 :

// 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

Vlady
26-01-2007, 14:23:27
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;



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.


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.

Lepe
26-01-2007, 15:20:56
Muy curioso Vlady, tienes toda la razón.

Haciendo pruebas, hay que crear el report con un Form de dueño, useasé:
Ri := TRinventarios3.Create(FormXX);

Da igual el form que sea, pero de hecho con nil y con application como parámetro, PrinterSettings se queda inhabilitado. (En mi caso me deja imprimir).

Realmente no habrá problemas de destrucción de componentes mientras usemos FreeAndNil.

Saludos

Vlady
26-01-2007, 18:29:55
:p Gracias Lepe por tu ayuda de otro lado mirando el codigo que me dio aladelta me genera un error de compilacion en la siguiente linea:


if TQuickrep(TQRPreview(Screen.Forms[i].controls[4]).qrprinter.parentreport).name=buscar then

especificamente en ParentReport no se que unidad es la que maneja esta función o como puedo hacer para que este error desaparesca.

aladelta
26-01-2007, 19:32:34
Hola de nuevo:

Vamos a ver si se puede solucionar este problema....y a ver si soy capaz de de ello...

Como me imagino que tienes las fuentes del quickreport "sin tocar" (que por cierto es el 4.0) , en la unidad QRPrntr, que debes compilar en las "uses" de tu unidad o de tu formilario, ahi en la linea 568, tienes la propiedad qrprinter del componente TQRPreview, que es quien controla y quien contiene tu listado, y que se crea en el momento de lanzar la ventana preview automatica que lleva por defecto el quickreport y que creo, por tanto, que es por donde te viene el problema de duplicidad de componentes en tu programa, igual que me pasaba a mi...

Lo que pude observar con esto, es que al utilizar la ventana preview del quickreport, este componente "qrprinter", lo unico que guarda de tu "quickreport" cuando lo diseñaste es el nombre, pero como es una propiedad dentro del componente, la unica forma de conprobar si ya existe un listado en ejecucion es de esta forma que te he puesto...

Prueba esto y cuenta, ya que a mi me funciona muy bien, y comprueba que compilas con las units correctas del quickreport...

Un saludo...

Vlady
29-01-2007, 14:45:42
Te cuento aladelta que no he podido dar con el error tengo todos los uses de reporte en la unidad en la que estoy trabajando y el unico error que me arroja es Undeclare identifier 'parentreport', la verdad no se como acceder tambien al codigo fuente de quickreport.

Ya no se que pueda hacer he realizado todas las sugerencias del foro y aun me continua arrojando el mismo error hasta ya he pensado en cambiar el quickreport por otro.


Gracias

aladelta
29-01-2007, 22:48:22
Hola de nuevo:

Vamos por partes...digo yo...

- ¿tienes el quickreport 4.0?
- ¿tienes el directorio ubicado dentro de "library path" del delphi?, que de paso deberia ser "C:\Archivos de programa\Borland\Delphi7\quickrpt"

Es que no entiendo como no puedes abrir las units del quickreport con solo pulsar boton derecho sobre el componente y la primera opcion es la de "find component", y las units que yo compilo son "QRCtrls, QuickRpt, QRPrntr", ya que si el quickreport que intentas realizar no esta ubicado en la unit que lo lanza, pues tendras que añadir al principio de la misma las tres que te indico...

Yo tengo delphi 7, y la verdad no se porque no te deja acceder a las fuentes, miralo bien a ver si el error no es este y te viene por otro lado. Mira si el propio delphi te las encuentra de la forma que te he comentado antes...

Un saludo.

Vlady
30-01-2007, 23:55:40
Gracias aladelta por tu ayuda, pero te cuento que la palabra reservada
parentreport no aparece por ningun lado y ya he abiereto el codigo de la unidad QRPRNTR.pas y por ningun lado esta esta función, pendiente de mas información gracias.

aladelta
31-01-2007, 00:16:25
Hola de nuevo:

¿Podrias decir que version del quickreport tienes, ya que aparece al principio de la unit que comentas?

No obstante, te mando un correo con el archivo, ya que por aqui no puedo porque es demasiado grande....

Saludos..

Vlady
31-01-2007, 15:18:56
Aladelta gracias por tu ayuda:

Te cuento que tengo quickreport 3.6.2 y delphi 7.

Ya rebice el archivo que enviaste y si es diferente por las versiones del quickreport, como puedo actualizarme a quickreport 4

Muchas gracias