Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Como Rellenar Componentes En Qreport (https://www.clubdelphi.com/foros/showthread.php?t=78107)

MARIA_MAR 20-03-2012 19:56:33

Como Rellenar Componentes En Qreport
 
Buenas tardes a todos, tengo un problema con un qreport. Tengo definidos varios componentes de tipo QRRICHTEXT (50) , y debo ir rellenandolos.
Cuando invoco el qreport debo ir recorriendo los 50 QRRICHTEXT pero no se como indicarle el nombre de cada uno sin necesidad de escribir 50 veces lo mismo.
Os paso el codigo que estoy utilizando, en el cual evidentemente la variable "ncelda" es un string y me da error. ¿ Como puedo hacerlo ?


var ncelda:string;

begin
profe:='1';
finforme:=tfinforme.Create(self);
for orden:= 1 to 49 do
begin
ncelda:='q'+IntTostr(orden);
memo:='celda'+IntTostr(orden);

basededatos.ado_uno.SQL.Clear;
basededatos.ado_uno.SQL.Add('SELECT * FROM GRUPOHORARIO WHERE C_PROFESOR="'+profe+'" AND CELDA="'+memo+'";');
basededatos.ado_uno.Active:=true;
basededatos.ADO_uno.First;
While not basededatos.ado_uno.Eof do
begin
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);
basededatos.ado_uno.Next;
end;

fdisenohorario.QuickRep1.Preview;
end;


Gracias por el tiempo que dedicais todos a este foro.

ecfisa 20-03-2012 21:47:57

Hola MARIA_MAR.

Por favor cuando incluyas código en tus mensajes, para darle mayor legibilidad usa los TAG's. Te pongo una imágen que explica el uso:




Un saludo. :)

kapcomx 20-03-2012 23:22:10

error
 
podrias decir exactamente que dice el error???:confused:

MARIA_MAR 21-03-2012 11:07:07

Gracias ecfisa por tu aclaración , vuelvo a plantear mi mensaje como me indicas.
Tengo un problema con un qreport. Tengo definidos varios componentes de tipo QRRICHTEXT (50) , y debo ir rellenandolos.
Cuando invoco el qreport debo ir recorriendo los 50 QRRICHTEXT pero no se como indicarle el nombre de cada uno sin necesidad de escribir 50 veces lo mismo.
Os paso el codigo que estoy utilizando, en el cual evidentemente la variable "ncelda" es un string y me da error. ¿ Como puedo hacerlo ?

Código Delphi [-]
var ncelda:string; 

begin
profe:='1';
finforme:=tfinforme.Create(self);
for orden:= 1 to 49 do
begin
ncelda:='q'+IntTostr(orden);
memo:='celda'+IntTostr(orden);

basededatos.ado_uno.SQL.Clear;
basededatos.ado_uno.SQL.Add('SELECT * FROM GRUPOHORARIO WHERE C_PROFESOR="'+profe+'" AND CELDA="'+memo+'";');
basededatos.ado_uno.Active:=true;
basededatos.ADO_uno.First;
While not basededatos.ado_uno.Eof do
begin
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);
basededatos.ado_uno.Next;
end; 

fdisenohorario.QuickRep1.Preview;
end;

El error me da es sintactico y marca la siguiente linea
Código Delphi [-]
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);

Y me dice:
"Undeclared identifier: 'ncelda' "
"Missing operator or semicolon"

Espero haber sido un poco mas clara y que asi me podais ayudar.
Gracias

juanlaplata 21-03-2012 13:26:00

No se si interpreto bien tu codigo, veamos ..
1ro.
Código Delphi [-]
var ncelda:string;
mas adelante.
Código Delphi [-]
ncelda:='q'+IntTostr(orden);
el cual va ir tomando el valor segun el bucle
q1
q2
..
q49
el cual no veo q utilices en ningun momneto.

y por ultimo
Código Delphi [-]
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);

aqui tratas a "ncelda" como un memo cuyo "dueño" dice ser "finforme"

