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