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

#1951
Android se desarrola en Java, aunque no admite todo el conjunto completo de Java, especialmente a lo que refiere a la operativa de la interfaz. Si no reucerdo mal, en la propia página de google-android, había una página específica que señalaba de espacios de nombres no se admitían para Android.

Aparte Google ha tenido encontronazos con Sun, precisamente por usar Java, así que Google, quiere deshacerse progresivamente de ese 'lastre'. En ese intervalo aparece Kotlin, y es una apuesta a futuro (quién sabe, es un proyecto ruso, así que...).

En cualquier caso, toda la info que precisas al respecto está (como de costumbre  :silbar:), en la propia web del fabricante...:
https://developer.android.com/studio/intro/

Allí verás que apunta a Inteli J Idea, y una vez allí... (descarga la versión 'comunity') pero antes de saltar a parte alguna, lee, abre pestañas y sigue leyendo...
#1952
Citarlo compile en x86. Para probar si asi en el pc del windows 2000 funcionaria y sigue sin ir.
En windows 2000, no sé que versión soporta del NET framework, yo te decía como mucho hasta la versión 2.0, pero es probable que ni eso (jamás tuve la versión 2000, pasé directamente del 98 al XP).

En cualquier caso, si funcionara, como mínimo exige tener instalado el framework 2.0 Es decir si no está instalado, nunca funcionará ningún programa de NET que requiera NET Framework 2.0.

Vete a la carpeta de windows, (en el win 2000), mira una ruta tal que así (cambiando la unidad de instalación si no fuera "C:")
C:\WINDOWS\Microsoft.Net\Framework
Si existe dicha carpeta, ahí saldrán otras carpetas, cuyo nombre es similar a éste:
v2.0.50727
En ése caso indica que es la versión 2.0.xxx
Interesa ver cual es la versión mayor instalada, pués está señalando cual es/son los frameworks instalados de NET.

Si ni siquiera existe tal carpeta, o bien win 2000 no soporta NET, o bien no tienes ninnguna versión instalada.

