ListBox de controles
#1
Escrito 27 noviembre 2010 - 04:11
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
#2
Escrito 27 noviembre 2010 - 05:27
No entiendo exactamente lo que quieres hacer o lograr. Mira de explicarte un poco mejor a ver si podemos ayudarte
Nos leemos
#3
Escrito 27 noviembre 2010 - 05:37
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
#4
Escrito 27 noviembre 2010 - 06:02
Bueno, si lo que quiere es eso, siempre puede usar un TScrollBox para ir poniéndolos.
Nos leemos
#5
Escrito 27 noviembre 2010 - 06:37
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.Bueno, si lo que quiere es eso, siempre puede usar un TScrollBox para ir poniéndolos.
Claro que el TDBCtrlGrid no servirá si los datos no se toman de un Dataset.
Saludos
#6
Escrito 27 noviembre 2010 - 06:47
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
#7
Escrito 27 noviembre 2010 - 08:10
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
#8
Escrito 27 noviembre 2010 - 08:54
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
#9
Escrito 27 noviembre 2010 - 09:08
Es que también quería imprimir los TShape de colores con los edit dentro
Gracias a todos
#10
Escrito 27 noviembre 2010 - 09:34
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
#11
Escrito 27 noviembre 2010 - 10:59
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.
var Cnv: TControlCanvas; Bmp: TBitmap; begin Cnv := TControlCanvas.Create; Bmp := TBitmap.Create; y := 0; Printer.BeginDoc; for I := 0 to ScrollBox1.ControlCount - 1 do // with ScrollBox1.Controls[I] do begin if ScrollBox1.Controls[i] is TPanel then begin cnv.Control := ScrollBox1.Controls[i]; Bmp.Width := ScrollBox1.Controls[i].Width; Bmp.Height:= ScrollBox1.Controls[i].Height; Bmp.Canvas.Copyrect(Bmp.Canvas.ClipRect, Cnv, Cnv.ClipRect); printer.canvas.draw(0, y, bmp); y := y+100; end; end; Printer.EndDoc; Bmp.Free; Cnv.Free; end;
Gracias a todos
#12
Escrito 28 noviembre 2010 - 06:02
...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 .
var DC: HDC; WRect: TRect; PrintHeight: integer; begin DC:= GetWindowDC(Form1.Handle); Windows.GetWindowRect(Form1.Handle, WRect); Printer.BeginDoc; 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); Printer.EndDoc; ReleaseDC(Form1.Handle, DC) end;
Saludos.
#13
Escrito 28 noviembre 2010 - 01:48
Gracias por contestarme. Referente al post de escafandra lo he aplicado a mi código como
buenamente sé y no me aparece nada.
Cnv := TControlCanvas.Create; Bmp := TBitmap.Create; y := 0; Printer.BeginDoc; for I := 0 to ScrollBox1.ControlCount - 1 do with ScrollBox1.Controls[I] do begin if ScrollBox1.Controls[i] is TPanel then begin cnv.Control := ScrollBox1.Controls[i]; DC:= GetWindowDC(Cnv.Handle); Windows.GetWindowRect(Cnv.Handle, WRect); PrintHeight:= MulDiv(Printer.PageWidth, WRect.Bottom-WRect.Top, WRect.right-WRect.Left); Windows.StretchBlt(Printer.Canvas.Handle, 0, y, Printer.PageWidth, PrintHeight, DC, 0, 0, WRect.right-WRect.Left, WRect.Bottom-WRect.Top, SRCCOPY); ReleaseDC(Form1.Handle, DC); Inc(y,500); end; end; Printer.EndDoc;
Hay que tener en cuenta que en el Scrollbox hay paneles que no están a la vista
Gracias a todos
Saludos
#14
Escrito 28 noviembre 2010 - 04:33
var DC: HDC; WRect: TRect; PrintHeight: integer; I, y: integer; ChildPanel: TPanel; begin y:=0; Printer.BeginDoc; for I := 0 to ScrollBox1.ControlCount - 1 do begin if ScrollBox1.Controls[i] is TPanel then begin ChildPanel:= ScrollBox1.Controls[i] as TPanel; DC:= GetWindowDC(ChildPanel.Handle); Windows.GetWindowRect(ChildPanel.Handle, WRect); PrintHeight:= MulDiv(Printer.PageWidth, WRect.Bottom-WRect.Top, WRect.right-WRect.Left); Windows.StretchBlt(Printer.Canvas.Handle, 0, y, Printer.PageWidth, PrintHeight, DC, 0, 0, WRect.right-WRect.Left, WRect.Bottom-WRect.Top, SRCCOPY); ReleaseDC(ChildPanel.Handle, DC); Inc(y, PrintHeight); end; end; Printer.EndDoc; end;
Ten en cuenta que imprime aprovechando todo el ancho de la hoja, debes ajustar al tamaño que te convenga.
Saludos.
#15
Escrito 29 noviembre 2010 - 12:49
En este ejemplo conseguimos ajustar las escalas pantalla - impresora:
var DC, ScreenDC: HDC; WRect: TRect; PWidth, PHeight: integer; ScreenResX, ScreenResY, PrinterResX, PrinterResY: integer; I, Y: integer; ChildPanel: TPanel; begin y:=0; ScreenDC:= GetDC(0); ScreenResX:= GetDeviceCaps(ScreenDC, LOGPIXELSX); ScreenResY:= GetDeviceCaps(ScreenDC, LOGPIXELSY); PrinterResX:= GetDeviceCaps(Printer.Handle, LOGPIXELSX); PrinterResY:= GetDeviceCaps(Printer.Handle, LOGPIXELSY); ReleaseDC(0, ScreenDC); Printer.BeginDoc; for I := 0 to ScrollBox1.ControlCount - 1 do begin if ScrollBox1.Controls[i] is TPanel then begin ChildPanel:= ScrollBox1.Controls[i] as TPanel; ScrollBox1.ScrollInView(ChildPanel); ScrollBox1.Update; Windows.GetClientRect(ChildPanel.Handle, WRect); DC:= GetWindowDC(ChildPanel.Handle); PWidth:= MulDiv(WRect.Right, PrinterResX, ScreenResX); PHeight:= MulDiv(WRect.Bottom, PrinterResY, ScreenResY); Windows.StretchBlt(Printer.Canvas.Handle, 0, Y, PWidth, PHeight, DC, 0, 0, WRect.Right, WRect.Bottom, SRCCOPY); ReleaseDC(ChildPanel.Handle, DC); Inc(y, PHeight+100); end; end; Printer.EndDoc; end;
Saludos.
#16
Escrito 09 diciembre 2010 - 02:32
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
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.
p1 := TPanel.Create(ScrollBox1); p1.Parent := ScrollBox1; ed1 := TEdit.Create(p1); ed1.Parent := p1; p2 := TPanel.Create(ScrollBox1); p2.Parent := ScrollBox1; p2.Top := 50; ed2 := TEdit.Create(p2); ed2.Parent := p2;
Gracias por ayudarme
Saludos
#17
Escrito 09 diciembre 2010 - 02:39
de lo que se ve en pantalla.
#18
Escrito 09 diciembre 2010 - 03:31
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
#19
Escrito 09 diciembre 2010 - 03:54
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