elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 ... 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 [156] 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 ... 432
1551  Programación / Programación C/C++ / Re: Matriz en C++ en: 10 Marzo 2020, 17:04 pm
Tranponer un matriz es intercambiar las dimensiones en e array (operando con uno de 2 dimensiones, como haces en el prsente caso). Puede entenderse de otra manera cuando se usa un array unidimensional...

Creemos primero un array de 10 de ancho por 6 de alto, y además partiendo de un unidiemnsional (al caso un string o un array de chars-bytes, como se prefiera considerar):
Código:
funcion CrearArray
    entero x, y , n
    string s
    array de chars t(0 To 5, 0 To 9)

    s = "En un lugar de la Mancha de cuyo nombre no quiero acordarme."
    bucle para y desde 0 a 5
        Bucle para x desde 0 a 9
            t(y, x) = s.CharEnPosicion(n)
            imprimir en misma línea  t(y, x) + " "  // el espacio es por claridad... se pued e omitir
            n += 1
        siguiente
        saltar a otra linea
    siguiente


    // t = TrasponerArray(t, x, y)   // 10, 6
fin funcion

El resultado de imprimir en el bucle interior cada línea será:

E n   u n   l u g a
r   d e   l a   M a
n c h a   d e   c u
y o   n o m b r e   
n o   q u i e r o   
a c o r d a r m e .


Hemos dejado la llamada a la función trasponer comentada, hasta ver que se imprime como aparece justo encmima de esta línea...

Ahora la trasposición, que se verá lo simple que es en un array de 2 dimensiones:
Código:
arary de chars() = funcion TrasponerArray( arrayChars T(), entero Ancho, entero Alto)
    entero x, y , n
    string s
    array de chars s(ancho , Alto)  // nota el cambio del tamaño de cada dimensión, antes era (alto, ancho)

    bucle para x desde 0 a Ancho - 1     
        Bucle para y desde 0 a Alto - 1
            s(x, y) = t(y, x)

            imprimir en la misma línea s(x, y) + " "
        siguiente
        saltar a otra linea
    siguiente     

    devolver s
fin funcion

El resultado será:

E r n y n a
n   c o o c
  d h     o
u e a n q r
n     o u d
  l d m i a
l a e b e r
u     r r m
g M c e o e
a a u     .


finalmente nota, que si solo te piden imprimir traspuesto el array, no es preciso crear ni asignar el nuevo array, basta poner en primer luegar el bucle de la dimensión y dentro el bucle de la otra dimensión
1552  Programación / Programación Visual Basic / Re: [Aporte] LabelPlus (user control) en: 10 Marzo 2020, 02:03 am
No me refería a comentar el código, si no simplemente a documentar las propiedades y funciones públicas, para que te aparezca la info respectiva cuando pulses dicha propiedad o uses el examinador de objetos (F2).

Gracias por el ofrecimiento, pero al menos de momento tengo muy poco tiempo libre, tengo tantas cosas por hacer que tiempo es lo que falta. A días me da para sacar media hora y comentar, aconsejar o resolver dudas aquí en el foro y poco más...

Me encanta VB6, tanto como lo odio ( :silbar: ), tiene muchas cualidades que hacen de él un lenguaje único y polivalente, pero por otro lado, tiene demasiadas limitaciones y cada vez que chocas con ellas, te fastidia que MS lo dejara aparcado y como jamás vino la tan esperada versión 7.0. Hubo un tiempo (hace algunos años 3-5 no recuerdo ahora mismo), que parecía que Mocosoft iba a hacer algo con vb6, a raíz de las quejas en todo el mundo,  pero finalmente desistieron. Aunque NET tiene sus ventajas, también tiene sus desventajas, la mayor es el laberinto de complejidad que lo rodea y que no para de aumentar. No termina de converme en el terreno personal, en el profesional no necesita convencerte, es lo que reclame la empresa para la que hagas el trabajo...

Por mi parte viendo que jamás saldría ya un 'VB7' (clásico), lo que decidí es hacer mi propio lenguaje, levantando todas las limitaciones con las que me he topado con VB6, más muchas de las sugerencias que en su tiempo entregué a MS, para las versiones de NET, algunas aceptadas y otas no. ...aunque lo llevo a ratos, tengo como el 60-70% de la especificación, pero todavía hay algunas cosas inconcretas y por definir y pulir, aún asi el escáner léxico está listo aunque no cerrado por si la especificación exigiera algo nuevo no contemplado aún, cuando finalice la especificación avanzaré al escáner sintactico y semántico... A veces avanzo también con el IDE, pués va al margen (de momento) del lenguaje, va sin prisas así que creo que tardaré a ratos aún 2-4 años (salvo que me entren las prisas). Aunque no estoy todos los días con ello, solo a ratos.... La idea es que dadas las limitaciones de vb6, cuando complete el compilador, el primer programa a realizar con él, será precisamente el compilador con su propio lenguaje... En fin, prefiero emplear parte de mi tiempo en hacer un lenguaje que tenga todo aquello que creo que es necesario y en su forma simple y eficiente.

