Problema con Espacios al Imprimir
Hola,
Les cuento, tengo el siguente quiero imprimir(printer.print) la concateniacion de varios (text1.text) pero entre ellos hay espacio en blano por lo que me sale algo asi
(pq la funcion es text1.text+" "+Tex2.text+" "+text3..)
111 ssssssss 222
1 dsdsdsd 222
he provado rellenando el campo 2 con espacios hasta completar un largo fijo pero pasa lo mismo, si pruebo con TAB me sale casa impresion como una fila, osea
111
ssssssss
2222, etc.
Alguna Ayuda?? les agredecer铆a!
Les cuento, tengo el siguente quiero imprimir(printer.print) la concateniacion de varios (text1.text) pero entre ellos hay espacio en blano por lo que me sale algo asi
(pq la funcion es text1.text+" "+Tex2.text+" "+text3..)
111 ssssssss 222
1 dsdsdsd 222
he provado rellenando el campo 2 con espacios hasta completar un largo fijo pero pasa lo mismo, si pruebo con TAB me sale casa impresion como una fila, osea
111
ssssssss
2222, etc.
Alguna Ayuda?? les agredecer铆a!
Hola,
No he entendido tu pregunta. Bueno, he entendido lo que haces pero no lo que quieres hacer y por qu茅 eso que te pasa est谩 mal.
Saludos
demingo
No he entendido tu pregunta. Bueno, he entendido lo que haces pero no lo que quieres hacer y por qu茅 eso que te pasa est谩 mal.
Saludos
demingo
ME DEJARON UN PROYECTO EN LA UNIVERSIDAD DE COMO SE HACE UN PROBLEMA DE UNA PROGRAMACION
(CUALQUIER PROBLEMA: SEA DE UNA REFRESQUERA,TIENDA DE ROPA, ETC.
(CUALQUIER PROBLEMA: SEA DE UNA REFRESQUERA,TIENDA DE ROPA, ETC.
quiero imprimir algo asi
campo1 campo2 campo3
xxx xxxxxxxxxxx xxxx
xxx xxxxxxxxxxx xxxx
xxx xxxxxxxxxxx xxxx
los datos del campo 2 tiene un largo variable lo que hace que no salga derecho el informe en la impresora(de debe a los espacios en blanco), sale algo asi
por que hago un (rs("campo1")+" "+rs("campo2")+rs("campo3"))
xxx xxxxx xxx
x xxx xxx
entonces mi pregunta es como relleno el campo2 para que quede en largo fijo para q no se descuadre???
campo1 campo2 campo3
xxx xxxxxxxxxxx xxxx
xxx xxxxxxxxxxx xxxx
xxx xxxxxxxxxxx xxxx
los datos del campo 2 tiene un largo variable lo que hace que no salga derecho el informe en la impresora(de debe a los espacios en blanco), sale algo asi
por que hago un (rs("campo1")+" "+rs("campo2")+rs("campo3"))
xxx xxxxx xxx
x xxx xxx
entonces mi pregunta es como relleno el campo2 para que quede en largo fijo para q no se descuadre???
Bueno, pero si lo 煤nico que hay que usar es el Printer.CurrentX
printer.currenty=100
printer.currentx=100
printer.print "valor1"
printer.currentx=350
printer.print "columna2"
printer.currentx=500
printer.print "Latercera"
'ahora saltamos una l铆nea, de altura 50 :
printer.currenty=150
y seguimos con la segunda l铆nea de valores:
printer.currentx=100
printer.print "otro"
printer.currentx=350
printer.print "lo que sea"
printer.currentx=500
printer.print "colocado"
y as铆 todo el rato.
S茅 que parece muy lioso, pero si nos fabricamos una funcioncita a la que se le env铆e la X y la Y, junto con el texto, po´dr铆amos tener algo as铆:
Mprint x,y,texto
y de un tir贸n le enviamos al rpinetr la posici贸n y el texto a imprimir
Si adem谩s le a帽adimos un cuarto par谩metro que se llama alinea, podr铆amos hacer que se alineara a la derecha de esa X, centrado en esa X o a la izquierda de esa X, ¿y c贸mo hacer eso? pues con la funci贸n printer.textwidth, que nos devuelve el ancho de ese string en la impresora, dependiendo del tipo de letra activo. as铆, para poner un ejemplo:
Mprint 500,200,"Hola caracola",1
(el 1 yo quiero que signifique alineaci贸n izquierda)
har铆a esto:
printer.currenty=200
printer.currentx=500-printer.textwidth("Hola caracola")
printer.print "Hola caracola"
Seguro que m谩s de uno lo ha entendido. Pues bien, con esa funci贸n, el imprimir de forma tabulada en la impresora es pan comido.
Saludos
printer.currenty=100
printer.currentx=100
printer.print "valor1"
printer.currentx=350
printer.print "columna2"
printer.currentx=500
printer.print "Latercera"
'ahora saltamos una l铆nea, de altura 50 :
printer.currenty=150
y seguimos con la segunda l铆nea de valores:
printer.currentx=100
printer.print "otro"
printer.currentx=350
printer.print "lo que sea"
printer.currentx=500
printer.print "colocado"
y as铆 todo el rato.
S茅 que parece muy lioso, pero si nos fabricamos una funcioncita a la que se le env铆e la X y la Y, junto con el texto, po´dr铆amos tener algo as铆:
Mprint x,y,texto
y de un tir贸n le enviamos al rpinetr la posici贸n y el texto a imprimir
Si adem谩s le a帽adimos un cuarto par谩metro que se llama alinea, podr铆amos hacer que se alineara a la derecha de esa X, centrado en esa X o a la izquierda de esa X, ¿y c贸mo hacer eso? pues con la funci贸n printer.textwidth, que nos devuelve el ancho de ese string en la impresora, dependiendo del tipo de letra activo. as铆, para poner un ejemplo:
Mprint 500,200,"Hola caracola",1
(el 1 yo quiero que signifique alineaci贸n izquierda)
har铆a esto:
printer.currenty=200
printer.currentx=500-printer.textwidth("Hola caracola")
printer.print "Hola caracola"
Seguro que m谩s de uno lo ha entendido. Pues bien, con esa funci贸n, el imprimir de forma tabulada en la impresora es pan comido.
Saludos
Te pongo una funci贸n para rellenar cualquier cadena.
Private Function rellenar(ByVal cadena As String, ByVal numeroCaracteres As Integer)
If Len(cadena) < numeroCaracteres Then
rellenar = Space(numeroCaracteres - Len(cadena)) & cadena
Else
rellenar = cadena ' Left$(cadena, numeroCaracteres)
End If
End Function
Para probarla pon un textbox y un commandbutton y a帽ade
este c贸digo:
Private Sub Command1_Click()
Text1.Text = rellenar(Text1.Text, 10) 'rellena el contenido de text1 para que tenga 10 caracteres
End Sub
Private Function rellenar(ByVal cadena As String, ByVal numeroCaracteres As Integer)
If Len(cadena) < numeroCaracteres Then
rellenar = Space(numeroCaracteres - Len(cadena)) & cadena
Else
rellenar = cadena ' Left$(cadena, numeroCaracteres)
End If
End Function
Para probarla pon un textbox y un commandbutton y a帽ade
este c贸digo:
Private Sub Command1_Click()
Text1.Text = rellenar(Text1.Text, 10) 'rellena el contenido de text1 para que tenga 10 caracteres
End Sub
Gracias Juan, ya habia probado ese c贸digo, y funciona pero al imprimir igual me sale descuadrado, creo que hay algun problema con los espacios en blanco.
otra cosa que estaba pensando es hacer un reporte con DATAReport y traspazarle algunos datos pero como hago eso desde c贸digo, tendre q averiguar-
otra cosa que estaba pensando es hacer un reporte con DATAReport y traspazarle algunos datos pero como hago eso desde c贸digo, tendre q averiguar-
Te pongo un c贸digo fuente de una funci贸n para imprimir
en columnas. Se le puede especificar el ancho y alineaci贸n
para cada columna. Y por supuesto las cadenas y el
objeto sobre el que se va a imprimir. Devuelve el nº
de columnas que se imprimieron.
Aqu铆 est谩 la funci贸n:
Private Function imprimirLinea(ByRef objetoImprimir As Object, Optional ByRef cadenas As Variant, Optional ByRef anchos As Variant, Optional alineaciones As Variant) As Integer
Static m_alineaciones As Variant, m_anchos As Variant, m_objetoImprimir As Variant
Dim i As Integer, columnas As Integer, aux As Single
If Not IsMissing(objetoImprimir) Then
Set m_objetoImprimir = objetoImprimir
End If
If Not IsMissing(alineaciones) Then
m_alineaciones = alineaciones
End If
If Not IsMissing(anchos) Then
m_anchos = anchos
End If
If Not IsMissing(cadenas) Then
columnas = UBound(cadenas)
i = UBound(m_alineaciones)
If i < columnas Then columnas = i
i = UBound(m_anchos)
If i < columnas Then columnas = i
imprimirLinea = columnas + 1 'Devuelve el nº de columnas imprimidas
For i = 0 To columnas
Select Case m_alineaciones(i)
Case 0 'A la izquierda
objetoImprimir.Print cadenas(i);
objetoImprimir.CurrentX = objetoImprimir.CurrentX + (m_anchos(i) - objetoImprimir.TextWidth(cadenas(i)))
Case 1 'Centrado
aux = (m_anchos(i) - objetoImprimir.TextWidth(cadenas(i))) / 2
objetoImprimir.CurrentX = objetoImprimir.CurrentX + aux
objetoImprimir.Print cadenas(i);
objetoImprimir.CurrentX = objetoImprimir.CurrentX + aux
Case 2 'A la derecha
objetoImprimir.CurrentX = objetoImprimir.CurrentX + (m_anchos(i) - objetoImprimir.TextWidth(cadenas(i)))
objetoImprimir.Print cadenas(i);
End Select
Next i
objetoImprimir.Print
End If
End Function
Para probarla abre un nuevo proyecto, deja el formulario
vacio y pon este c贸digo:
Private Sub Form_Click()
Me.ScaleMode = vbPixels
'Imprimimos encabezado y establecemos el ancho y las alineaciones
imprimirLinea Me, Array("Izquierda", "Centrado", "Derecha"), Array(100, 70, 120), Array(0, 1, 2)
'Imprimimos algunos datos
imprimirLinea Me, Array("as", "sgfg", "ergtgt")
imprimirLinea Me, Array("dfgtdh", "sthyfg", "egt")
imprimirLinea Me, Array("sdfrs", "g", "erghfgshhgt")
imprimirLinea Me, Array("a", "sgdhgfg", "ergt")
imprimirLinea Me, Array("hyhuju", "sukkg", "ukioltgt")
imprimirLinea Me, Array("hjju", "sikilgfg", "erolgtgt")
End Sub
Ejec煤talo y haz click en el formulario.
P.D.: No lo he probado sobre la impresora, pero
supongo que funcionar谩 igual ya que el objeto Printer
tiene los m茅todos que utiliza la funci贸n. Por otra parte
me hubiera gustado no tener que pasar el objeto
en cada llamada, pero me daba error, puede que no
sea posible hacer Static una referencia al objeto. De
todas formas es f谩cil modificar la funci贸n para que
siempre imprima en el Printer y no necesite el 1º
par谩metro.
en columnas. Se le puede especificar el ancho y alineaci贸n
para cada columna. Y por supuesto las cadenas y el
objeto sobre el que se va a imprimir. Devuelve el nº
de columnas que se imprimieron.
Aqu铆 est谩 la funci贸n:
Private Function imprimirLinea(ByRef objetoImprimir As Object, Optional ByRef cadenas As Variant, Optional ByRef anchos As Variant, Optional alineaciones As Variant) As Integer
Static m_alineaciones As Variant, m_anchos As Variant, m_objetoImprimir As Variant
Dim i As Integer, columnas As Integer, aux As Single
If Not IsMissing(objetoImprimir) Then
Set m_objetoImprimir = objetoImprimir
End If
If Not IsMissing(alineaciones) Then
m_alineaciones = alineaciones
End If
If Not IsMissing(anchos) Then
m_anchos = anchos
End If
If Not IsMissing(cadenas) Then
columnas = UBound(cadenas)
i = UBound(m_alineaciones)
If i < columnas Then columnas = i
i = UBound(m_anchos)
If i < columnas Then columnas = i
imprimirLinea = columnas + 1 'Devuelve el nº de columnas imprimidas
For i = 0 To columnas
Select Case m_alineaciones(i)
Case 0 'A la izquierda
objetoImprimir.Print cadenas(i);
objetoImprimir.CurrentX = objetoImprimir.CurrentX + (m_anchos(i) - objetoImprimir.TextWidth(cadenas(i)))
Case 1 'Centrado
aux = (m_anchos(i) - objetoImprimir.TextWidth(cadenas(i))) / 2
objetoImprimir.CurrentX = objetoImprimir.CurrentX + aux
objetoImprimir.Print cadenas(i);
objetoImprimir.CurrentX = objetoImprimir.CurrentX + aux
Case 2 'A la derecha
objetoImprimir.CurrentX = objetoImprimir.CurrentX + (m_anchos(i) - objetoImprimir.TextWidth(cadenas(i)))
objetoImprimir.Print cadenas(i);
End Select
Next i
objetoImprimir.Print
End If
End Function
Para probarla abre un nuevo proyecto, deja el formulario
vacio y pon este c贸digo:
Private Sub Form_Click()
Me.ScaleMode = vbPixels
'Imprimimos encabezado y establecemos el ancho y las alineaciones
imprimirLinea Me, Array("Izquierda", "Centrado", "Derecha"), Array(100, 70, 120), Array(0, 1, 2)
'Imprimimos algunos datos
imprimirLinea Me, Array("as", "sgfg", "ergtgt")
imprimirLinea Me, Array("dfgtdh", "sthyfg", "egt")
imprimirLinea Me, Array("sdfrs", "g", "erghfgshhgt")
imprimirLinea Me, Array("a", "sgdhgfg", "ergt")
imprimirLinea Me, Array("hyhuju", "sukkg", "ukioltgt")
imprimirLinea Me, Array("hjju", "sikilgfg", "erolgtgt")
End Sub
Ejec煤talo y haz click en el formulario.
P.D.: No lo he probado sobre la impresora, pero
supongo que funcionar谩 igual ya que el objeto Printer
tiene los m茅todos que utiliza la funci贸n. Por otra parte
me hubiera gustado no tener que pasar el objeto
en cada llamada, pero me daba error, puede que no
sea posible hacer Static una referencia al objeto. De
todas formas es f谩cil modificar la funci贸n para que
siempre imprima en el Printer y no necesite el 1º
par谩metro.
Podr铆as llevar la informaci贸n a un documento word. Te creas una tabla de tama帽o fijo con tres columnas y metes en cada celda un campo. De ese modo, ser谩 word el encargado de dejarlo bonito para su posterior impresi贸n.
No es muy dificil hacer eso por c贸digo.
Suerto
Saludos
sdemingo
No es muy dificil hacer eso por c贸digo.
Suerto
Saludos
sdemingo
he probado
Printer.Print rs("campo1") + Space(10) + rs("campo2") + Space(10) + rs("campo3")
tb
Printer.Print rs("campo1") ;tab(10); tab(10); rs("campo2"); tab(10); rs("campo3")
pero para este caso me da un salto de linea
Printer.Print rs("campo1") + Space(10) + rs("campo2") + Space(10) + rs("campo3")
tb
Printer.Print rs("campo1") ;tab(10); tab(10); rs("campo2"); tab(10); rs("campo3")
pero para este caso me da un salto de linea
Ciao
Tu problema posiblemente es que el tipo de letra que usas tiene un ancho diferente para cada caracter (p. ejem., el ancho de la letra 'A', es mayor que el de la letra 'I', y, por supuesto, tambien diferente del espacio en blanco ' '. Por ello, como supongo que en cada fila quieres imprimir tienes caracteres distintos, incluido el espaico en blanco, la solucion es imprimir en un tipo de fuente (un tipo de letra) que tenga un ancho fijo, como, por ejemplo, "Courier New". Si has resuelto el problema de rellenar correctamente con espacios en blanco, esta otra solucion te terminara de arreglar el problema.
Espero que te sirva. Cualquier duda, escribe.
NoEsDificil
Tu problema posiblemente es que el tipo de letra que usas tiene un ancho diferente para cada caracter (p. ejem., el ancho de la letra 'A', es mayor que el de la letra 'I', y, por supuesto, tambien diferente del espacio en blanco ' '. Por ello, como supongo que en cada fila quieres imprimir tienes caracteres distintos, incluido el espaico en blanco, la solucion es imprimir en un tipo de fuente (un tipo de letra) que tenga un ancho fijo, como, por ejemplo, "Courier New". Si has resuelto el problema de rellenar correctamente con espacios en blanco, esta otra solucion te terminara de arreglar el problema.
Espero que te sirva. Cualquier duda, escribe.
NoEsDificil
NO, no usemos fuentes de ancho fijo !
S贸lo hay que usar currentx y currenty para conseguir tabular, es muy sencillo.
Si alguien quiere un ejemplo, que lo diga, pero con la explicaci贸n que ya he dado, creo que no tendr谩n problemas.
S贸lo hay que usar currentx y currenty para conseguir tabular, es muy sencillo.
Si alguien quiere un ejemplo, que lo diga, pero con la explicaci贸n que ya he dado, creo que no tendr谩n problemas.
les pongo un ejemplo de la manera en que yo imprimo con Visual Basic:
Private Sub Form_Load()
Dim MiTexto As String
Randomize
MiTexto = "abcdefghij"
Printer.Scale (0, 0)-(2100, 2970)
Printer.Font.Name = "arial"
Printer.Font.Size = 10
Printer.Font.Name = "arial"
Printer.Font.Size = 10
For a = 1 To 40
Printer.Font.Size = 8 + Int(Rnd * 5)
prn 100, 200 + a * 50, Left(MiTexto, Rnd * 10 + 1), 0
prn 400, 200 + a * 50, Int(Exp(Rnd * 15)), 0
prn 600, 200 + a * 50, Int(Exp(Rnd * 15)), 0
prn 800, 200 + a * 50, Int(Exp(Rnd * 15)), 2
prn 1050, 200 + a * 50, Left(MiTexto, Rnd * 10 + 1), 2
prn 1300, 200 + a * 50, Int(Exp(Rnd * 15)), 2
prn 1600, 200 + a * 50, Int(Exp(Rnd * 15)), 1
prn 1800, 200 + a * 50, Int(Exp(Rnd * 15)), 1
prn 2000, 200 + a * 50, Left(MiTexto, Rnd * 10 + 1), 1
Next a
Printer.EndDoc
End Sub
Private Sub prn(X As Long, Y As Long, Texto As String, alineacion As Integer)
Printer.CurrentY = Y
Select Case alineacion
Case 0
Printer.CurrentX = X
Case 1
Printer.CurrentX = X - Printer.TextWidth(Texto)
Case 2
Printer.CurrentX = X - Printer.TextWidth(Texto) / 2
End Select
Printer.Print Texto
End Sub
No hay botones ni nada por el estilo, ejecutamos el c贸digo y se pone a imprimir.
Saludos
Private Sub Form_Load()
Dim MiTexto As String
Randomize
MiTexto = "abcdefghij"
Printer.Scale (0, 0)-(2100, 2970)
Printer.Font.Name = "arial"
Printer.Font.Size = 10
Printer.Font.Name = "arial"
Printer.Font.Size = 10
For a = 1 To 40
Printer.Font.Size = 8 + Int(Rnd * 5)
prn 100, 200 + a * 50, Left(MiTexto, Rnd * 10 + 1), 0
prn 400, 200 + a * 50, Int(Exp(Rnd * 15)), 0
prn 600, 200 + a * 50, Int(Exp(Rnd * 15)), 0
prn 800, 200 + a * 50, Int(Exp(Rnd * 15)), 2
prn 1050, 200 + a * 50, Left(MiTexto, Rnd * 10 + 1), 2
prn 1300, 200 + a * 50, Int(Exp(Rnd * 15)), 2
prn 1600, 200 + a * 50, Int(Exp(Rnd * 15)), 1
prn 1800, 200 + a * 50, Int(Exp(Rnd * 15)), 1
prn 2000, 200 + a * 50, Left(MiTexto, Rnd * 10 + 1), 1
Next a
Printer.EndDoc
End Sub
Private Sub prn(X As Long, Y As Long, Texto As String, alineacion As Integer)
Printer.CurrentY = Y
Select Case alineacion
Case 0
Printer.CurrentX = X
Case 1
Printer.CurrentX = X - Printer.TextWidth(Texto)
Case 2
Printer.CurrentX = X - Printer.TextWidth(Texto) / 2
End Select
Printer.Print Texto
End Sub
No hay botones ni nada por el estilo, ejecutamos el c贸digo y se pone a imprimir.
Saludos