Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#841
Puedes mostrar una foto de la impresión, que se vea como va quedando... así me hago cargo del tamaño de los textos, etc...????

p.d.:
Lo que si veo repasando el código, es que a la función ' listarcolumnas', no le has puesto los parámetros necesarios, y por tanto no los recibe, luego parece que simplemente estás imprimiendo un texto detrás del otro, pero sin una consideración correcta de columnas, por eso te está fallando.


Dicho de otro modo... te redacto la función con los parámetros adecuados, ya que parece que no los pasas pero tampoco los inicializas (aunque si el list1)
Código (vb) [Seleccionar]

Private Sub ListarColumnas(byval NumCols as integer, byval MargenIzquierdo as integer, byval AnchoPapel as integer)
Dim AnchoPapel As Integer
    'Dim MargenIzquierdo As Integer, numCols As Integer
    Dim filas As Long
    Dim ultimafila As Long
    Dim k As Long, j As Long, i As Integer, n As Integer, anchocol As Integer
    Dim linea As String
    'Dim margen As Integer
    Dim fuente As StdFont


    Set fuente = Printer.Font
    'numCols = 4  Se recibe por parámetro mejor...
    Printer.FontName = "Courier New"  ' una fuente monoespaciada, si no el trabajo es más laborioso...
    filas = ((List1.ListCount + 1) \ numCols)
    ultimafila = ((List1.ListCount + 1) Mod numCols) ' columnas que tendrá la última fila.
    anchocol = ((AnchoPapel - MargenIzquierdo) \ numCols)
   
   
    For k = 0 To filas - 1
        n = MargenIzquierdo
        For i = 0 To numCols - 1
            Printer.CurrentX = n  ' imprime el texto de la columna 'i'
            Printer.Print List1.List(j + i)
            n = (n + anchocol)
        Next

        j = (j + numCols)
        Printer.CurrentY = (Printer.CurrentY + Printer.TextHeight("t"))  ' el textheight depende de la fuente seleccionada en la impresora, no importa el texto entre paréntesis... es fijo para la  fuente.
    Next

    If (ultimafila > 0) Then ' la última fila tiene 1 o más columnas, pero menos que 'numcols'.
        n = MargenIzquierdo
        For i = 0 To ultimafila - 1
            Printer.CurrentX = n  ' imprime el texto de la columna 'i'
            Printer.Print List1.List(j + i)
            n = (n + anchocol)
        Next
    End If

    Set Printer.Font = fuente
End Sub

' y la invocas así:
'          numero de columnas, margen izquierdo donde empezar, ancho que ocuparán las columnas.
call ListarColumnas(4, 240, printer.width - MargenDerecho)


b]Nota que:[/b]
- MargenIzquierdo y MargenDerecho pueden valer 0, lo que significará que se usará todo el ancho disponible del papel por parte de la impresora (printer.width). Ahora bien si ves que 'queda feo', porque 4 columnas son pocas, puedes o bien añadir alguna columna o utilizar márgenes a ambos lados.
- Puedes omitir el parámetro listbox, si siempre vas a usar un único listbox, pero es acertado que una función reciba por parámetro los datos que utiliza.
Si más adelante copias y pegas la función a otro proyecto, seguirá funcionando porque requerirá el listbox que en dicho proyecto estés usando (se llame como se llame, queda aislado dentro de la función), lo que es mejor que andar renombrando cada aparición del listbox...
Para no liarte visto que ya tienes la función usando el control list1, lo retiro como parámetro, pero es más adecuado que se incluya como tal.


Recuerda que todo lo que se haga con printer.print, printer.line, printer.circle, priter.paintpicture y printer.pset se dibuja a un backbuffer, donde se va recreando la 'imagen' a imprimir, cuando se invoca enddoc, equivale a invocar 'draw' del backbuffer, es decir es cuando se vuelca la imagen completa a la impresora.

#842
CitarCada usuario tiene la posibilidad de elegir la propuesta de este tipo que más le guste de entre las muchas que tenemos a nuestra disposición...

Es llamativo que cuando Mocosoft dominaba el espacio de los navegadores, tras acusarlo de monopolio, se le obligó a mostrar específicamente una ventana (nada opcional), donde se expresara con claridad enlaces a otros navegadores alternativos...

Ahora que Google, monopoliza el espacio de los navegadores en los móviles (viene preinstalado por defecto como sucedía con el Internet Explorer), no exhibe ninguna ventana para dejar al usuario la opción de elegir otro navegador alternativo...

