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 10-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 21
david duarte Va por buen camino
Question

Lo siento mucho, es que casi no uso las etiquetas, les prometo que de ahora en adelante voy a tratar de trabajar mas con ellas.

Ya solucione mi problema creo que habia un problema, porque no tenia un ciclo, y creaba dos labels al mismo tiempo y se encimaban las etiquetas en las pila.

Otra pregunta, esta si es relacionada con qreport.

En el qreport se pueden añadir paginas, pero no le he encontrado la manera de añadir una, en el ejemplo que les puse anteriormente, cuando creo las labels, le puse un ciclo desde 0 hasta 100, pero en la primera pagina solamente se muestran como 60 aprox. pero no me añade automaticamente la otra pagina, como le puedo añadir la otra pagina o paginas en caso de que sea necesario???

Alguna vez en la vida le trate con quickrep1.newpage, pero no pasa nada, algunas veces me marca error, ya lei la ayuda, pero nomas no me sale.

Gracias.

Cómo te sientes hoy??

Alguien sabe donde puedo conseguir o comprar o bajar algun manual completo de quickreport???

Última edición por david duarte fecha: 10-10-2005 a las 20:28:09. Razón: Complemento
Responder Con Cita
  #2  
Antiguo 12-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 21
david duarte Va por buen camino
Hola!!!

Oigan, se puede sabel la longitud de caracteres del nombre del campo, esto es para saber que espacio le voy a dejar antes de crear el TQRLabel o el TQRDBtext.

esto es

si el campo 1 se llama "Analisis_1" su longitud seria 10 y el campo 2 "Analisis2",
entonces el campo 1 se va a mostrar desde las coordenadas 0(top),0(left),
y para mostrar adecuadamente el campo2 tendria que sumarle a left los 10 caracteres mas 5 espacios en blanco y mostrar el siguiente nombre de campo.

Hice la prueba, pero creo que se manejan por pixeles o algo asi, no??
Gracias
Responder Con Cita
  #3  
Antiguo 13-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 21
david duarte Va por buen camino
Hola a todos!!!

Voy a crear muchas TQRLabels, que es donde voy a poner el nombre de los campos que selecciono el usuario y voy a mostrar su informacion.

Pero no he podido hacer el arreglo de etiquetas que comentaron anteriormente

Código Delphi [-]
etiquetas: array of TQRLabels

pero al momento de querer crearla o mejor dicho asignarla al arreglo me marca un error
primero la creaba asi
la declaracion:
Código Delphi [-]
 lab : TQRLabel
asignacion
Código Delphi [-]
 lab := TQRLabel.Create(Self)

y ahi no hay ningun problema..
pero si lo hago como dijeron, asignarla a el arreglo directamente cuando se crea
Código Delphi [-]
 etiquetas[cont] := TQRLabel.Create(Self)

me marca un error: EAccessViolation
y no se porque.

y por lo tanto cuando quier ver un segundo reporte, me marca error de que ya existen las etiquetas.
No se como liberarlas.
Agradeceria que me dijeran como asignarlas a un arreglo dinamico.

Gracias

Cómo te sientes hoy?
Responder Con Cita
  #4  
Antiguo 13-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
david,
no se si has asignado el tamaño del array de las etiquetas antes de crearlas.

Código:
SetLength(Etiquetas, Nº_de_etiquetas_que_vas_a_crear);
for n:= 0 to Nº_de_etiquetas_que_vas_a_crear
begin
  etiquetas[n]:= TQRLabel.Create(Self);
  // resto de propiedades de etiquetas[n]
end;

Cuando destruyas el formulario, libera el espacio que has reservado.
for n:= sizeof(Etiquetas) downto 0 do Etiquetas[n].Free;

Espero que te sirva de ayuda

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 13-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Código Delphi [-]
unit reporte_runtime;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  QuickRpt, ExtCtrls,QRCTRLS, db;

type
  TForm1 = class(TForm)
    QuickRep1: TQuickRep;
    QRBand1: TQRBand;
    QRBand2: TQRBand;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  lastleft, i : integer;
  c : TQRlabel;

begin
  lastleft:= 10;
  for i:= 0 to 10 do
  begin
    c := tQRlabel.Create(QRband1); // c no estaba creado, ahora si.
   // antes quien debía destruir el label era el Form porque usabas Self,
  // ahora quien lo destruye es la banda, que es donde estará el control.


    c.Top := 10;
    c.Caption := 'label' + inttostr(i);
    c.Width := 50;
    c.Left := lastleft+ 5+ FontWidth(c.Font,c.Caption); // para que se vean todas
    lastleft := c.Left;
//  c.Name := 'label'; // no tenemos por qué asignarlo
    c.parent := QRBand1;
    c.Enabled := true; // si está a false no se verá en pantalla.
  end;
  quickrep1.Preview;
// no tenemos que liberar nada, el QRBand se encargará de ello.
end;

end.
Probado y funcionando.

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: 13-10-2005 a las 14:48:44.
Responder Con Cita
  #6  