...y  hablando de "la idea principal es simular los controles de Bootstrap", creo recordar que hace algunos años ya (como 10-12 o así) encontré un proyecto bastante completito similar a dicha idea, lo acabo de localizar por si os interesa, se llama vkUserControls, creo recordar que estaba en Sourceforge ....veo si sigue existiendo la página del proyecto y te lo comparto:
https://sourceforge.net/projects/vkusercontrols/
1553  Foros Generales / Foro Libre / Re: Sobre derechos de autor y Copyright © en: 9 Marzo 2020, 23:41 pm
El copyright siempre lo establecen personas, sea una o varias, otra cosa es la cesión total o parcial de derechos, que si pueden ostentarlo empresas.

Eso significa que cuando muera el último de los que señalaron el copyright es cuando cuenta el plazo de extinción.

Si te interesa el tema en profundidad, puedes recurrir al sitio de la OMPI (WIPO):
-https://wipolex.wipo.int/es/main/legislation

En 'Asunto' elige el país de interés, se colocará en la caja de arriba...
Luego de nuevo en 'Asunto' elige el tema en cuestión, parece ser en tu caso: "Derecho de autor" y pulsa el botón 'Buscar', saldrán los documentos que tengan, elige y descarga el que sea de tu interés... si eliges documentos internacionales, posiblemente estén en inglés u otro idioma (a veces ni se molestan en traducir tales documentos a nuestra lengua, a pesar de que lo ahí contenido nos afecte).

El primer tratado internacional es conocido como "El convenio de Berna", data de 1886, es el punto de partida de toda esta payasada... se ha ido actualizando... así que no creas que el texto es de esa época:
https://www.wipo.int/export/sites/www/treaties/en/documents/pdf/berne.pdf
1554  Seguridad Informática / Seguridad / Re: Mi pc está infectado, después de 9 años en: 9 Marzo 2020, 15:57 pm
Si sientes que tienes intrusiones, procede cambiar al menos las contraseñas principales.

Pero eso sí. Ni se te ocurra hacerlo desde tu equipo, directamente... como mínimo arranca con un live CD con acceso a red. Ya que no queda claro que hayas eliminado todo lo que haya en tu equipo, solo queda claro que se ha encontrado algo...

Un modo asequible de lograr la contraseña de alguien es que una vez logrado acceso a su equipo, simular alguna intrusión que dereive en una alearta que fuerce a la 'víctima' a ha cer un cambio de contraseña (que no era necesaria), solo por que ahora el intruso tiene capacidad de sacártela...

Así que sí, si tienes tarjeta de crédito o débito, no lo cambies desde el pc, preferiblemente acude a un cajero que ni siquiera sea el habitual cerca de casa, y que sea de día, y si el cajero no dispusiera en su menú de dicha posibilidad, acude al banco.
Cualquier otra contraseña que cambies, que no hay otra que hacerlo a través de internet, hazlo si es desde un PC, iniciando desde un Live-CD con acceso a red. Considera que si admeás exigirá algo como un SMS enviado al móvil, la posibilidad de que el móvil también tuviere alguna intrusión, así que antes de eso, conviene también revisar el móvil...
Hay un antivirus para el móvil de código abierto, llamado Koodous, lo buscas por la playstore, te aseguras que es el legítimo, lo instalas y ejecutas... Solo cuando estés seguro que el móvil está limpio, procede a cambiar la contraseña que precises y que requiera confirmación a través del móvil. El móvil durante dicho uso, es preferible que 'tire de datos' y no de wifi...
1555  Foros Generales / Foro Libre / Re: Sobre derechos de autor y Copyright © en: 9 Marzo 2020, 15:32 pm
El copyright, no deja de serlo, porque esté disponible en más o menos sitios, si no que son las leyes las que determinan su vigenvia.

En patentes son 20 años, salvo que el que patenta deje de pagar y se anule su patente, en cambio con el copyright, hay un acuerdo más explícitamente 'generoso', y luego cada país tiene una fecha distinta, curiosamente suele ser enormemente más 'generosa' que las patentes, así que yo más que 'derechos de autor' prefiero llamarlo como lo que son 'privilegios de autor' (por una patente pagas cada año en cada país que lo patentas o bien por una patente internacional, hasta que vence a los 20 años o hasta que desistes de seguir pagando por ella (sin importar si es porque ya no te sale rentable o simplemente porque no puedes)).

Así lo habitual es encontrarse que el copyright dura entre 50 y hasta 100 años después de muerto su autor... 50 años es el acuerdo internacional, pero luego individualmente cada país lo extiende cuanto quiera. En Europa son 70 años (si el autor hizo esa obra a los 20 años y vive hasta los 80, en realidad su 'obra' estará protegida por el copyright, 130 años). ...por lo que es totalmente razonable que la gente se lo acabe pasando por los GÜ380X...