El error dice q en finforme no existe declaracion ncelda.
Esto es correcto ?

MartinS 21-03-2012 15:31:15

Estee... No entiendo? :confused: ¿50 QRRICHTEXT en un QReport? :o Con que los rellenas y donde los estas invocando?..

Saludos

MARIA_MAR 21-03-2012 16:31:31

Hola juanlaplata,
Si me has interpretado bien, el problema que tengo es que no se como declarar 'ncelda' ó como ponerlo para que sea un memo en vez de un string,
y a su vez vaya cambiando su valor en el bucle.
Saludos

MartinS 21-03-2012 16:35:43

Hola: Ahora mas o menos interprete lo que quieres hacer... (Puede que no)
El error se da porque declaraste la variable string ncelda y despues en:
Código Delphi [-]
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);
la tratas como componente. Lo que debes hacer es verificar que antes de asignar el valor si el componente de llegada es un TQRRichText. Lo que yo suelo hacer es lo siguiente y como para que te des una idea:

Código Delphi [-]
 for I := 0 To ComponentCount -1 do
    BEgin
      if (Components[i] Is TEdit) then
         (Components[i] as TEdit).Text := '';
    End;

en este caso lo que hace es de acuerdo a todos los componentes que hay dentro del formulario ir verificando si alguno es del tipo TEdit (en este ejemplo) y en el caso de que así sea aplica el correspondiente valor...

Para tu caso:

Código Delphi [-]
 for I := 0 To FInforme.ComponentCount -1 do
    BEgin
      if (FInforme.Components[i] Is TQrRichText) then
         (FInforme.Components[i] as TQrRichText).Lines.Add := Valor;
    End;

Espero que hayas entendido y que yo tambien haya interpretado :D

Saludos y cualquier cosa acá estamos.

juanlaplata 21-03-2012 17:15:17

seguimos con el analisis ....
finforme, lo tienes prediseñado ?
si es asi, inserta un memo, y renombralo como ncelda.
o de que tipo es finforme ?
trata de redactar un poco mas el contexto, como para , talves, buscar otro camino para el mismo resultado

MARIA_MAR 21-03-2012 18:52:34

Bueno Martins,tu idea me ha sido muy valida y he conseguido solucionarlo gracias a ti, de esta manera ya me da
igual que haya 50 componentes TQrRichText ó 200. Paso el codigo de como lo he dejado al final por si le sirve a alguien
de ayuda, solo aclarar que en el Qreport ha asignado a cada TQrRichText un 'Tag' para llevar un orden.

Código Delphi [-]
 
begin
 fdisenohorario:=tfdisenohorario.Create(self);
 for i:=0 to fdisenohorario.ComponentCount-1 do
  begin
  if (fdisenohorario.Components[i] is TQrRichtext) then
  begin
  orden:=(fdisenohorario.Components[i].Tag);
  memo:='celda'+IntTostr(orden);

          basededatos.ado_uno.SQL.Clear;
          basededatos.ado_uno.SQL.Add('SELECT * FROM GRUPOHORARIO WHERE C_PROFESOR="'+profe+'" AND CELDA="'+memo+'";');
          basededatos.ado_uno.Active:=true;
          basededatos.ADO_uno.First;
   While not basededatos.ado_uno.Eof do
     begin
     (fdisenohorario.Components[i] as TQrRichText).Lines.Add(' '+basededatos.ado_uno.FieldByName('ALUMNO').AsString);
     basededatos.ado_uno.Next;
     end; // del while
  end; // del if
  end; // del for

  // Imprimo el previo
  fdisenohorario.e_nombreprofesor.Lines.Add(e_nombreprofesor.Text);
  fdisenohorario.QuickRep1.Preview;

 end; // del if

Al final no he necesitado para nada la variable 'ncelda' que tantos problemas me daba.

De nuevo muchas gracias a todos por se tan atentos.


La franja horaria es GMT +2. Ahora son las 01:37:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi