Ir al contenido


Foto

ListBox de controles


  • Por favor identifícate para responder
18 respuestas en este tema

#1 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 27 noviembre 2010 - 04:11

Hola a todos
  A ver si me podíais ayudar indicándome algún componente que funcione parecido a un listBox pero
en el que se añadiesen contoles, edits, labels etc y se pudiese imprimir.

Muchas gracias a todos


  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 noviembre 2010 - 05:27

Buenas,

No entiendo exactamente lo que quieres hacer o lograr. Mira de explicarte un poco mejor a ver si podemos ayudarte

Nos leemos

  • 0

#3 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 27 noviembre 2010 - 05:37

Creo que lo que buscas es algo "parecido" a lo que se consigue con el control TDBCtrlGrid que trae Delphi de fábrica, aunque este control sólo permite insertar controles DBAware (los de la paleta "DataControls") o bien otros controles como etiquetas (TLabel) o imágenes (TImage), pero no podrás poner botones. Por cada registro te genera una fila y cuando pulsas sobre dicha fila puedes editar los TDBEdits ... etc, y lo de imprimir lo harías como de normal con cualquier DataSet, usando un reporteador como QuickReports.

Claro que si los datos no provienen de ninguna Base de Datos, entonces no te servirá y tendrás que echar mano de un componente de terceros.

Saludos
  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 noviembre 2010 - 06:02

Buenas,

Bueno, si lo que quiere es eso, siempre puede usar un TScrollBox para ir poniéndolos.

Nos leemos

  • 0

#5 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 27 noviembre 2010 - 06:37

Bueno, si lo que quiere es eso, siempre puede usar un TScrollBox para ir poniéndolos.

Lo que yo he entendido es que se quiere mostrar muchas filas, con distinta información cada una, al estilo de un TListBox pero mostrando varios controles en cada fila para hacerlo más vistoso, en vez de un simple texto. Con el TScrollBox tienes que crear un panel para cada fila y duplicar controles a diestro y siniestro.

Claro que el TDBCtrlGrid no servirá si los datos no se toman de un Dataset.

Saludos
  • 0

#6 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 noviembre 2010 - 06:47

Buenas,

Bueno, si en cada fila quiere los mismos controles cada vez, siempre puede crear un TFrame con esos controles e ir añadiendo dicho frame al ScrollBox. Es sencillo incluso hacerlo por código ;)

La cantidad de controles la tienes, sí, pero los añades de forma rápida y sencilla

Nos leemos

  • 0

#7 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 27 noviembre 2010 - 08:10

Hola a todos

  Os agradezco mucho vuestras contestaciones. Lo del listBox creo que si me valdría, quería crear filas
con controles TSaphe o  TPanel y dentro de cada uno de esos TShape o TPanel un TEdit. No creo que tuviese problemas.
  Ahora la historia sería en como imprimir eso. He estado mirando en transformarlo a un bitmap pero solo
me sale la los controles que estan a la vista del scrollbox los controles que no se ven en el scrollbox no salen.

Me podrias orientar con lo de imprimir.

Muchas gracias a todos

  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 noviembre 2010 - 08:54

Buenas,

Si lo que quieres imprimir es el contenido del TEdit, lo tienes "sencillo". Te creas un QReport con una banda detalle y dentro de ella un TQrText (o como sea, que no tengo aquí el Delphi).

Luego, mediante el evento OnNeedData del QReport y su parámetro MoreData puedes controlar el final del listado.

Espero te sirva la idea

Nos leemos

  • 0

#9 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 27 noviembre 2010 - 09:08

Hola a todos

  Es que también quería imprimir los TShape de colores con los edit dentro

Gracias a todos

  • 0

#10 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 noviembre 2010 - 09:34

Buenas,

No tengo el QReport instalado, pero creo recordar que traía algún tipo de Shape, con lo que podrías simularlo. Podría asignarle los colores en runtime si son diferentes,....

No se, son ideas :)

Nos leemos

  • 0

#11 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 27 noviembre 2010 - 10:59

Hola a todos

  Con este código consigo que me imprima los controles (TPanel) unos debajo de otros, aunque
no esten a la vista, pero en la impresora las medidas son pequeñas.



delphi
  1. var
  2.   Cnv: TControlCanvas;
  3.   Bmp: TBitmap;
  4.  
  5.  
  6. begin
  7.   Cnv := TControlCanvas.Create;
  8.   Bmp := TBitmap.Create;
  9.   y := 0;
  10.   Printer.BeginDoc;
  11.   for I := 0 to ScrollBox1.ControlCount - 1 do
  12. //  with ScrollBox1.Controls[I] do
  13.   begin
  14.     if ScrollBox1.Controls[i] is TPanel then
  15.     begin
  16.       cnv.Control := ScrollBox1.Controls[i];
  17.       Bmp.Width := ScrollBox1.Controls[i].Width;
  18.       Bmp.Height:= ScrollBox1.Controls[i].Height;
  19.       Bmp.Canvas.Copyrect(Bmp.Canvas.ClipRect, Cnv, Cnv.ClipRect);
  20.  
  21.       printer.canvas.draw(0, y, bmp);
  22.       y := y+100;
  23.  
  24.     end;
  25.  
  26.  
  27.   end;
  28.   Printer.EndDoc;
  29.  
  30.   Bmp.Free;
  31.   Cnv.Free;
  32.  
  33. end;



