Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: lucius en Enero 14, 2016, 03:06:21 am
-
HOLA, despues de tiempo retomanto un proyecto.
El siguiente codigo hace o simula una especie de salto de linea cuando el ancho del nombre del articulo es
demaciado ancho para ser exactos corta la cadena tomando los 1ero cuarenta caracteres y luego crea una
2da linea con el resto del nombre del producto.
El problema esta en que ya 2 lineas no son sufientes ya que necesito imprimir textos pudiendo ser 3 o 4 lineas y no he podido solucionarlo he probado de muchas formas pero siempre falta algo, haber si me pueden ayudar.
Public Sub Imprime_doc(rsT As Recordset, f As Form)
Dim sImp0, sImp1, sImp2, sImp3 As String
Dim Linea, Linea1, Linea2 As String
On Error GoTo Impresion
With Printer
.ScaleMode = vbCentimeters
.FontName = "LinePrinter"
End With
Printer.CurrentY = CDbl(1) 'Horizontal
rsT.MoveFirst
Do Until rsT.EOF
With rsT
sImp0 = Format(Trim(!nomProd))
Linea = Mid(Len(Trim(!nomProd)), 1) 'Numero de caracteres del producto
If Linea >= CDbl(40) Then 'Si sobrepasa los 40 caracteres
Linea1 = Left(sImp0, CDbl(40)) '1ºlinea
Linea2 = Right(sImp0, CDbl(Linea) - CDbl(40)) '2ºlinea
Else
Linea1 = sImp0
Linea2 = ""
End If
Printer.CurrentX = CDbl(1) 'Vertical
Printer.Print Linea1;
sImp1 = Format(!precioVenta, "Fixed")
Printer.CurrentX = CDbl(10) - (Printer.TextWidth(sImp1)) 'Alinea los decimales a la derecha?
Printer.Print sImp1;
sImp2 = Format(!Cantidad)
Printer.CurrentX = CDbl(12) - (Printer.TextWidth(sImp2))
Printer.Print sImp2;
sImp3 = Format(!SubTotal, "Fixed")
Printer.CurrentX = CDbl(14) - (Printer.TextWidth(sImp3))
Printer.Print sImp3;
'Si existe una 2da linea "osea si no esta vacio"
If Not Linea2 = Empty Then
Printer.CurrentX = CDbl(1)
Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador de filas(se refiere a cuando el nombre es demaciado largo)
Printer.Print Linea2;
Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items(se refiere a cuando cambia de items)
Else
Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items
End If
End With
rsT.MoveNext
Loop
Printer.EndDoc
Exit Sub
Impresion:
MsgBox "error"
Err.Clear
End Sub
-
Hola lucius
me tomé la libertad de hacer una leves "correcciones", prueba con esto y nos comentas:
Public Sub Imprime_doc(rsT As Recordset)
Dim sImp0, sImp1, sImp2, sImp3 As String
Dim Linea() As String
Dim TotalLin, I As Integer
On Error GoTo Impresion
With Printer
.ScaleMode = vbCentimeters
.FontName = "LinePrinter"
End With
Printer.CurrentY = CDbl(1) 'Horizontal
rsT.MoveFirst
Do Until rsT.EOF
With rsT
'-.-.CORREGIDO.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
sImp0 = Format(Trim(!nomProd))
TotalLin = Len(Trim(!nomProd)) 'Numero de caracteres del producto
If TotalLin >= CInt(40) Then 'Si sobrepasa los 40 caracteres
'DIvidir Lineas
TotalLin = TotalLin / 40
ReDim Linea(TotalLin)
For I = 0 To TotalLin
Linea(I) = Mid$(sImp0, (40 * I) + 1, 40)
Next I
Else
Linea(0) = sImp0
End If
Printer.CurrentX = CDbl(1) 'Vertical
Printer.Print Linea(0);
'-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
sImp1 = Format(!PrecioVenta, "Fixed")
Printer.CurrentX = CDbl(10) - (Printer.TextWidth(sImp1)) 'Alinea los decimales a la derecha?
Printer.Print sImp1;
sImp2 = Format(!Cantidad)
Printer.CurrentX = CDbl(12) - (Printer.TextWidth(sImp2))
Printer.Print sImp2;
sImp3 = Format(!SubTotal, "Fixed")
Printer.CurrentX = CDbl(14) - (Printer.TextWidth(sImp3))
Printer.Print sImp3;
'-.-.CORREGIDO.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
'Si existe una 2da linea "osea si no esta vacio"
If UBound(Linea) >= 1 Then
Printer.CurrentX = CDbl(1)
Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador de filas(se refiere a cuando el nombre es demaciado largo)
For I = 1 To UBound(Linea)
Printer.Print Linea(I);
Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador entre Items(se refiere a cuando cambia de items)
Printer.CurrentX = CDbl(1)
Next I
Else
Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items
End If
'-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
End With
rsT.MoveNext
Loop
Printer.EndDoc
Exit Sub
Impresion:
MsgBox "error"
Err.Clear
End Sub
Solo faltaría resolver el detalle de que las palabras que queden justo en el salto de linea se cortarán abruptamente...
te lo dejo de tarea... (estoy en el trabajo, pero no resistí la tentación del desafío xDD)
-
Hola, se fue el dia y no tuve tiempo de probar, tendre que esperar a mañana, te pasaste doc ojala y mañana me ilumine y lo solucione jeje
-
HOLA podrias re-explicar o a que te referias con cortar las palabras justo despues del salto de linea, he probado el codigo y aparentemente crea el numero de lineas indicado y las corta correctamente tomando 40 caracteres por linea pero si el siguiente item(producto) solo tiene 1 Linea entonces rellena las siguientes lineas tomando el contenido del item anterior, probe vaciando la variable dentro del bucle y funciono pero me deja tremendo hueco entre cada item.
If UBound(Linea) >= 1 Then
Printer.CurrentX = CDbl(1)
Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador de filas(se refiere a cuando el nombre es demaciado largo)
For i = 1 To UBound(Linea)
Printer.Print Linea(i);
Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador entre Items(se refiere a cuando cambia de items)
Printer.CurrentX = CDbl(1)
Linea(i) = "" 'ADICIONAL
Next i
Else
Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items
End If
-
Algo similar aca tenes
http://leandroascierto.com/foro/index.php?topic=2116.msg11775#msg11775 (http://leandroascierto.com/foro/index.php?topic=2116.msg11775#msg11775)
-
Lo que pasa es que si, por ejemplo, la palabra "zapato" queda justo en los 40 caracteres te quedará "zap" en una linea y "ato" en la otra... esop...
probé el bucle y no me deja los "tremendos huecos" entre items, aunque dependerá de la cantidad de lineas resultantes de cada item que agregues y dividas en lineas.
(http://s28.postimg.org/dmfq3qc4p/pri_Printer_Professional_2016_01_15_15_14_53.jpg) (http://postimg.org/image/dmfq3qc4p/)
Amigo ENTER, en el ejemplo que das, cuando es más de una página a imprimir el texto se desordena....
(http://s14.postimg.org/9k296d54d/pri_Printer_Professional_2016_01_15_15_14_53.jpg) (http://postimg.org/image/9k296d54d/)
-
Hola a todos, bueno Axio lo que sucede es que en tu ejemplo utilizas el mismo texto pero si
ITEM 1 tiene 5 linea
ITEM 2 tiene 2 linea
Aqui agrega 3 lineas adicionales y las toma del anterior
ITEM 3 tiene 1 linea
Lo que probado directamente en mi proyecto quiza sea por eso.
Enter ahora reviso tu link, saludos
-
Aca otro ejemplo justamente dice una parte del codigo respetando las palabras completas y ajustando sea necesario.
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/99-ejemplo-impresion.htm (http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/99-ejemplo-impresion.htm)
Yo no los pude probar no tengo ahora el VB6 instalado. pero creo que es lo que estas buscando.