![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Quizás tengas problemas con la variable xreporte, porque de otra forma no entiendo donde está el fallo.
Suponiendo que ya tienes creado el Tstringlist y almacenado los informes (que me gusta más que reporte )
En este caso no tenemos que liberar nada, ya que xreporte es un puntero que apunta al Reportes.Objects[i], si liberamos xreporte, estaríamos liberando tambien el Objects[i], así que en siguientes llamadas a ese mismo informe daría error. saludos y espero te sirva.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#2
|
|||
|
|||
|
Creo que el problema esta en que cada reporte esta hecho en un formulario aparte.
Actualmente hago esto para poder imprimirlos y al llamar al formulario tengo que incluirlo en la seccion USES. Como podria pasar el nombre del formulario y del informe utilizando el procedure? Código:
uses frmivalibrodecompras,frmestadodecuentabancario;
procedure imprimir(salidax,impresorax,reportex,copiasx,formulariox: string);
var cont: integer;
xreporte: TQuickRep;
begin
if formulariox='FormRepivalibrocompras' then
begin
with FormRepivalibrocompras do
begin
if formatox='QuickRepivalibro' then
xreporte:=QuickRepivalibro;
end;
end;
if formulariox='FormRepestadodecuentabancario' then
begin
with FormRepestadodecuentabancario do
begin
if formatox='QuickRepestadodecuenta' then
xreporte:=QuickRepestadodecuenta;
end;
end;
xreporte.PrinterSettings.Copies:=strtoint(copiasx);
if salidax='printer' then
xreporte.print
else
xreporte.Preview;
end;
|
|
#3
|
||||
|
||||
|
Cita:
El StringList Reportes lo declaras en alguna unidad común, digamos, RepFactory. En cada unidad donde definas un QuickRep, agregas RepFactory a la cláusula uses y en su sección initialization registras el reporte. Para fijar ideas, la unidad frmivalibrodecompras quedaría así:
Entonces, en la(s) unidad(es) donde desees usar tus reportes, agregar RegFactory a la cláusula uses (no hay necesidad de agregar la unidad de cada reporte). Ahora ya puedes buscar en Reportes el objeto asociado al nombre, similarmente a como dice Lepe:
// Saludos |
|
#4
|
|||
|
|||
|
Ok. esto fue lo que hice pero me da el siguiente error
Runtime error 216 at 0040340A Código:
//unidad informesfactory
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,QuickRpt;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var xinforme: TQuickRep;
begin
xinforme:=TQuickRep(listbox1.Items.Objects[listbox1.ItemIndex]);
xinforme.print
end;
end.
//unidad informe
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, QuickRpt, QRCtrls, ExtCtrls, unit1;
type
TForm2 = class(TForm)
QuickRep1: TQuickRep;
QRBand1: TQRBand;
QRBand2: TQRBand;
QRBand3: TQRBand;
QRLabel1: TQRLabel;
QRBand4: TQRBand;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
initialization
form1.ListBox1.Items.AddObject('QuickRep1', form2.QuickRep1);
end.
|
|
#5
|
||||
|
||||
|
Desde ese código no podemos saber si las consultas o Tablas asociadas al QuickReport están abiertas o no.
Suponer que el usuario ha dado un clic en el ListBox antes de pulsar el boton 1, no está bien, sugiero que añadas:
Ya que estoy con sugerencias , la próxima vez que pongas un código, utiliza[ delphi ] y [ /delphi] en lugar de "code", como ves, sale más bonito ![]() El error que te está dando (216) es un error de protección general. El problema es que el .dpr (Project --> View Source) será más o menos como este: Y usas la Creación automatica de ventanas. En Application.Initalize, es donde se encarga de inicializar (zona de initialization) las unidades que forman el proyecto, pero todavía no se han creado ni Form1 ni Form2; como tienes: y Form1 todavía no se ha creado, obtienes el error. Obviamente la forma de trabajar de roman no coincide con la tuya. Esa linea la puedes poner en el evento OnCreate del Form2 y ahora si funciona correctamente, (quitandola de la zona initialization). saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#6
|
|||
|
|||
|
Ok. Lepe hice lo que recomendastes y funciono sin problema.
Muchas gracias Roman. Muchas gracias Lepe. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|