Como dices que no quieres instalar nada... pués no tiene sentido que te diga:
Busca en la página de MS, la versión Net Framework 1.0, elige tu idioma (el mismo que tiene instalado el S.O. (español, inglés, ...???), lo descargas y lo instalas, luego igual con el Net Framework 1.1, luego igual con el Net framework 2.0, y luego con el Net framework 3.0 ... desde el momento en que te dijere que el S.O. no está diseñado, no admite ... es inútil instalar una versión más nueva. Pero al menos saber si tiene instalado o admite alguna versión, ayudaría...

CitarEn cambio tu programita si que va.
El programa está compilado en Visual Basic 6 (Visual Studio versión 6.0 (1998)).
...y el código expuesto (en ese mismo mensaje), es el código del programa.

Visual Basic (Visual Studio) 6.0 es enteramente compatible con Win 2000.

CitarCon lo que me pregunto, que estoy haciendo mal en el visual studio ?
sospecho que algo estaré haciendo mal, el que ni idea.
No puede copiarse y pegarse  código de un proyecto en VS6.0 en un proyecto de NET (da igual qué versión) y esperar que funcione, sin cambios.

Citaralguna sugerencia de como arreglarlo ?
Puede uno copiar y pegar, si luego supiera recodificarlo haciendo los cambios pertienentes.
En las primeras versiones de VB NET (VB NET2003 y VB NET2005, al menos), había un importador de código de VS6, y añadía comentarios sobre lo que ya no se admitía y que lo remplazaba... aún siguiendo todas las directrices, no era ni mucho menos óptimo (más bien deficiente)... se trataba más de una estrategia para animar a la gente a migrar a VS NET

...pero no tiene sentido hacer eso, ya estuvimos anteriormente haciendo código para NET... y funcionaba.
Faltaba solo optimizarlo, hasta entonces el código era para que resultara asimilable de entender.

Qué sentido tendría ahora tomar código en VS6, para transformarlo a VB NET, si ya tenemos ese código en NET hecho?.

Ahora mismo, tu problema no es el código, tu problema es que la palataforma donde quieres integrarlo es completamente distinta de la plataforma de producción. ...Si win 2000 admite algún framework de NET (yo creo que sí, que alguno debe admitir), pero si no lo tienes instalado y no quieres instalarlo... son y serán incompatibles.

...pero ni siquiera tienes ese problema, toda vez que ya he creado yo el programa para tí, con Visual Basic 6.0...

Citar
O es que me tendria que buscar el visual basic 6.0 ?
Si quieres compilarlo por tu cuenta sí.

Pero ten en cuenta que sobre la interfaz se han reflejado valores en propiedades, que ahí no aparecen... por ejemplo los textbox de monedas, son un array de textboxes, lo mismo los textboxes de importe y los labels de valor.
Los arrays de controles en NET, es algo que nunca se adoptó... De hecho en las postrimerías, un proyecto que tuve que readaptar por exigencias de una empresa en mantener el código lo más similar (en apariencia textual) posible a VB6, tuve que remplazar tales arrays por colecciones del mismo nombre, para que al leer el código les 'sonara' como igual, aunque por debajo, era completamente distinto.

Pero bueno, si te consigues un IDE de VB6.0 y lo instalas, te paso el texto íntegro del proyecto, o mejor copia de los ficheros del proyecto.

El código aún tratandose del lenguaje Basic y del mismo "fabricante", es totalmente distinto en VB6 que en VB NET.
No merece la pena perder el tiempo aprendiendo VS6.
Para quien a estas alturas no sabe nada de él, es preferible que aprenda Visual Basic NET.



En cualquier caso, si todo lo que necesitabas era esa calculadora, ya la tienes... para qué darle más vueltas?.
Por cierto, no sé si te bajaste la versión previa o la última que puse, olvidé hacer el chequeo de cuando se dejaba en blanco el textbox, que cerraba el programa... para disitnguirlo de la previa, aproveché para poner una imagen de una calculadora en la esquina superior izquierda.

Por cierto tengo curiosidad por saber que significa eso de "...de la CM".
#1953
Por cierto me olvidaba decirte que usa la fuente "Segoe UI", así que cópiala de tu equipo y la pegas en el win 2000, si no intentará tomar la que mejor se adapte a las características... pero a saber si acierta, y puede verse mal.



He actualizado la descarga, tenía un pequeño error que colgaba el programa cuando se dejaba vacío el textbox...
Y he aprovechado para añadir un botón 'borrar' y una imagen de calculadora.

Recuerda que puedas saltar entre cajitas de texto, usando la tecla 'Tab' (esto en prácticamente todas las ventanas de Win2), pero igualmente he dejado la funcionalidad que tu tenías a través de la tecla 'intro' (tecla 'space' para el botón 'total').

#1954
Te está señalando que no encuentra el fichero mscoree.dll en ninguna de las rutas (environ Path) que el sistema tiene habilitado buscar...

Me temo que si, que finalmente te pediría como mínimo instalar el framework 2.0, en caso de que el win2000 lo admitiese.

Bueno, miro de hacerte el programa en VB6 y te lo paso, en realidad son 5 minutos... es de suponer que al menos sí tendrás ahí el runtime de VS6.0 instalado en ese equipo...

pd.: mscoree.dll es parte del runtime del .NET framework



Descargar desde aquí:
https://workupload.com/file/VTqLuWdj

Está comprimido con winrar. Después de extraerlo, aunque no tiene virus, siempre es recomendable pasarle el antivirus (por ejemplo desde https://www.virustotal.com ) antes de ejecutarlo, nunca se sabe si fue manipulado en la nube...

Una captura de como se ve...


Y aquí el código en vb6...

Código (vb) [Seleccionar]


Private Const c_VALID_CHARS         As String = "0123456789"
Private Const c_COLOR_AGUAMARINA    As Long = &HF0F0E0
Private Const c_COLOR_ARENA         As Long = &HC0D0E0

Private NextFoco                    As Integer
Private Valores                     As Variant









Private Sub Form_Load()
    Valores = Array(50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01)
End Sub

Private Sub ComBorrar_Click()
    Dim k As Integer
   
    For k = 0 To 11
        TxtMonedas(k).Text = "0"
        Call TxtMonedas_Validate(k, False)
    Next
   
    Call Calcular
End Sub

Private Sub TxtMonedas_Change(Index As Integer)
    TxtMonedas(Index).BackColor = c_COLOR_ARENA
    TxtTotal.Text = String$(8, "-")
    TxtImporte(Index).Text = String$(8, "-")
End Sub


' Limitado a 8 cifras.
' Es decir valor máximo admitido en cantidad es: 99.999.999
Private Sub TxtMonedas_Validate(Index As Integer, Cancel As Boolean)
    Dim Valor As Long
   
    If TryParseToLong(TxtMonedas(Index).Text, Valor) = False Then
        Cancel = True
        Call MsgBox("No se acepta como un número el contenido para " & TxtMonedas(Index).Tag, vbExclamation, "Error: No es un número (entero y positivo)")
        TimFoco.Enabled = True ' para seleccionar su contenido listo para editar.
    Else
        TxtMonedas(Index).BackColor = c_COLOR_AGUAMARINA
        TxtImporte(Index).Text = CStr(Valores(Index) * Valor)
        Call Calcular
    End If
End Sub

' Realiza la suma y presenta el resultado en el textbox del total.
Private Sub Calcular()
    Dim k As Long, n As Single
   
    For k = 0 To 11
        n = (n + CSng(TxtImporte(k).Text))
    Next
   
    TxtTotal.Text = CStr(n)
End Sub

' por cada carácter en el texto verifica si es uno entre: "0123456789",
'  si es así devuelve TRUE y el texto se convierte en el valor (un entero de 31 bits).
'  si no devuelve FALSE y el valor se hace 0
Private Function TryParseToLong(ByRef Texto As String, ByRef Valor As Long) As Boolean
    Dim k As Long
   
    If (Len(Texto) > 0) Then
        For k = 1 To Len(Texto)
            If (InStr(c_VALID_CHARS, Mid$(Texto, k, 1)) = 0) Then
                Valor = 0
                Exit Function
            End If
        Next
        Valor = CLng(Texto)
        TryParseToLong = True
    Else
        Valor = 0
    End If
End Function

'---------------------------------------------------
'  Saltar el foco entre controles...
'  En realidad para eso sirve la tecla 'tab'
'    pero lo he dejado como tu tenías.
'---------------------------------------------------
'

' Entrega el foco al siguiente textbox.
Private Sub TimFoco_Timer()
    TimFoco.Enabled = False
   
    TxtMonedas(NextFoco).SetFocus
End Sub

' Deja seleccionado el contenido del textbox que tiene el foco (para editar/borrar fácilmente).
Private Sub TxtMonedas_GotFocus(Index As Integer)
    With TxtMonedas(Index)
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub

' Si pasa la validación...
'   Pasar el foco automáticamente al siguiente control.
'   tras el último se pasa al botón total.
Private Sub TxtMonedas_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
    Dim cancelar As Boolean
    If (KeyCode = vbKeyReturn) Then
        Call TxtMonedas_Validate(Index, cancelar)
        If (cancelar = False) Then
            NextFoco = (Index + 1)
            If (Index < 11) Then
                TimFoco.Enabled = True
            Else
                NextFoco = 0 'Index
                ComTotal.SetFocus
            End If
        Else
            TxtMonedas(Index).SetFocus
        End If
    End If
End Sub

Private Sub TxtMonedas_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
    NextFoco = Index
End Sub

' el botón es competamente inútil, solo tiene por objeto invitar a pulsarlo para que
'   el textbox que tiene el foco, pierda el control y proceda la validación.
' Y como adquiere el foco, presionar intro, entregamos el foco al primer textbox.
Private Sub ComTotal_KeyUp(KeyCode As Integer, Shift As Integer)
    If (KeyCode = vbKeySpace) Then
        NextFoco = 0
        TimFoco.Enabled = True
    End If
End Sub



Cuando estás editando un campo, se pone de color arena y la casilla de importe y del total, se borra su contenido (tal como se ve en la siguiente imagen), para indicar que debe recalcularse al termino de la edición... así cuando un valor aparece en el total, se corresponde fielmente con el contenido de cada casilla y todas tendrán su color de  fondo en aguamarina.

#1955
Citar...y si es asi te refieres que elimine todos esos codigo y lo sustituya por el que me comentas aqui, pero claro poniendo los nombres de los billetes y monedas que corresponde en cada uno...
Exacto, si...

Citarporque este pc trabaja con windows 2000 de 32 bits y el programita el exe compilado es de 64 bits.
Si el ordenador destino ha de ser fijo un windows 2000, hay que rehacerlo en vb6...
No obstante, no elimines el programa... si tarde o temprano, tienes que usarlo en un equipo más actual, pués ya lo tienes.

CitarHay forma sencilla de arreglar eso o tendre que empezar desde 0?
No. Son tecnologías distintas. En windows 2000 incluso es muy probable que no admita ningún framework más actual que el 1.1 o 2.0 de NET (no estoy seguro, habría que mirarlo).
Ya en el XP, la versión superior que admite es el NET 3.5

En fin, básicamente se puede rehacer con VB6, con cambios eso sí... La cuestión es si tienes un IDE de VB6...

#1956
Si sobran sobran... que no tenga ni un solo uso en todo un año, creo que es más suficiente para saber que sobran.
Quizás no deban eliminarse nunca todas, o quizás en muchas poblaciones de pocos miles de habitantes baste con solo 1.
#1957
Fabricando en los países más precarios del mundo, y vendiendo a los precios más caros del mundo.

La rentabilidad por encima de todo y la honestidad al cubo de la basura, no figura en su diccionario... así es 'Apple'.
#1958
Bien, pués ahora que parece que ya te funciona todo bien, vamos a hacer una optimización de reducción de código...

La rutina validating... Si te fijas bien, hay una por cada billete y moneda, pero el código que hacen es siempre el mismo... entonces vamos a parametrizar las diferencias para reunirlas en una sola función, y desde todas ellas invocar a esa.

Primero creamos la función que hará el trabajo de todas, y luego vemos de modificar una a modo de ejemplo pero que se aplica a todas (cambiando las diferencias):
Código (vbnet) [Seleccionar]

   Private Sub ValidandoBiletesyMonedas(ByVal Valor As String, ByVal TxtDestino As TextBox, ByVal FactorConv As Single, ByVal TextoMsg As String, ByVal e As System.ComponentModel.CancelEventArgs)
       Dim v As UShort

       If UShort.TryParse(Valor, v) = False Then
           e.Cancel = True
           Call MessageBox.Show("No puede tomarse como un número el valor para" & TextoMsg, "Error: No es un número (entero y positivo).", MessageBoxButtons.OK, MessageBoxIcon.Warning)
       Else
           TxtDestino.Text = (FactorConv * v).ToString
       End If
   End Sub


Como ves la rutina hace exactamente lo mismo que hemos venido haciendo en cada una, solo que está es 'universal' para todas ellas... Puede ser llamada desde todas las otras que tienen ese código, con una sola línea en aquellas llamando a esta, con los valores adecuados en sus parámetros...

Ahora te pongo, como se ha cambiado una de ellas, para que de modo similar, apliques el cambio a todas, fijándote bien en los valores que pones en la llamada a esta función recién redactada...
De ejemplo tomamos la de 1 céntimo... nota que dejo comentado el código previo que tenía... te sirve para verificar que los datos que pasas a la función son los mismos que ahí tienes, cuando funciones bien, puedes eliminarlo y estarás eliminando unas 100 líneas de código de un plumazo.
Código (vbnet) [Seleccionar]

Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TxtBillete001.Validating
       ' sender se refiere siempre al objeto que lo llama, aquí txtMonedas001, poner sender.text es casi lo mismo que poner txtMonedas001.text
       Call ValidandoBiletesyMonedas(sender.text, TxtImporte001, 0.1, " 'monedas de 1 céntimo'.", e)
       'Dim v As UShort 'Single 'UShort
       'If UShort.TryParse(txtMonedas001.Text, v) = False Then
       '    e.Cancel = True
       '    Call MessageBox.Show("No puede tomarse como un número el valor para 'monedas de 1 céntimo'.", "Error: No es un número.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
       'Else
       '    TxtImporte001.Text = (0.1 * v).ToString
       'End If
   End Sub


Cuando compruebes que te funcionen bien (porque no equivocaste los valores que se pasan a la función), puedes eliminar el código comentado en cada función, y mira como queda reducido:
Código (vbnet) [Seleccionar]

Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TxtBillete001.Validating
       Call ValidandoBiletesyMonedas(sender.text, TxtImporte001, 0.1, " 'monedas de 1 céntimo'.", e)
   End Sub




p.d.: Cuando hagas esa optimización y te salga bien... sin errores (si quieres, por supuesto), todavía volveremos a optimizarlo más, no solo esa, también las de KeyPress... para que sean remplazas todas por solo 2 funciones en cada caso.
#1959
Cita de: PROFENIX en 26 Diciembre 2018, 22:20 PM
vale he hecho los cambios que me has comentado, pero te comento que he encontrado un fallo el cual no se a que se debe. imagino que habrá que programarlo también. es el hecho en que si por ejemplo en los billetes de 50 pones 4 el resultado sera 200 y en la totalización dará 200, pero cuando llegas al billete de 5 y si en un principio pones que hay 5 que serian 25 el resultado en la totalización serian 225, pero si borras los 5 porque eran 6 el resultado te lo da que serian 30 pero en la suma no se efectúa dicho cambio en la operación, no se si me explico.

esta observación la veo que pasa a partir de los billete de 5


Código (vbnet) [Seleccionar]
Public Class Form1

   '.... código previo omitido.

   Private Sub Totalizar() Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
       Dim CantidadTotal As Single  ' entero de 32 bits...

       If (Inicializado = True) Then
           CantidadTotal = 0
           CantidadTotal += Single.Parse(txtImporte50.Text)
           CantidadTotal += Single.Parse(txtImporte20.Text)
           CantidadTotal += Single.Parse(txtImporte10.Text)
           CantidadTotal += Single.Parse(txtImporte5.Text)
           CantidadTotal += Single.Parse(txtImporte2.Text)
           CantidadTotal += Single.Parse(txtImporte1.Text)
           CantidadTotal += Single.Parse(txtImporte050.Text)
           CantidadTotal += Single.Parse(txtImporte020.Text)
           CantidadTotal += Single.Parse(txtImporte010.Text)
           CantidadTotal += Single.Parse(txtImporte005.Text)
           CantidadTotal += Single.Parse(txtImporte002.Text)
           CantidadTotal += Single.Parse(txtImporte001.Text)

           txtTotal.Text = CantidadTotal.ToString
       End If
   End Sub

'... código intermedio omitido.


   Private Sub Totalizar(sender As Object, e As EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged

   End Sub

End Class

De entrada tienes repetida la función... borra esta segunda que tienes al final del código

Tu problema es que no te ciñes a lo que te dije aqúi:

CitarNota también que cuando añades el handles, se indica el objeto (control) y el evento correcto... cualquier equivocación en el objeto o en evento, puede producir resutados inesperados, erróneos, o inexactos, impredecibles... a saber...

Fíjate que en esta rutina los eventos a enganchar, son los de cambio de los textbox de IMPORTE (mira el código que te pasé como si lo tienen así, te lo pongo aquídebajo), y  NO el de los textbox de las CANTIDADES, que has puesto (mira tu rutina más arriba).

Código (vbnet) [Seleccionar]

'------------------------------------------ !!!! ------------ !!! ----
   Private Sub Totalizar() Handles TxtImporte001.TextChanged, txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporteX5.TextChanged
       ' -------------------------!!!---
       Dim CantidadTotal As Single   ' entero de 32 bits...

       If (Inicializado = True) Then
           ' ---------------------!!!-----
           CantidadTotal = Single.Parse(txtImporte50.Text)
           CantidadTotal += Single.Parse(txtImporte20.Text)

           CantidadTotal += Single.Parse(txtImporteX5.Text)

           ' ---!!! -------------------------------!!!------
           CantidadTotal += Single.Parse(TxtImporte001.Text)

           txtTotal.Text = CantidadTotal.ToString
       End If
   End Sub


Es decir, lo correcto es esto:
    Private Sub Totalizar() Handles TxtImporte50.TextChanged, ...
y no esto que has puesto:
     Private Sub Totalizar() Handles txtBillete50.TextChanged, ...
#1960
.NET (C#, VB.NET, ASP) / Re: dibujar en 3D
26 Diciembre 2018, 01:18 AM
Ok... Mañana miro de sacar un tiempito y te pongo un sencillo ejemplo que puedas explorar, entender, completar y ampliar...