ESPACIOS ENTRE TEXTBOX CON OTRO TEXTBOX Y LISTBOX CON OTRO LISTBOX

Iniciado por ELFER, 24 Junio 2021, 06:40 AM

0 Miembros y 1 Visitante están viendo este tema.

ELFER

HOLA ALGUIEN ME PUEDE AYUDAR ESTOY TRABAJANDO EN VISUAL BASIC 6.0

TENGO ESTE CODIGO

Printer.Print (Text33.Text); (Text22.Text)

LO QUE BUSCO ES QUE LA INFORMACION DE LOS TEXTBOX NO ESTEN JUNTAS SI NO QUE TENGAN UN ESPACIO ADECUADO 

EJEMPLO

TEXT33                       TEXT22




Y LO MISMO PERO CON LIST BOX



LISTBOX1                  LISTBOX2


GRACIAS SI ALGUIEN ME PUEDE AYUDAR

Serapis

De entrada señalar que VB6 tiene su foro específico: https://foro.elhacker.net/programacion_visual_basic-b50.0/

y... Guau... debes tener cero conocimientos de programación.
Lo que buscas, se llama de forma genérica, "manipulación de cadenas". Una de las funciones de ese tratamiento, se llama 'concatenar'.
Código ( vb) [Seleccionar]

private txt as string

' ...

 txt = Text33.Text & vbtab & Text22.Text  ' por ejemplo...
 Printer.Print txt
 ' ...


El problema añadiendo un tabulador es que si bien separa horizontalmente un texto del otro, es dependiente del ancho de cada campo en particular, luego se verá una especie de columnas pero irregulares, no mantendrán la posición entre líneas. Incluso si un texto tiene justamente el mismo ancho que un número determinado de tabuladores, los dos textos quedarían unidos, luego quizás podría convenir añadir 2 espacios o bien su remplazo por sendos espacios. Con el uso de tabuladores, puede garantizarse columnas perfectas, si los textos apenas se diferencian en el ancho.

Otra de las funciones del tratamiento de cadenas es 'formatear' (dar formato), que básicamente lo que pretende es mantener un aspecto específico, el cual viene a depender de lo que pretenda el usuario, es un nombre muy genérico, porque hay infinidad de opciones. Con ello mantienen un control más estricto de 'las columnas', a cambio de algo más de código...

En tu caso vamos a suponer que requieres 2 columnas, por tanto el formateo consistirá en fijar que el ancho de un texto no sobrepase el otorgado al ancho de columna, para ello se cortará el texto si sobrepasa dicho ancho...
No suele ser deseable cortar un texto, pero si quieres mantener columnas el ancho del texto debe ceñirse al espacio de columna, o usar un papel extra ancho...

Primero, conviene crear una función que determine el punto donde comienza cada columna.
Código ( vb) [Seleccionar]

   dim BeginCols() as integer
   dim AnchoCol as integer

   ' Esta función crea un array donde almacena el punto se comienzo de cada columna. La función se diseña con un parámetro para que pueda ser invocado múltiples veces si hay necesidad de saltar entre diferente númeor de columnas en cualquier momento.
   ' NOTA: Considera todas las columnas de igual tamaño, en otro caso modificar al gusto...
   private sub InicializarImpresion(byval NumColumnas as byte)
       dim j as integer, k as integer

       redim BeginCols(1 to numColumnas)

       AnchoCol  = ((printer.scalewidth - printer.scaleleftleft) \ numcolumnas)
       BeginCols(1)= printer.scaleleftleft
       for k= 2 to numcolumnas
           BeginCols(k) = ((BeginCols(k-1) + AnchoCol )
       next
   end sub


Código ( vb) [Seleccionar]

    call InicializarImpresion(2)  ' esto se debería invocar cuando se pulsa el botón para imprimir...  ...y cada vez que cambie el número de columnas.
    ...
    call FormateareImprimir(Text33.Text, Text22.Text))  ' esto se debe invocar con cada línea con su par de textos...
    ' ...

   
   private function FormateareImprimir(byref Columna1 as string, byref Columna2 as string)
       dim j as integer,  t as integer, txt as string

       t = printer.currenty
       txt = FormatearPrn(columna1,AnchoCol-10)  ' -10 para que haya al menos siempre un espacio entre columnas.
       printer.currentx = BeginCols(1)
       Printer.Print txt

       txt = FormatearPrn(Columna2, AnchoCol-10)
       printer.currentx = BeginCols(1): printer.currentY = t
       Printer.Print txt

       ' saltamos a la siguiente línea...
       printer.currentY = (t + printer.textHeight("A")  ' el alto de impresión para cualquier texto, es el alto de la fuente, sin importar el texto pasado excepto una cadena vacía.
   end function

   ' Recorta el texto si es preciso, para que no ocupe más del espacio destinado a la columna.
   ' Mide la cadena si supera el ancho máximo concedido, va retirando un carácter  en cada ciclo de un bucle hasta que cumpa la condición.
   ' NOTA: Si el tamaño de fuente o el número de columnas es ridículo (gigante), el texto podría tener 0 caracteres y genear error... Uno debe aprender a lidiar con su propia idiotez.
   private function FormatearPrn(byref Texto as string, byval MaxAncho as integer) as string
       dim w as integer, numchars as integer

       numchars = len(texto)
       w = printer.textwidth(texto)
       do while (w > Maxancho)
           numchars = (numchars -1)
           texto = left$(texto, numchars)
           w = printer.textwidth(texto)
       loop

       FormatearPrn = texto
   end function


Esto es solo una aproximación rápida hacia tu objetivo, (seguramente) tendrás que 'trabajarlo' un poquito hasta que salga como tu quieres...

...y bueno ya tienes por donde tirar, aunque me temo que si estás tan verde que no sabes 'concatenar' todo esto te sonará a chino y tampoco sabrás por donde tirar, pero esto es lo normal cuando uno quiere correr sin saber andar (los tortazos contra el suelo, están garantizados).

EdePC

Cita de: ELFER en 24 Junio 2021, 06:40 AM
HOLA ALGUIEN ME PUEDE AYUDAR ESTOY TRABAJANDO EN VISUAL BASIC 6.0

TENGO ESTE CODIGO

Printer.Print (Text33.Text); (Text22.Text)

LO QUE BUSCO ES QUE LA INFORMACION DE LOS TEXTBOX NO ESTEN JUNTAS SI NO QUE TENGAN UN ESPACIO ADECUADO 

EJEMPLO

TEXT33                       TEXT22

Y LO MISMO PERO CON LIST BOX

LISTBOX1                  LISTBOX2

GRACIAS SI ALGUIEN ME PUEDE AYUDAR

Saludos,

- Print puede utilizar el argumento Tab(n) para determinar un tabulado más preciso, por ejemplo primero puedes calcular o determinar el tamaño de tu texto más grande y a partir de él hacer la tabulación:

Código (vb) [Seleccionar]
Private Sub Command1_Click()
  Dim n As Integer
  n = Len("12345678901234") + 2
 
  FontName = "Consolas"
  Printer.Print Text1; Tab(n); Text2
  Printer.Print "hola"; Tab(n); "nabucodonosor"
  Printer.Print "columna1"; Tab(n); "col2"
  Printer.Print "12345678901234"; Tab(n); "prado"
  Printer.EndDoc
End Sub


CitarText1          Text2
hola           nabucodonosor
columna1       col2
12345678901234 prado

Por cierto, la tabulación por defecto es Tab(13)