A mi me resulta chocante que si inventas una medicina que cura y salva vidas, tu patente expire en 20 años (que extrictamente puede o no beneficiarte a tí, pero también a una buena parte del planeta), pero si pintas un cuadro o escribes una novela (que estrictamente no beneficia a nadie más que al propio autor), en cambio expire como pronto 50 años después de que haya muerto el tipo y además mantener ese copyright le sale gratis...

Así, que lo siento por tí, el PU70 vídeo que te gusta, dejará de tener copyright, mucho después que ABSOLUTAMENTE TODOS los que ahora mismo vivimos, hayamos muerto...

Citar
¿Sabe alguien si hay algún sitio donde se puede consultar qué obras tienen “todos los derechos reservados” y cuáles no?
No. No existe ningún sitio así.
Habitualmente hay determinados puntos, que pueden aportar info parcial, esto es, solo, respecto de ciertas obras.
Técnicamente cada obra debe aportar sobre sí misma el estado de sus derechos de autor privilegios de autor... y el otro modo es preguntando directamente a su autor.
1556  Programación / Programación General / Re: Manual de PowerShell en: 9 Marzo 2020, 14:59 pm
Aquí tienes un pdf, además en español:

-https://gallery.technet.microsoft.com/Manual-de-Powershell-en-e538c74d
1557  Foros Generales / Dudas Generales / Re: Figura otra IP en: 8 Marzo 2020, 20:55 pm
A veces, las sospechas son erradas.

A veces, un tercero, quiere hacer caer las sospechas en alguine a quien ya de entrada sabe que a ti te 'cae mal', simplemente para o bien hacer que te distancies mas de esa persona, o bien para 'tapar su rastro', o peor... para luego ofrecerte ayuda y acercarse más a ti.

Si lo has puesto en manos de las autoridades déjalo estar. Y si ves o entiendes que es lento, será que la policía no hará gran cosa por algo tan nimio como 'me han insultado por la red social', por tu parte, mantén el control, no te dejes arrastrar y ante la duda bloquea a quien te parezca... Si la cosa denunciada fuera grave, descuida que las autoridades harán el esfuerzo que se requiera.
1558  Programación / Programación Visual Basic / Re: modificar list1 en: 8 Marzo 2020, 20:39 pm
La verdad es que resulta confusa tu explicación...
Podías haber empezado por decir algo como:
en el formulario 1 hay una listbox,  un boton y ... lo que sea más...
y en el formulario 2 hay .... lo que sea,
....preferiblemente con nombres MUY distintos, para no generar confusión inecesariamente (tu luego llámalos como te dé la gana).
A veces incluso mejor un par de capturas, si son demasiados elementos termina por dejar claro el asunto.

...pués aclararía bastante cual es tu intención. Ahora mismo es un galimatías que uno tiene que interpretar y esperar a haberlo hecho correctamente. Lo que la mayor parte de las veces supone perder tiempo y es una de las razones por la que muchos decidimos pasar de contestar (mensajes ininteligibles)...

Tampoco dejas claro cual es el objetivo, solo tras 'recrear' la interfaz y el código, lo que observo es que modificas el contenido del listbox, pero ahora no contiene lo previo. De lo que deduzco que lo que intentas es 'editar un ítem' del listbox, donde cada ítem se compone de dos partes, nombre y apellido...

Si es así, tu problema es que sobrescribes una y luego otra vez, el ítem olvidando que se cada ítem se compone de '2 campos', como se aprecia en la imagen, así queda  una vez editado con el código que tienes:




Hay que decir algunas cosas, vayamos primero por la más simple:

Cada item en la lista es un string, cuando se intenta que 'contenga' varios campos de texto, resulta adecuado darle un formato, lo mínimo un separador.
Así por ejemplo, un simple espacio hubiera sido algo muy sencillo y fácil de manejar:
Código
  1. Private Sub Form_Load()
  2.    With List1
  3.        .AddItem "Jorge Ramirez Díaz"
  4.        .AddItem "Luis Rodriguez Moreno"
  5.        .AddItem "Pedro Gonzalez Granado"
  6.    End With
  7. End Sub

Luego la transferencia sus sendos textbox en el form2, es muy sencilla:
Código
  1. Private Sub List1_DblClick()
  2.    Dim i As Integer
  3.    dim txt() as string
  4.  
  5.    txt = split(list1.list(lits1.listindex), " ")
  6.    ' NOTA: al caso acomoda que los 3 textboxes del form 2 formen un array.
  7.    for i= 0 to 2    
  8.         form1.textbox1(i).text = txt(i)
  9.    next  
  10.  
  11.    call Form2.Show (vbmodal)  ' esto impide que sepueda acceder al form1 hasta que se cierre el 2.  
  12. End Sub