Gracias a todos


  • 0

#12 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 noviembre 2010 - 06:02

Si no entiendo mal, quieres imprimir controles.

...en la impresora las medidas son pequeñas...


Tienes un problema con las escalas. La resolución de la impresora es mayor que la del escritorio, por eso te imprime pequieño.

No es necesario crear un Bitmap para dibujar en la impresora. Puedes hacerlo directamente en su Canvas.

Para conseguir escalar, tienes que usar la API StretchBlt o el método TCanvas.StretchDraw.

Te pongo un ejemplo que imprime un Formulario completo aprovechando todo el ancho de la hoja (incluso el área no imprimible). Uso la API. Adáptalo a tus necesidades  ;) .



delphi
  1. var
  2.   DC: HDC;  WRect: TRect;
  3.   PrintHeight: integer;
  4. begin
  5.   DC:= GetWindowDC(Form1.Handle);
  6.   Windows.GetWindowRect(Form1.Handle, WRect);
  7.   Printer.BeginDoc;
  8.   PrintHeight:= MulDiv(Printer.PageWidth, WRect.Bottom-WRect.Top, WRect.right-WRect.Left);  Windows.StretchBlt(Printer.Canvas.Handle, 0, 0, Printer.PageWidth, PrintHeight, DC, 0, 0, WRect.right-WRect.Left, WRect.Bottom-WRect.Top, SRCCOPY);
  9.   Printer.EndDoc;  ReleaseDC(Form1.Handle, DC)
  10. end;

 


Saludos.
  • 0

#13 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 28 noviembre 2010 - 01:48

Hola a todos
  Gracias por contestarme. Referente al post de escafandra lo he aplicado a mi código como
buenamente sé y no me aparece nada.



delphi
  1. Cnv := TControlCanvas.Create;
  2.   Bmp := TBitmap.Create;
  3.   y := 0;
  4.  
  5.   Printer.BeginDoc;
  6.  
  7.  
  8.   for I := 0 to ScrollBox1.ControlCount - 1 do
  9.   with ScrollBox1.Controls[I] do
  10.   begin
  11.  
  12.     if ScrollBox1.Controls[i] is TPanel then
  13.     begin
  14.  
  15.       cnv.Control := ScrollBox1.Controls[i];
  16.  
  17.         DC:= GetWindowDC(Cnv.Handle);
  18.         Windows.GetWindowRect(Cnv.Handle, WRect);
  19.           PrintHeight:= MulDiv(Printer.PageWidth,
  20.                               WRect.Bottom-WRect.Top, WRect.right-WRect.Left);
  21.           Windows.StretchBlt(Printer.Canvas.Handle, 0, y,
  22.                             Printer.PageWidth, PrintHeight,
  23.                               DC, 0, 0,
  24.                               WRect.right-WRect.Left, WRect.Bottom-WRect.Top,
  25.                               SRCCOPY);
  26.           ReleaseDC(Form1.Handle, DC);
  27.  
  28.           Inc(y,500);
  29.  
  30.  
  31.     end;
  32.  
  33.  
  34.   end;
  35.   Printer.EndDoc;




Hay que tener en cuenta que en el Scrollbox hay paneles que no están a la vista


Gracias a todos
Saludos

  • 0

#14 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 noviembre 2010 - 04:33

Prueba de esta manera:



delphi
  1. var
  2.   DC: HDC;
  3.   WRect: TRect;
  4.   PrintHeight: integer;
  5.   I, y: integer;
  6.   ChildPanel: TPanel;
  7. begin
  8.   y:=0;
  9.   Printer.BeginDoc;
  10.   for I := 0 to ScrollBox1.ControlCount - 1 do
  11.   begin
  12.     if ScrollBox1.Controls[i] is TPanel then
  13.     begin
  14.       ChildPanel:= ScrollBox1.Controls[i] as TPanel;
  15.       DC:= GetWindowDC(ChildPanel.Handle);
  16.       Windows.GetWindowRect(ChildPanel.Handle, WRect);
  17.       PrintHeight:= MulDiv(Printer.PageWidth, WRect.Bottom-WRect.Top, WRect.right-WRect.Left);
  18.       Windows.StretchBlt(Printer.Canvas.Handle, 0, y,
  19.                         Printer.PageWidth, PrintHeight,
  20.                         DC, 0, 0,
  21.                         WRect.right-WRect.Left, WRect.Bottom-WRect.Top,
  22.                         SRCCOPY);
  23.       ReleaseDC(ChildPanel.Handle, DC);
  24.  
  25.       Inc(y, PrintHeight);
  26.     end;
  27.   end;
  28.   Printer.EndDoc;
  29. end;



