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.