Misma historia, distinto sesgo.
#843
Básicamente hay que hacer dos cosas (asumiendo todo del modo más simple posible):
1 - Establecer una fuente monoespaciada.
Es necesario para simplificar los cálculos, porque así cualquiera que sea el carácter ocupa el mismo espacio al ser impreso, si cada carácter tiene su medida individual hay que calcular uno a uno, mientras que siendo todos iguales, es una multiplicación.
(al final de imprimir la lista debe ser restablecida la fuente a la que tenía, por eso hay que salvaguardar la fuente previamente usada).

2 - Repartir el ancho del papel entre las columnas a usar y posicionar el cursor en cada comienzo de columna e imprimir ahí el ítem. Damos por hecho que ningún ítem supera el ancho de una columna, de ser así debe invocarse una función que calcule y corte el exceso de caracteres, o reducir el número de columnas, etc... por eso digo asumiendo 'todo lo más simple posible').
Dadas x columnas, se recurre a dividir el ancho disponible del papel entre el número de columnas. Para esto los datos necesarios son: saber los márgenes izquierdo, derecho y ancho del papel.
Entonces en un bucle se recorre de x columnas en x columnas, (es deicr las que caben en una línea son un ciclo de este bucle) y en un bucle interno se recorre desde 0 a x columnas -1 (es decir en el bucle interno se recorre cada columna de la línea y es en éste donde se imprime. el bucle exterior simplemente sirve para preparar la línea.
Ahora imprimes el siguiente ítem del texto en la posición con la que empieza la columna (dando por hecho una alineación izquierda).

Supongamos que el papel mide 10.000 puntos de ancho, que son 5 columnas, que el margen izquierdo son 400 y el derecho 300.... y pongamos que la lista son los meses del año:

el pseudocódigo sería:

set tempfuente = impresora.fuente
impresora.fuente.nombre = "Courier New"

anchoCol = (((anchoPapel - (margenderecho + margenIzquierdo)) / numColumnas)
anchoCol = (((10.000 - (400 + 300)) / 5) = ((10.000-700)/5) = 1.860

bucle Y desde 0 hasta lista.count -1 en pasos de NumColumnas ' desde 0 hasta 11 (pués hay 12 meses)
    impresora.PosicionY = (impresora.PosicionY + impresora.altofuente)
   
    Bucle x desde 0 hasta numColumnas -1    ' desde 0 hasta 4 (5 columnas en total)
        impresora.PosicionX = (margenizquierdo + (x * anchoCol))
        impresora.Imprimir meses(y+x)
    siguiente en bucle
siguiente en bucle

' como 5+5 son 10 y hay 12 meses, sobran 2 meses que caben en la última línea:
resto = (lista.Count modulo numCols)
Si (resto > 0) luego
    impresora.PosicionY = (impresora.PosicionY + impresora.altofuente)

    Bucle x desde 0 hasta resto -1    ' desde 0 hasta ? (? columnas restantes)
        impresora.PosicionX = (margenizquierdo + (x * anchoCol))
        impresora.Imprimir meses(y+x)
    siguiente en bucle
Fin si

set impresora.fuente = tempFuente  ' restablecemos la fuente a la que había previamente...


Supongamos que la posición Y actual de la impresora fuera 1.250 y que el alto de la fuente fuera 230 puntos. Estos serían pués los valores que irían arrojando los bucles;

LineaActual = posicionY
PosicionY = (LineaActual + altoFuente) = (1.250 +230) = 1.480
    PosicionX para columna 0 = 400 + (0 * 1.860) =  400
      imprimir lista(0+0) = "Enero"
    PosicionX para columna 1 = 400 + (1 * 1.860) = 2.260
      imprimir lista(0+1) = "Febrero"
    PosicionX para columna 2 = 400 + (2 * 1.860) = 4.120
      imprimir lista(0+2) = "Marzo"
    PosicionX para columna 3 = 400 + (3 * 1.860) = 5.980
      imprimir lista(0+3) = "Abril"
    PosicionX para columna 4 = 400 + (4 * 1.860) = 7.840
      imprimir lista(0+4) = "Mayo"

LineaActual = posicionY
PosicionY = (LineaActual + altoFuente) = (1.480 +230) = 1.710
    PosicionX para columna 0 = 400 + (0 * 1.860) =  400
      imprimir lista(5+0) = "Junio"
    PosicionX para columna 1 = 400 + (1 * 1.860) = 2.260
      imprimir lista(5+1) = "Julio"
    PosicionX para columna 2 = 400 + (2 * 1.860) = 4.120
      imprimir lista(5+2) = "Agosto"
    PosicionX para columna 3 = 400 + (3 * 1.860) = 5.980
      imprimir lista(5+3) = "Septiembre"
    PosicionX para columna 4 = 400 + (4 * 1.860) = 7.840
      imprimir lista(5+4) = "Octubre"

LineaActual = posicionY
PosicionY = (LineaActual + altoFuente) = (1.480 +230) = 1.710
    PosicionX para columna 0 = 400 + (0 * 1.860) =  400
      imprimir lista(10+0) = "Noviembre"
    PosicionX para columna 1 = 400 + (1 * 1.860) = 2.260
      imprimir lista(10+1) = "Diciembre"

Los puntos 1 y 2 remarcados en negrita son el resumen general (si cambian detalles hay que hacer más o menos funcionalidad para que cumplan todas las expectativas de los detalles).

En el código primero, concatenaba los valores de los items que forman una línea a base añadir los espacios necesarios tras un ítem hasta llegar a la posición de inicio de la siguiente columna, lo cual exigía calcular la cantidad de espacios a añadir o caracteres a cortar (si excedía el ancho de la columna). Y así imprimia toda una línea d euna sola vez... es un código más simple (de hacer y entender) imprimir el dato de cada columna, pero menos eficiente y solo sirve si no hay detalles adicionales que lo compliquen (como otra alineación que no sea izquierda y valores que superen el ancho de la columna).
#844
Dudas Generales / Re: Logaritmo exacto
6 Octubre 2020, 16:49 PM
Claro que la tiene. Siempre que tengas que hacer determinados cálculos matemáticos, acaba uno recurriendo a ello. Ahora para número 'muy grandes', no suele ser tan frecuente excepto en el espacio teórico (en la práctica no suele necesitarse números 'grandes').

El logaritmo para cualquier base se define como:

LogBase(numero) = (Log(numero) / Log(base))

Es decir es una cuestón resuelta...

En definitiva... sigo sin acabar de entender adónde quieres ir...
#845
Dudas Generales / Re: Logaritmo exacto
5 Octubre 2020, 23:24 PM
A qué te refieres con que si 'serviría de algo'???.
Y a qué tamaño te refieres con 'números extremadamente grandes'???

Cualquier lenguaje que se precie dispone de una función 'log(x)' ... Habitualmente cuando se hacen cuestiones de combinatoria suelen necesitarse... y puntualmente en diversidad de algoritmos.
#846
Cita de: Caminante en  2 Octubre 2020, 22:30 PM
... hoy en día la gente está muy acostumbrada a la tecnología, a que todo sea completo y ya esté hecho, ... como hoy en día la moda es usar todo ya creado y lo más completo posible/disponible, entonces los jóvenes no necesitan aprender nada porque simplemente no les interesa porque no les hace falta.

... antes todo era mucho más precario y hoy en día todo mucho más completo, pero conlleva a que los jóvenes o las personas de otras edades no tengan el interés ni la necesidad por aprender.
Aunque estoy de acuerdo prácticamente con todo, hay un detalle (subyacente a través de 2 o 3 párrafos) que creo que queda fuera... aunque también sin más importancia.

Considero que el contexto no se ajusta a lo que tratamos, porque no estamos considerando a toda la juventud absoluta... sino solo a aquellos que en específico se supone interesados en estos temas, de los que supuestamente se esperaría que se apartaran (los momentos adecuados al menos) de su ambiente circundante y dedicaran más tiempo a 'esto' que al igual que a nosotros (suponemos que), a ellos también les fascina.

Si nos retrotraemos a los años 2000 (por ejemplo), el número de participantes en foros de informática era muy superior al de ahora, pero en aquella época se supone que había mucha menos gente interesada y/o cursando tales materias. Ahora diría que hay una explosión de jóvenes que cursa informática, aunque quizás haya un detalle poco contastado y es que quizás lo hagan (también) por moda, por salida profesional, por... y no por fascinación o ese ansia de conocimientos que nos consume a algunos... filtrando a los que no den este perfil, posiblemente las cifras no sean muy distintas de aquellas de los 80, 90 o 2000...



Cita de: Tachikomaia en  3 Octubre 2020, 22:47 PM
¿Pero qué tienen de ventajoso los otros sitios? ¿por qué la gente los elige?
No creo que se trate de una cuestión de ventajas. Allí por ejemplo la publicidad puede llegar a ser apabullante... dudo que nadie encuentre muy ventajoso, que te bombardeen con publicidad constantemente

Es una cuestión más de monetización. Detrás de ellas hay empresas cuyo máximo interés (da igual lo que suelten por la boca cuando se dirigen masivamente al público), es económico... entonces, se estudia todo bajo el prisma de sacar rendimiento... se promociona y publicita en todas partes: periódicos, tv, videojuegos, películas de cine incluso... no hay móvil que al comprarlo no incorpore como mínimo dos redes sociales por defecto ya preinstaladas... pero jamás verás ninguno que contemple preinstalados siquiera un mísero enlace a ningún foro.
#847
Cuando escribes código 'al vuelo', es normal que se escape algún error... en ese punto, lo que importa es escribir y avanzar, sin importar si se ha escapado algún error, es luego cuando lo traslada uno al IDE, que a medida que lo pegas o redactas de nuevo que al tiempo vas repasando el código y los errores o cambios a efectuar saltan rápido a la vista.

Si ves trabajar a un escultor (por ejemplo)... en primera instancia hará un rebaje general que dé forma a la figura que trata de hacer, pero nunca será un acabado (salvo que se trate de una pieza muy pequeña)... tendrá que volver a repasar todo afinando cada detalle que lo precise.

...al programar cuando tengas solvencia, pasa lo mismo, escribes código o pseudocódigo, a veces mezclado, para escribir rápido la idea y cuando lo transcribes a código es cuando repasas cada detalle y lo afinas al caso concreto presente. De hecho a veces es común invocar funciones que ni siquiera has creado, pero cuya funcionalidad queda descrita en su nombre y resulta superfluo en primera instancia perder tiempo en escribirla o describirla... de hecho las funciones 'ConcatenarCols' y 'Formatear' no iba a realizarlas, precisamente porque entiendo que estás aprendiendo, es que las he abordado...

Ya te decía que 'Todo el código es genérico, requiere adaptación al caso concreto y retocar algunas cosas...', porque hay detalles que dependen exclusivamente del caso concreto, y por tanto no hay una solución única válida para todos los casos... y por lo mismo una función générica que pueda ser fácilmente adaptada a cualquier caso, es la mejor opción.

p.d:
De hecho... una vez que todo funciona sin errores, todavía se puede dar un último repaso cuyo cometido es optimizar. Cuando describes una idea no procede pensar en detalles para hacerla óptimo, porque pierdes tiempo, es solo el momento de describir la idea, describir el funcionaiento general, la optimización es la fase final... (en medio es escribir el código y lograr que funcione exactamente como se espera). Los aprendices suelen omitir la primera y última fases, es normal...
#848
... mensaje duplicado
#849
Seguridad / Re: He perdido un archivo importante
5 Octubre 2020, 03:06 AM
Antes de retirar la unidad de su conexión, hay que decirle al sistema que quieres retirarlo, para que escriba el buffer a disco. Después que lo desconectes el fichero estará ahí.

En las propiedades de la unidad, para la próxima elige la opción 'desconectar seguro', para que en lo posible no utilice cachés en memoria y que escriba directamente a disco... (elige seguridad frente a rapidez, cuando la unidad vayas a usarse constantemente para escribir y elige rapidez cuando solo vayas a leer de dicha unidad).

Si la aplicación utilizada guarda copia de lo que editas cada cierto tiempo, puede que se conserve... busca en la carpeta del programa con el que lo editaste a ver si hay suerte y sigue constando en un fichero temporal.

Si no es el caso, puedes optar por lo ya comentado en mensajes previos... probar a ver si hay en la unidad una copia vieja del mismo fichero borrada con anterioridad.
#850
Tienes que adaptarla... el copy-paste, no siempre va a ser la solución...
Si entiendes lo que hace y conoces un poco el lenguaje no es nada complicado adaptarlo a exactamente lo que necesites según lo que tienes...

* Revisando, se ha escapado un gazapo, que cualquiera que entiende el código lo vería rápido (lo he corregido y comentado en el mensaje más arriba).