Ten en cuenta que imprime aprovechando todo el ancho de la hoja, debes ajustar al tamaño que te convenga.

Saludos.
  • 0

#15 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 29 noviembre 2010 - 12:49

Vamos a darle otro empujoncito.

En este ejemplo conseguimos ajustar las escalas pantalla - impresora:


delphi
  1. var
  2.   DC, ScreenDC: HDC;
  3.   WRect: TRect;
  4.   PWidth, PHeight: integer;
  5.   ScreenResX, ScreenResY, PrinterResX, PrinterResY: integer;
  6.   I, Y: integer;
  7.   ChildPanel: TPanel;
  8. begin
  9.   y:=0;
  10.   ScreenDC:= GetDC(0);
  11.   ScreenResX:= GetDeviceCaps(ScreenDC, LOGPIXELSX);
  12.   ScreenResY:= GetDeviceCaps(ScreenDC, LOGPIXELSY);
  13.   PrinterResX:=  GetDeviceCaps(Printer.Handle, LOGPIXELSX);
  14.   PrinterResY:=  GetDeviceCaps(Printer.Handle, LOGPIXELSY);
  15.   ReleaseDC(0, ScreenDC);
  16.  
  17.   Printer.BeginDoc;
  18.   for I := 0 to ScrollBox1.ControlCount - 1 do
  19.   begin
  20.     if ScrollBox1.Controls[i] is TPanel then
  21.     begin
  22.       ChildPanel:= ScrollBox1.Controls[i] as TPanel;
  23.       ScrollBox1.ScrollInView(ChildPanel);
  24.       ScrollBox1.Update;
  25.       Windows.GetClientRect(ChildPanel.Handle, WRect);
  26.       DC:= GetWindowDC(ChildPanel.Handle);
  27.       PWidth:= MulDiv(WRect.Right, PrinterResX, ScreenResX);
  28.       PHeight:= MulDiv(WRect.Bottom, PrinterResY, ScreenResY);
  29.       Windows.StretchBlt(Printer.Canvas.Handle, 0, Y,
  30.                         PWidth, PHeight,
  31.                         DC, 0, 0,
  32.                         WRect.Right, WRect.Bottom,
  33.                         SRCCOPY);
  34.       ReleaseDC(ChildPanel.Handle, DC);
  35.       Inc(y, PHeight+100);
  36.     end;
  37.   end;
  38.   Printer.EndDoc;
  39. end;



Saludos.
  • 0

#16 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 09 diciembre 2010 - 02:32

Hola a todos

  Gracias por tomarte la molestia escafandra, tuve problemas en el trabajo y por eso no había
vuelto a entrar.

El problema viene en la siguiente línea



delphi
  1. Windows.GetClientRect(ChildPanel.Handle, WRect);



Hay paneles que no se ven, entonces no se puede tomar ningún
area(wrect)  de ellos. Se puede saber la altura y la anchura en px.
Estos paneles, con los edit dentro, los creo en tiempo de ejecución.



delphi
  1.   p1 := TPanel.Create(ScrollBox1);
  2.   p1.Parent := ScrollBox1;
  3.  
  4.   ed1 := TEdit.Create(p1);
  5.   ed1.Parent := p1;
  6.  
  7.   p2 := TPanel.Create(ScrollBox1);
  8.   p2.Parent := ScrollBox1;
  9.   p2.Top := 50;
  10.  
  11.   ed2 := TEdit.Create(p2);
  12.   ed2.Parent := p2;



Gracias por ayudarme

Saludos


  • 0

#17 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 09 diciembre 2010 - 02:39

Perdona, que habia hecho mal las pruebas, si se imprimen todos, aunque un poco mas grande
de lo que se ve en pantalla.

  • 0

#18 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 09 diciembre 2010 - 03:31

Hola de nuevo,

  Al final más o menos tienen el mismo tamaño. Ahora lo que ocurre es que si lo imprimo directamente
en la impresora no imprime nada, pero hacéndolo a través de PDFCreator si imprime si imprime los paneles
y los edit.
  Al hilo del asunto resulta que estoy intentado cambiar el color de los paneles que se han creado
en tiempo de ejecucion, estén en el scrollbox o en el form, y no lo consigo, usando la propiedad color.

Gracias a todos

  • 0

#19 jaimeh

jaimeh

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 09 diciembre 2010 - 03:54

Hola de nuevo
  Lo de los colores de los paneles lo he solucionado poniendo la propiedad
  ParentBackground := False;

  Lo que sigue sin imprimirse nada cuando imprimo directamente en la impresora.

Gracias de nuevo

Saludos

  • 0




IP.Board spam blocked by CleanTalk.