Problema con Espacios al Imprimir

Sigfrid
29 de Febrero del 2008
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!

sdemingo
29 de Febrero del 2008
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

BERTI
29 de Febrero del 2008
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.

Sigfrid
29 de Febrero del 2008
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???

Baltasar
29 de Febrero del 2008
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

Juan
29 de Febrero del 2008
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

Sigfrid
29 de Febrero del 2008
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-

Juan
29 de Febrero del 2008
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.

sdemingo
29 de Febrero del 2008
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

Sigfrid
29 de Febrero del 2008
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

noesdificil
29 de Febrero del 2008
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

Baltasar
29 de Febrero del 2008
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.

Baltasar
29 de Febrero del 2008
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

Jorge
29 de Febrero del 2008
baltasar, me gustaria ver un ejemplo para imprimir en columnas.