(nota que en el form2 ahora tenemos 3 textbox, llamados con el mismo nombre y con índices 0, 1 y 2).
Así cuando ahora pulsemos, en el botón del form2:
Código
  1. Private Sub Command1_Click()
  2.    dim item as string
  3.  
  4.    item = text1(0).text & " " & text1(1).text & " " & text1(2).text
  5.    Form1.List1.List(Form1.List1.ListIndex) = Item
  6.  
  7.    Unload Me
  8. End Sub

Con eso obtienes lo que parece que quieres.


Ahora bien, podría ser que te interese mantener algo más que un espacio de separación, entre el nombre y los apellidos o algún otro elemento añadido en cada ítem.
Se trataría entonces de prefijar un formato, por ejemplo supongamos que el apellido más grande tuviere 20 caracteres... entonces precisamos crear una función que garantice esos 20 caracteres:

Añadir un módulo y pegar esta función allí. El módulo contendrá funcionalidad que puede ser común a ambos forms y a todo el proyecto.
Código
  1. ' Funcion: Rellena con un (solo 1) carácter hasta completar el tamaño solicitado, si excede puede forzarse a cortar el sobrante.
  2. '  Parámetros:
  3. '    Valor: El dato a ser modelado.
  4. '    Size: Tamaño solicitado para la cadena devuelta.
  5. '    Delante: Señala a que lado se coloca el relleno (o en caso de sobrar, por donde se retiran).
  6. '    Relleno: Carácter que se utiliza para completar el tamaño (por defecto espacio).
  7. '    Force: Determina que si la cadena de entrada es más larga que los digitos pedidos, (por defecto) cortará el sobrante o lo devolverá tal cual llegó.
  8. '  Devuelve: una cadena con la cantidad de caracteres indicado por 'size', salvo que en origen a la entrada sea mayor y explicitamente no se haya forzado a cortar.
  9. Public Function FormatSizeString(ByRef Valor As String, ByVal Size As Byte, Optional Delante As Boolean, Optional ByVal Relleno As Byte = 32, Optional ByVal Force As Boolean = True) As String
  10.    Dim k As Integer
  11.  
  12.    k = (Size - Len(Valor))
  13.    If (k < 0) Then
  14.        If (Force = True) Then
  15.            If (Delante = True) Then
  16.                FormatSizeString = Right$(Valor, Size)
  17.            Else
  18.                FormatSizeString = Left$(Valor, Size)
  19.            End If
  20.        Else
  21.            FormatSizeString = Valor
  22.        End If
  23.    ElseIf (k > 0) Then
  24.        If (Delante = True) Then
  25.            FormatSizeString = (String$(k, Chr$(Relleno)) & Valor)
  26.        Else
  27.            FormatSizeString = (Valor & String$(k, Chr$(Relleno)))
  28.        End If
  29.    Else
  30.        FormatSizeString = Valor
  31.    End If
  32. End Function
  33.  
  34.  

Ahora es más fácil hacer que tu listbox aparezca como si estuviera compuesto por columnas... aunque falta alguna función rutinaria más (la pongo luego):
Código
  1. ' esta línea ponerla arriba del todo en el módulo 'module1', que has añadido al proyecto...
  2. private const SIZE_CAMPO as integer = 20
  3.  
  4. ' la función también va en el módulo.
  5. ' nota el 'byval en los parámetros de string...
  6. Public Function ComponerItem(ByVal Nombre As String, ByVal Apellido1 As String, ByVal Apellido2 As String) As String
  7.    Nombre = FormatSizeString(Nombre, SIZE_CAMPO)
  8.    Apellido1 = FormatSizeString(Apellido1, SIZE_CAMPO)
  9.    Apellido2 = FormatSizeString(Apellido2, SIZE_CAMPO)
  10.  
  11.    ComponerItem = Nombre & Apellido1 & Apellido2
  12. End Function
  13.  

Esta función debe llevar aparejado otra equivalente, que hace la operación contraria... deserializa el ítem en sus componentes simples:
Código
  1. ' Se da por supuesto que cada item contiene exactamente la cantidad de caracteres precisos,
  2. '  lo cual será cierto si se usó la función 'ComponerItem'.
  3. Public Sub DescomponerItem(ByRef Item As String, ByRef Nombre As String, ByRef Apellido1 As String, ByRef Apellido2 As String)
  4.    Nombre = RTrim$(Left$(Item, SIZE_CAMPO))
  5.    Apellido1 = RTrim$(Mid$(Item, SIZE_CAMPO + 1, SIZE_CAMPO))
  6.    Apellido2 = RTrim$(Right$(Item, SIZE_CAMPO))
  7. End Sub

 Veamos como quedaría ahora la carga dle formulario 1:
Código
  1.  
  2. ' ...ahora modificamos la rutina de carga:
  3. Private Sub Form_Load()
  4.    With List1
  5.        call .AddItem( ComponerItem("Jorge", "Ramirez",  "Díaz"))
  6.        call .AddItem(ComponerItem("Luis", "Rodriguez", "Moreno"))
  7.        call .AddItem(ComponerItem("Pedro", "Gonzalez", "Granado"))
  8.        .FontName = "Courier new"   ' si no se pone una fuente monoespaciada, la verticalidad de las columnas, fracasará
  9.       ' y habría que considerar el espacio ocupado por cada carácter, para añadir más o menos espacios,
  10.       ' lo cual es más complejo, lento e inexacto, pués tampoco podemos 'dibujar' en el punto exacto...
  11.       'NOTA: Haz el listbox, lo suficientemente ancho, para que sea vean todos los 'campos'.
  12.    End With
  13. End Sub

Ahora solo falta la reformular la función que toma un ítem para editarlo y la que luego devuelve el ítem editado.
Nota que seguimos delegando funcionalidad en el módulo, simpificando el código dentro de ambos forms, es mas claro y fácil de modificar a futuro, si decides un largo mayor por ejemplo para los nombres basta cambiar el valor de la constante, no hay que tocar nada más en ninguna parte.

Código
  1. Private Sub List1_DblClick()
  2.    Dim n As String, ap1 As String, ap2 As String
  3.  
  4.    Call Module1.DescomponerItem(List1.List(List1.ListIndex), n, ap1, ap2)
  5.  
  6.    With Form2
  7.        .Text1(0).Text = n
  8.        .Text1(1).Text = ap1
  9.        .Text1(2).Text = ap2
  10.        .Show vbModal
  11.    End With
  12. End Sub

Y finalmente el código del botón del form2, que transfiere el ítem editado de vuelta al listbox.
Código
  1. Private Sub Command1_Click()
  2.    Dim item As String
  3.  
  4.    item = Module1.ComponerItem(Text1(0).Text, Text1(1).Text, Text1(2).Text)
  5.    Form1.List1.List(Form1.List1.ListIndex) = item
  6.  
  7.    Unload Me
  8. End Sub

Y así queda y se ve cuando se ejecuta:



Hay una parte fea aún en el código ...la insistencia en list1.listindex...
Sería mejor declarar una variable pública en el module1:
Código
  1. public IndexItem as integer
  2.  
Al entrar al proyecto IndexItem = -1, y luego con cada click en el listbox, actualizas dicho valor, ahora no hay que referenciar cada vez al listindex del list en el form1...

Finalmente este sería el código de cada fichero con los cambios aplicados en cada uno de ellos:

Para el form1:
Código
  1. Private Sub Form_Load()
  2.    IndexItem = -1
  3.     With List1
  4.        Call .AddItem(ComponerItem("Jorge", "Ramirez", "Díaz"))
  5.        Call .AddItem(ComponerItem("Luis", "Rodriguez", "Moreno"))
  6.        Call .AddItem(ComponerItem("Pedro", "Gonzalez", "Granado"))
  7.        .FontName = "Courier new"   ' si no se pone una fuente monoespaciada, la verticalidad de las columnas, fracasará
  8.       ' y habría que considerar el espacio ocupado por cada carácter, para añadir más o menos espacios,
  9.       ' lo cual es más complejo, lento e inexacto, pués tampoco podemos 'dibujar' en el punto exacto...
  10.    End With
  11. End Sub
  12.  
  13. Private Sub List1_Click()
  14.    IndexItem = List1.ListIndex
  15. End Sub
  16.  
  17. Private Sub List1_DblClick()
  18.    Dim n As String, ap1 As String, ap2 As String
  19.  
  20.    If (IndexItem <> -1) Then
  21.        Call Module1.DescomponerItem(List1.List(IndexItem), n, ap1, ap2)
  22.  
  23.        With Form2
  24.            .Text1(0).Text = n
  25.            .Text1(1).Text = ap1
  26.            .Text1(2).Text = ap2
  27.            .Show vbModal
  28.        End With
  29.    Else
  30.        Beep ' no hay ningún ítem seleccionado
  31.    End If
  32. End Sub

Para el form2:
Código
  1. Private Sub Command1_Click()
  2.    Dim item As String
  3.  
  4.    item = Module1.ComponerItem(Text1(0).Text, Text1(1).Text, Text1(2).Text)
  5.    Form1.List1.List(IndexItem) = item
  6.  
  7.    Unload Me
  8. End Sub
  9.  

 y para el módule1:
Código
  1. Public IndexItem                As Integer
  2. Private Const SIZE_CAMPO        As Integer = 20
  3.  
  4.  
  5. ' nota el 'byval en los parámetros de string...
  6. Public Function ComponerItem(ByVal Nombre As String, ByVal Apellido1 As String, ByVal Apellido2 As String) As String
  7.    Nombre = FormatSizeString(Nombre, SIZE_CAMPO)
  8.    Apellido1 = FormatSizeString(Apellido1, SIZE_CAMPO)
  9.    Apellido2 = FormatSizeString(Apellido2, SIZE_CAMPO)
  10.  
  11.    ComponerItem = Nombre & Apellido1 & Apellido2
  12. End Function
  13.  
  14. ' Se da por supuesto que cada item contiene exactamente la cantidad de caracteres precisos,
  15. '  lo cual será cierto si se usó la función 'ComponerItem'.
  16. Public Sub DescomponerItem(ByRef item As String, ByRef Nombre As String, ByRef Apellido1 As String, ByRef Apellido2 As String)
  17.    Nombre = RTrim$(Left$(item, SIZE_CAMPO))
  18.    Apellido1 = RTrim$(Mid$(item, SIZE_CAMPO + 1, SIZE_CAMPO))
  19.    Apellido2 = RTrim$(Right$(item, SIZE_CAMPO))
  20. End Sub
  21.  
  22.  
  23. ' Funcion: Rellena con un (solo 1) carácter hasta completar el tamaño solicitado, si excede puede forzarse a cortar el sobrante.
  24. '  Parámetros:
  25. '    Valor: El dato a ser modelado.
  26. '    Size: Tamaño solicitado para la cadena devuelta.
  27. '    Delante: Señala a que lado se coloca el relleno (o en caso de sobrar, por donde se retiran).
  28. '    Relleno: Carácter que se utiliza para completar el tamaño (por defecto espacio).
  29. '    Force: Determina que si la cadena de entrada es más larga que los digitos pedidos, (por defecto) cortará el sobrante o lo devolverá tal cual llegó.
  30. '  Devuelve: una cadena con la cantidad de caracteres indicado por 'size', salvo que en origen a la entrada sea mayor y explicitamente no se haya forzado a cortar.
  31. Public Function FormatSizeString(ByRef Valor As String, ByVal Size As Byte, Optional Delante As Boolean, Optional ByVal Relleno As Byte = 32, Optional ByVal Force As Boolean = True) As String
  32.    Dim k As Integer
  33.  
  34.    k = (Size - Len(Valor))
  35.    If (k < 0) Then
  36.        If (Force = True) Then
  37.            If (Delante = True) Then
  38.                FormatSizeString = Right$(Valor, Size)
  39.            Else
  40.                FormatSizeString = Left$(Valor, Size)
  41.            End If
  42.        Else
  43.            FormatSizeString = Valor
  44.        End If
  45.    ElseIf (k > 0) Then
  46.        If (Delante = True) Then
  47.            FormatSizeString = (String$(k, Chr$(Relleno)) & Valor)
  48.        Else
  49.            FormatSizeString = (Valor & String$(k, Chr$(Relleno)))
  50.        End If
  51.    Else
  52.        FormatSizeString = Valor
  53.    End If
  54. End Function
  55.  

La siguiente imagen (compuesta) corresponde a este código en ejecución:




Puedes añadir más campos al listbox... pero si el 'ítem' del listbox se vuelve más complejo, conviene al caso mejor usar una estructura para definir cada campo, así como el tamaño de cada campo, que podría ser diferente.
NOTA: que la función que formatea el string, te lo he dejado en previsión de que formatee también textos que son números, indicando el lado donde añadir a la izquierda y el carácter '0' y luego si se quiere añadir espacios a su derecha (una segnda llamada).