Antiguo 13-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Para saber cuanto ocupa un String en el QuickReport, habría que usar el canvas del QuickReport.Printer, pero en el OnCreate del form, no está todavía asignada, así que tendremos nosotros que buscarlo por otro sitio:

Código Delphi [-]
function FontWidth(const Fuente:TFont;const Texto:string):Integer;
var c:TCanvas;
    h:HWND;
begin
  try
    c:= TCanvas.Create;
    c.Handle := GetDC(0);

    c.Font.Assign(Fuente);
    Result := c.TextWidth(Texto);
  finally
    FreeAndNil(c);
  end;
end;

uses shellapi, graphics, types, windows

He editado mi mensaje anterior para incluir la llamada a esta rutina.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 13-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 21
david duarte Va por buen camino
Gracias por sus ayudas.

Gracias fjcg02, lo malo es que no se cuantas etiquetas se van a crear, eso depende de los analisis que requiera el usuario, pueden ser desde 2 hasta 50 o 1000, no se.

Imaginate, si el usuario quiere que se le realicen 30 muestras y por cada muestra son 5 analisis, ahi serian 150 labels y aparte de los titulos de los analisis.

Gracias Lepe.
Esta muy bien explicado

Los felicito a ambos

Solamente una cuestion, que cuando veo el primer reporte, no hay problema, se muestran los nombres de los campos bien, pero cuando quiero ver un segundo reporte, me salen encimadas las letras(creo que no se borran las etiquetas con anterioridad) que era lo que me estabas diciendo fjcg02, ya no me marca el mismo error, pero aparte
me marca un error de EInvalidOp, y sale un error : "Error Floating Point"

Gracias.

Entonces: Primero si es que me libera las etiquetas que creo en tiempo de ejecucion, no me las borra de la banda.

Y segundo, al ver un segundo o tercer reporte, me encima el nombre de los analisis(o las letras)

Cabe señalar que hasta ahorita solamente estoy mostrando el nombre de los analisis a realizar, posteriormente me enfocare a mostrar los resultados.
Cómo te sientes hoy

Lo solucione de la siguiete forma. no se si sea la mas adecuada, pero me funciona.

Código Delphi [-]
procedure Tfrm_reporte2.QuickRep1AfterPreview(Sender: TObject);
 var
   contlabels : Integer;
 begin
   frm_reporte2.Hide;
   contlabels := frm_reporte2.QRBResultados.ComponentCount;
   while contlabels > 0  do//to contcompact do
   Begin
     frm_reporte2.QRBResultados.Components[contlabels-1].Free;
     contlabels:= frm_reporte2.QRBResultados.ComponentCount;
   end;
   contlabels := frm_reporte2.QRBResultados.ComponentCount;
   frm_reporte2.qrlaboratorio.Caption := 'Laboratorio ';
   frmana.show;
 end;

Checenlo y me dan su opinion, probablemente sea posible de otra forma mas facil.

Última edición por david duarte fecha: 13-10-2005 a las 17:50:20. Razón: Solucion
Responder Con Cita
  #8  
Antiguo 13-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Hay una cosa que no acabo de entender.

Hablas de 2, 50, 1000 etiquetas.

el código que adjunto es para imprimir una consulta a una BBDD, que puede devolver desde 0 a n registros, dependiendo de los datos que se hayan introducido en la misma, el filtro que se aplique, etc. Para ello, observa que en la llamada se pasa como parámetro una query, que es la que origina los datos.
Lógicamente, se crearán tantas columnas como campos se visualicen el la consulta
Insisto, vale para cualquier consulta que hagas en tu programa.

A grosso modo
El reporte tiene 3 bandas,
titulos- > titulos de los campos, los toma de al query que le pasas de parámetro
campos -> valores de los campos. Por cada registro el QickReport crea una banda.
Totales-> Es un string que se pasa como parámetro con los nombres de los campos que se quieren totalizar.

Por ejemplo
GenerarListado( ADOQuery1, DBGrid1, 'Titulo que quiero que ponga',
'Empresa','Condiciones por si pongo un filtro en la consulta','campo2;campo3','campo1' );

ADOQuery1 es una consulta de articulos en un primer caso
SELECT * FROM Articulos ORDER BY nombre

ADOQuery1 es una consulta de personas en un primer caso
SELECT * FROM Personas ORDER BY nombre

La llamada será igual en los dos casos, cambiando el titulo del listado, el resto lo hará todo la función.

:: Funcion de generar listados a partir de un Grid automáticamente ::
:: Forma de llamarlo ::
:: GenerarListado( Query que queremos imprimir ADO ::
:: Grid asociado a la query ::
:: Titulo del Listado ::
:: empresa del listado ::
:: Condiciones del listado ( literal) ::
:: Campos que queremos sumar separados por comas ::
:: Campos que cuando cambian se imprimen los totales::
:: separados por comas ::
:: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: }


POR CIERTO, me he dado cuenta de que el código publicado no está del todo correcto al ser primeras versiones, seguro que tiene algun error. Si puedo os colgaré el bueno, con el dfm para que podais echarle un vistazo.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
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


La franja horaria es GMT +2. Ahora son las 17:10:42.


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