Y si además la edición de cada campo es muy diferente, podría entonces usarse una clase en vez de un módulo.
La clase representaría un ítem del listbox, donde al pulsar en el listbox, transfiere dicho ítem a una clase, (no solo sus datos, también el índice que ocupa) y abre el form 2 que recibe una referencia a la clase, y durante su evento 'load', transfiere los datos d ela clase a la interfaz de edició que proporciona el form2, el botón deberían ser 2 botones uno aceptar y otro cancelar, ambos cierran  el form2 cuando se pulsen, la diferencia es que el 'aceptar' coloca de regreso los datos actuales en la clases, y en retorno, el form1 detecta si hubo cambios (una variable llamada así 'Changed = TRUE cuando se pulsa el botón 'Ok' y que se pone a Changed = FALSE cuando se carga el form2, detecta si hubo cambios y e n tal caso actaliza el ítem del listbox.
Más aún, dicha clase podría contener la posibilidad de 'añadir un ítem nuevo inexistente, abriendo el form con valores por defecto (en el caso de nombre y apellidos vacíos, pero si hay números, alguno podría tener cierto valor de entrada prefijado... por ejemplo si hubiere días de la semana, proveer un combobox, donde por defecto el día seleccionado fuere el Lunes (u otro según el caso).
1559  Foros Generales / Foro Libre / Re: Una proteína de origen no terrestre se encuentra en un meteorito por primera vez en: 8 Marzo 2020, 18:11 pm
No sé si me explico lo suficientemente bien, si me dejo algo en el tintero o si simplemente la gente deja su mente tan cerrada que es incapaz de sobrepasar su 'membrana', para ver...

Destierra la idea de que el planeta Tierra sea nuestro planeta. Liberados del geocentrismo, del yo, mi madre, mi familia, etc... podemos ver y entender a los demás y las cosas... Imagina billones de planetas revueltos por el Cosmos:
Cada cual tiene ya su tamaño, generado de cualquier manera, habitualmente se les supone que 'nacen' del polvo estelar cuando una estrella revienta, ese polvo luego se va reuniendo en pequeñas bolas que cada vez se hacen más grandes, cuando alcanzan cierto tamaño y en función de su composición, y distancia entre sí, tienen ya una cierta gravedad, lo que ayuda a que siga 'creciendo'... cualquiera de esas motas de polvo que a lo largo del tiempo componen el planeta puede portar proteínas ?. Si, pero igualmente puede portar solo los compuestos más simples, y luego el propio planeta generar las proteínas al ser un 'entorno' ya más 'motivado' merced a su tamaño y composición, puede tener ya una gravedad, que acaba generando calor en su interior por la fuerza generada y que además por su tamaño y distancia ya tenga una estrella a la que orbite y de la que 'reciba atenciones' cual planta las recibe de un jardinero... estonces un planeta es un prototipo (como si fuera diseñado exprofeso) para acoger la vida. Mientras se es un simple pedrusco, no.

Cualquier pedrusco inerte, con baja densidad y tamaño que le alcance, no tendrá gravedad apreciable, pero sigue teniendo material (su composición), luego un impacto en el planeta, es como algo más de 'abono' para el planeta...

Para un predrusco volando por el cosmos, el término día, puede ser irrelevante, porque con casi toda seguridad es que ni tenga un eje de rotación regular (o ni rote), y la palabra 'año' aunque lo tenga será de un período tan grande, que contener 'vida' activa (como la que esperan los científicos), será penosamente nulo. Más del 9999999'999999999 de su tiempo estará en un período congelado, que es lo más funesto para que se generen cambios.

Entonces si cada planeta es en sí mismo un vergel de vida en potencia, pretender que pedruscos inertes sean el origen de la vida, es cuanto menos mala leche adjudicando probabilidades matemáticas ínfimas a procesos insignificantes, despreciando en cambio la alta probabilidad a procesos estables y contínuos...

...pero en fin, cada cual está en su derecho de creer lo que quiera y si se pretende ser geocéntrico que se sea y se pretende ir al extremo opuesto y elegir un número del bombo y dar más probabilidad a ese que a todo el conjunto que ha quedado en el bombo, pués es un error, fuera de toda creencia. Para un bombo con 100 bolas, elegir una al azar es apostar al 1%, pretender que ese 1% es superior al 99%, es eso, un error matemático elemental.

El planeta Tierra es uno más, ni el único ni el 'especial' (salvo para nosotros que es nuestro hogar y que dada nuestra nimiedad es el único que conocemos), pero como todos los planetas, son los auténticos candidatos a la vida, no pedruscos inertes. Estos portarán lo que sea, pero en ellos va a ser que nunca se den las condiciones para que en sí mismos generen vida, otra cosa es que sean portadores de materia, pero materia que a fin de cuentas cada planeta ya posee, porque por su tamaño implica que lleva ahí millones de años 'juntando' materia de aquí y de allá y tene capacidad de modelar, cambiar, con una deviersidad de fenómenos capaces d ela vida. Un pedrusco es solo eso un pedrusco, sin importar de qué materiales esté hecho.

Podría hacerse una pregunta inteligente en base a ello. A partir de qué momento un planeta (generado a través del polvo estelar), está capacitado para tener vida???. Pués ya la he contestado, a partir del momento en que deje de ser solamente un pedrusco, y sea lo suficientemente grande como para tener una cierta gravedad y regularidad de sus órbitas... eso es lo básico para tener un 'motor de vida'.

...pero el que quiera puede dedicarse a recoger pedruscos o polvo en una probeta y esperar sentado a que genere vida. Que acabará por suceder, si tiene la fortuna de vivir algunos millones de años y recoger en su probeta billones de toneladas...

Espero que ahora quede claro, eso de que: La vida no vino a la Tierra, por que la Tierra no es nada aparte del Cosmos, es un 'pedrusco evolucionado'* que sigue siendo parte del Cosmos, es parte de la ecuación no el resultado. Desde que la Tierra misma era un simple pedrusco (o poco después (en términos cósmicos ese despues)) tuvo, tiene y tendrá todos los ingredientes de la vida, le faltaba solo pués un motor de vida, así como la cocina transforma los ingredientes que tienens en la alacena y la nevera en una comida. Pero por sí solos, huevos, sal, cebolla y patatas en un pedrusco, no producen una tortilla de patatas, requiere ese algo que lo cocine cada ingrediente en su peso, su punto y momento preciso. Esa cocina de ingredientes (prefiero llamarlo motor de vida) es lo que es un planeta... así que entiende que me resulte imposible aceptar que alguien diga que 'quien trajo la sal es el precursor de la tortilla de patatas' o que otro diga, 'no, es que trajo los huevos que es el ingrediente que los mantiene a todos juntos' o que otro diga; 'que va, son las patatas, porque sin ellas sería a lo sumo una 'tortilla francesa'... pués me saque cierta sonrisa, porque es solo una parte de la receta... la receta o es completa con todos sus ingredientes o seguirá faltando algo. al final la comida la hace el cocinero (el planeta), no el tipo (pedrusco), que trajo la sal, los huevos o las patatas. Así que la teoría d ela panspermia es meramente la teoría de los 'repartidores de supermercado'... te llevan los ingredientes a casa y nada más. La vida la generan los 'cocineros' no los 'repartidores'.



* pedrusco evolucionado: Planeta y otros nombres que se les da científicamente. Por ejemplo aunque a Plutón le 'hayan bajado de categoría' (porque alguien dijo que 'no es un planeta', posiblemente también tenga un motor de vida, otra cosa es cuanto de efectivo sea un determinado motor para una determinada tipificación de vida, aunque como los científicos (geocéntricos ellos), suelen contemplar solo la basada en carbono (erróneamente llamada orgánica, y erróneamente plasmada por el carbono, cuando el nitrógeno tiene más relevancia, si bien el carbono, es el material 'facil' que aporta el calor, esto es el nutriente), pués claro, con ciertas gafas solo se ve lo que deja pasar su filtro, no puede verse 'todo lo que hay. Así Plutón, desde luego no parece un motor de vida óptimo para una vida como la que existe en el planeta Tierra...
1560  Foros Generales / Foro Libre / Re: 12 mil españoles sin papeles llegaron a la Venezuela prospera de los años 50 en: 7 Marzo 2020, 22:42 pm
Sí, es triste recordar que hasta los años 90, Venezuela era el país más próspero de Suramérica, con sólo dos moderados problemas: delincuencia y desigualdad social, para que luego Chávez (tras su intento fallido de golpe de estado y su posterior amnistía judicial), prometiera cosas que lejos de cumplirse ninguna han acabado arruinando al país al completo, ahora la delincuentcia (probablemente) sea 10 mayor, la corrupción política (que seguramente la habría  tiempso atrás y que era mínima), ahora es el modus operandi (que campa a sus anchas en el país)... y en lo que sin duda se ha mejorado es en la desigualdad social.

Antes, con la desigualdad social yacente habría (por ejemplo)
    03% ricos
    32%clase media
    50% clase baja
    15% bajo el umbral de pobreza...
Ahora la desigualdad se ha equilibrado bastante, la 'mejora' consiste en:
    01% ricos
    09% clase  media
    10%clase baja
    80% bajo el umbral de pobreza

Claro que nadie puede dar por aceptable equilibrar la desigualdad haciendo pobres a todos, si no más bien subiendo de peldaño a los que están más abajo, no bajando a los que están más arriba que es lo que han logrado hacer y es el resultado final del 'chavismo'.

El resultado es que un país que antes acogía emigrantes, es ahora el que está forzado a emigrar... Solo en España acoge ahora mismo a unos 134.000 emigrantes de Venezuela... a saber cuantos venezolanos hayan tenido que emigrar, peor de lejos  muchos más que los que emigraron de España tras una guerra (en Venezuela no hay guerra pero el resultado final parece más catastrófico que si la hubiera habido, salvo quizás las muertes que la ocasión hubiera generado).
https://es.statista.com/estadisticas/472512/poblacion-extranjera-de-espana-por-nacionalidad/

España  tiene ahora una población de inmigrantes de unos 4'5millones (según wikipedia). que representan aprox. el 10% de la población, pero solo contando aquellos que 'tienen papeles', la cifra será mayor considerando que es más que probable que haya otra cantidad (dato hipotético) similar sin papeles.

Solo en 2017, en España entraron unos 320.000 inmigrantes no pertenecientes a la UE (530.000 contando otros de la UE, como por ejemplo los procedentes de Rumanía que son del resto el mayor grupo), nada que ver con esos 12.000 que emigraron a Venezuela hace 70 años, a lo largo de una década.
https://ec.europa.eu/eurostat/statistics-explained/index.php?title=File:Immigration_by_citizenship,_2017_.png

La Historia inevitablemente tiene cambios, ...es muy triste cuando ese cambio es a peor, motivado por estupideces ideológicas...
Páginas: 1 ... 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 [156] 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 ... 432
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines