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

#3191
Bien... pero incluso si no has hecho el código, o si fue 'traducido' desde otro lenguaje, sería conveniente que aclares lo desastroso del código a quien te hizo el encargo y que puedes optimizarlo para que sea más rápido, claro y conciso (menos tamaño en disco y en memoria), por un precio extra... y que es conveniente hacer eso antes de los cambios que reclamen hacer.

Ahora mismo cualquier cambio supone un cierto 'sufrimiento', y mucho tiempo extra, porque exige repasar la infinidad de variables y líneas cuasi equivalentes, por si hay alguna discrepancia que no salte con claridad a la vista. Sin embargo tras perder el tiempo repasando, al final se ve que la mayor parte del código es ineficiente y redundante, podría abreviarse probablemente a una vigésima parte del tamaño actual... En fin si te han encargado hacer cambios, diles que la propia ineficiencia del código requiere un cambio urgente... y de paso cóbralo...


-----------------------------
En cuanto a tu dilema, ya te he conestado, aunque quizás te haya pasado inadvertido entre tantas sugerencias, me autocito y lo comento más específicamente:

Donde tienes cada una de las líneas de éstas (con size y point):
Código (vbnet) [Seleccionar]
   Dim point = New Point(&H2C8, &H1F0)
   Me.TextBox5.Location = point
   size = New Size(120, &H1D)
   Me.TextBox5.Size = size
   


Cámbialas por otras equivalente, es decir elimina la declaración del:
size =...
point = ...
y lo que está al otro lado del igual se lo asignas directamente a la línea que antes recibía un:
textbox...Location = point
textox... Size = size

Y te quedarían así:
Código (vbnet) [Seleccionar]

   TextBox5.Location = New Point(&H2C8, &H1F0)
   TextBox5.Size = New Size(120, &H1D)


Habiéndo remplazado todas las líneas que tienes con size y point, de este modo, ya no puede darte problemas con 'size' ni 'point', porque han desaparecido del código...

---------------------------
...y en cuanto a los valores hexadecimales, no tiene demasiada importancia en que sistema de numeración estén los valores, pero si te cuesta entender los valores hexadecimales cámbialos a decimales... si lo precisas usa la calculadora 'científica' (de win2).
#3192
Es imposible ejecutar el proyecto para ver qué error marca, faltan ficheros y arroja un montón de errores (para en el número 103)...

Es muy probable que hayas declarado en algún método dos veces un campo del mismo nombre.

Te voy algunos consejos, que deberías aplicar d eforma inmediata a tu sopa de espaguetis digo código:
1 - No es buena idea llamar a un miembro con el mismo nombre que el tipo cual es, se presta a confusión, además, cualquier cambio al nombre podría aplicarse también al tipo de forma inadvertida.
Código (vbnet) [Seleccionar]
Dim point = New Point(&H2C8, &H1F0)
Podrías llamarlo por ejemplo en español, y quedaría así:
Código (vbnet) [Seleccionar]
Dim punto = New Point(&H2C8, &H1F0)

2 - Cuando creas una variable para establecerla una sola vez y aisgnarla una sola vez, te la puedes ahorrar. Esto, es una idiotez:
Código (vbnet) [Seleccionar]
Dim point = New Point(&H2C8, &H1F0)
Me.TextBox5.Location = point
size = New Size(120, &H1D)
Me.TextBox5.Size = size

Puedes hacer directamente:
Código (vbnet) [Seleccionar]
Me.TextBox5.Location = New Point(&H2C8, &H1F0)

Me.TextBox5.Size = New Size(120, &H1D)


3 - el código está lleno de referencias a "Me". cuando un objeto se llama cada vez, se lo busca en la tabla para obtener su dirección y con ella prosigue la búsqueda para el miembro interno.... entonces esto que sigue... es perder tiempo... es como si 5 personas en una mesa te piden tabaco una detrás de otra, y tú cada vez, sacas la cajetilla de tu tabaco, ofreces y la vuelves a guardar, vuelves a sacarla, ofreces y la vuelves a guardar... acaso no es mejor sacarla, ofrecer a todos y ya entonces la guardas????
Código (vbnet) [Seleccionar]

           Me.TextBox4.Location = point
           Me.TextBox4.MaxLength = 5
           Me.TextBox4.Name = "TextBox4"
           size = New Size(&H48, &H1D)
           Me.TextBox4.Size = size
           Me.TextBox4.TabIndex = &H19
           Me.TextBox4.Text = ""
           Me.TextBox5.Enabled = False
           point = New Point(&H2C8, &H1F0)
           Me.TextBox5.Location = point
           Me.TextBox5.Name = "TextBox5"
           size = New Size(120, &H1D)
           Me.TextBox5.Size = size
           Me.TextBox5.TabIndex = &H1A
           Me.TextBox5.Text = "TextBox5"
           Me.TextBox6.Enabled = False

Es mejor hacelro así:
Código (vbnet) [Seleccionar]

    With Me
           .TextBox4.Location = point
           .TextBox4.MaxLength = 5
           .TextBox4.Name = "TextBox4"
           size = New Size(&H48, &H1D)
           .TextBox4.Size = size
           .TextBox4.TabIndex = &H19
           .TextBox4.Text = ""
           .TextBox5.Enabled = False
           point = New Point(&H2C8, &H1F0)
           .TextBox5.Location = point
           .TextBox5.Name = "TextBox5"
           size = New Size(120, &H1D)
           .TextBox5.Size = size
           .TextBox5.TabIndex = &H1A
           .TextBox5.Text = "TextBox5"
           .TextBox6.Enabled = False
    End With


4 - No conoces el bloque de condiciones "select case"?. Esto queda horrooroso y es ineficiente...
Código (vbnet) [Seleccionar]
If (Me.OPCB = 1) Then
               str = "Select COD,NOMBRE,ORD,LIM_TRIPLE,LIM_TERMI,PRE_TRIPLE,PRE_TERMI,CIERRE,ACTIVA,APRO,PUNTA,COLA from loteria WHERE TIPO='L' order by ord"
               Me.ListBox4.Items.Add("Cod         Nombre                                Orden     Lim/Triple  Lim/Term  P/Triple   P/Term   H/Cierre  Activado Punta Cola")
           End If
           If (Me.OPCB = 4) Then
               str = "Select COD,NOMBRE,ORD,LIM_TRI_ZOD,LIM_TER_ZOD,PRE_TR_ZOD,PRE_TE_ZOD,CIERRE,ACTIVA,APRO FROM LOTERIA WHERE TIPO='Z' order by ord"
               Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Tr/Zod Lim/Te/Zod P/Tr/Zod P/Te/Zod H/Cierre Activado")
           End If
           If (Me.OPCB = 3) Then
               str = "Select COD,NOMBRE,ORD,LIM_COMBO,LIM_ANIMAL,PRE_COMBO,PRE_ANIMAL,CIERRE,ACTIVA,APRO from loteria WHERE TIPO='A' order by ord"
               Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Animal Lim/Combo  Pre/Anim Pre/Term H/Cierre Activado")
           End If
           If (Me.OPCB = 5) Then
               str = "Select COD,NOMBRE FROM animal ORDER BY COD"
               Me.ListBox4.Items.Add("Cod      Nombre                 ")
           End If
           If (Me.OPCB = 6) Then

Si la ejecución de una condición no modifica el objeto que se sigue mirando, el código anterior es ineficiente, porque solo puede ser un valor entre ellos (o ninguno), pero tú obligas a compararse en todos los casos iempre incluso cuando ya se haya encontrado. El bloque Select Case, evalúa la condición y 'SALTA' al punto del código donde corresponde y no evalúa para ninguna otra condición....
Código (vbnet) [Seleccionar]
Select case Me.OPCB
    case 1
          str = "Select COD,NOMBRE,ORD,LIM_TRIPLE,LIM_TERMI,PRE_TRIPLE,PRE_TERMI,CIERRE,ACTIVA,APRO,PUNTA,COLA from loteria WHERE TIPO='L' order by ord"
               Me.ListBox4.Items.Add("Cod         Nombre                                Orden     Lim/Triple  Lim/Term  P/Triple   P/Term   H/Cierre  Activado Punta Cola")      
    case 4
               str = "Select COD,NOMBRE,ORD,LIM_TRI_ZOD,LIM_TER_ZOD,PRE_TR_ZOD,PRE_TE_ZOD,CIERRE,ACTIVA,APRO FROM LOTERIA WHERE TIPO='Z' order by ord"
               Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Tr/Zod Lim/Te/Zod P/Tr/Zod P/Te/Zod H/Cierre Activado")          
    case 3
               str = "Select COD,NOMBRE,ORD,LIM_COMBO,LIM_ANIMAL,PRE_COMBO,PRE_ANIMAL,CIERRE,ACTIVA,APRO from loteria WHERE TIPO='A' order by ord"
               Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Animal Lim/Combo  Pre/Anim Pre/Term H/Cierre Activado")
    case 5
               str = "Select COD,NOMBRE FROM animal ORDER BY COD"
               Me.ListBox4.Items.Add("Cod      Nombre                 ")
    case 6
        '.....
    case else
        '....
End Select


5 - No hace falta que pongas una línea por cada declaración... especialmente si no le vas a asignar ningún valor de entrada.... Así este código:
Código (vbnet) [Seleccionar]

               Dim str2 As String
               Dim str3 As String
               Dim str4 As String
               Dim str5 As String
               Dim str6 As String
               Dim str7 As String
               Dim str8 As String
               Dim str9 As String
               Dim str10 As String
               Dim str11 As String

Se vería más claro así:
           
Código (vbnet) [Seleccionar]
   Dim str2 As String, str3 As String, str4 As String, str5 As String, str6 As String
               Dim str7 As String, str8 As String, str9 As String, str10 As String, str11 As String


6 - Cuando tienes varias asignaciones o código repetitivo, es preferible usar un bucle. es más limpio y claro el código... esto es cansino:
Código (vbnet) [Seleccionar]
str2 = reader.Item(0).ToString
                       str3 = reader.Item(1).ToString
                       str4 = reader.Item(2).ToString
                       str5 = reader.Item(3).ToString
                       str6 = reader.Item(4).ToString
                       str7 = reader.Item(5).ToString
                       str8 = reader.Item(6).ToString
                       str9 = reader.Item(7).ToString
                       str10 = reader.Item(8).ToString
                       Me.ListBox4.Items.Add(String.Concat(New String() { str2, ChrW(9), str3, ChrW(9), str4, ChrW(9), str5, ChrW(9), str6, ChrW(9), str7, ChrW(9), str8, ChrW(9), str9, ChrW(9), str10 }))

Es mucho mejor declarar un array de string, y asignarlas en un bucle, finalmente hay dos opciones para añadirlos al listbox...
Código (vbnet) [Seleccionar]

   Dim str2(0 to 8) as string
   Dim k as integer
   For k=0 to 8
       Str2(k) = reader.Item(k).ToString & chrW(9) ' <----- Notar
   Next
   ListBox4.Items.AddRange(str2)  '¡ puedes usar AddRange...

   
Código (vbnet) [Seleccionar]
Dim str2(0 to 8) as string
   Dim k as integer
   For k=0 to 8
       Str2(k) = reader.Item(k).ToString
   Next
   ListBox4.Items.Add(Strings.Join(str2,ChrW(9))  ' <---- se usa Join, para concatenar el array de strings, y el separador sigue siendo el mismo. El tabulador...


7 - Tienes bloques de código a patadas como el siguiente, que en realidad se pueden resolver en un bucle, y en cualquier caso mucho más simplificado que esta madeja de hilos dejada al gato para su entretenimiento... tiene multitud de sangre derramándose... :laugh: :laugh: :laugh: :laugh:
Código (vbnet) [Seleccionar]

           If (Strings.Len(str3) = 4) Then
               If (StringType.StrCmp(Strings.Mid(str3, 1, 1), ".", False) = 0) Then
                   str2 = String.Concat(New String() {Strings.Mid(Strings.Trim(str3), 2, 1), Strings.Mid(Strings.Trim(str3), 3, 1), ".", Strings.Mid(Strings.Trim(str3), 4, 1), "0"})
                   Return obj2
               End If
               If (StringType.StrCmp(Strings.Mid(str3, 2, 1), ".", False) = 0) Then
                   str2 = ("0" & Strings.Mid(Strings.Trim(str3), 1, 1) & "." & Strings.Mid(Strings.Trim(str3), 3, 2))
                   Return obj2
               End If
               If (StringType.StrCmp(Strings.Mid(str3, 3, 1), ".", False) = 0) Then
                   str2 = (Strings.Mid(Strings.Trim(str3), 1, 2) & "." & Strings.Mid(Strings.Trim(str3), 4, 1) & "0")
                   Return obj2
               End If
               If (StringType.StrCmp(Strings.Mid(str3, 4, 1), ".", False) = 0) Then
                   str2 = (Strings.Mid(Strings.Trim(str3), 1, 3) & "." & Strings.Mid(Strings.Trim(str3), 5, 1) & "0")
                   Return obj2
               End If
               If (StringType.StrCmp(Strings.Mid(str3, 5, 1), ".", False) = 0) Then
                   str2 = (Strings.Mid(Strings.Trim(str3), 1, 3) & "." & Strings.Mid(Strings.Trim(str3), 5, 2))
                   Return obj2
               End If
               str2 = (Strings.Mid(Strings.Trim(str3), 1, 2) & "." & Strings.Mid(Strings.Trim(str3), 3, 2))
               Return obj2
           End If


Primero como str3 es una cadena de texto, puedes directamente escribir
Código (vbnet) [Seleccionar]
if (str3.Length = 6) then
en vez de
Código (vbnet) [Seleccionar]
If (Strings.Len(str3) = 6) Then
Ya que lenght es un método del tipo String, igualmente poseee el método Trim, TrimEnd, TrimStart, y aunque no tieme Mid, es equivalente a Char.
Así este código:
Código (vbnet) [Seleccionar]
Strings.Mid(str3, 5, 1)
Puede rescribirse mejor así:
Código (vbnet) [Seleccionar]
Str3.Char(5)
Si en vez de recibir un solo carácter es preciso recioger varios, entonces en vez de Char, se usaría el método Substring
Así un código como este:
Código (vbnet) [Seleccionar]
Strings.Mid(str3, 5, 4)
Puede rescribirse mejor así:
Código (vbnet) [Seleccionar]
Str3.SubString(5,4)

Dado que cada vez estás haciendo Trim, ahorrarías código si durante la asignación de la cadena ya retiras sus espacios en blanco y así no es preciso escribirlo en cada ocasión... se hace una sola vez al comienzo y listo.
Código (vbnet) [Seleccionar]

str3 = "...loque sea la asignación".Trim


Mirando por encima ese bloque de código, simplemente estás tratando de ver si hay un punto, y si no lo hay en algunos caso añades más ceros, en otros dado que el punto no tiene mayúsculas ni minúsculas, también te puedes evitar la comparación de esa forma. Como te he dicho si necesitas buscar si está en alguna posición, es mejor hacer un bucle.

  dim k as integer
   dim strx() as char = str3.ToChararray
   For k=0 to strx.Lenght -1
       if strx(k) = "." then
       
           ' .... lo que tengas que hacer.
           ' Si ya no se requiere seguir buscando Exit for , ó Return Obj2
       End if
   Next

Ahora bien, si debes hacer cosas distintas según donde esté o debiera estar el punto, entonces lo mejor es buscar directamente si existe el punto en la cadena y obtener su posición.
   
Código (vbnet) [Seleccionar]
Dim k As Integer = str3.IndexOf(".")
Si k es -1 implica que no aparece en la cadena, entonces no es necesario buscar una a una en cada posición. Y si debe aparecer en varias posiciones y hacer algo si no aparece en una en concreto, entonces lo metes en un bucle:

   
Código (vbnet) [Seleccionar]
Dim j as integer
    Dim k As Integer = str3.IndexOf(".")
    If (k>-1)then
      k+=1
      j=(k +1)
      do While str3.IndexOf(".",k)
          If (k > j) then
             ' no aparece en la posición j... hacer lo que proceda hacer.
          Else
              k+=1
              j = k
          End if
      Loop
   Else
        ' no aparece en la posición 0... hacer lo que proceda hacer.
   End if

       
8 - tampoco tiene sentido que la cadena str3, no cambia de tamaño, esté continuamente poniendo código para ver su tamaño, eso se hace de una sola vez:
   n = Str3.Length
   Si (n = 1) luego....
  y ya no hay que estar preguntando cada vez por el tamaño de la cadena.
   
9 - Los comentarios brillan por su ausencia... excelente ayuda para que te ayuden....


...en fín podría seguir enumerando "problemas con el codigo", pero cuando son tantos, el problema no es el código, si no el programador... te falta mucha base. si ni siquiera conoces los típos básicos como el String...para que´seguir con cosas más complejas.
#3193
Foro Libre / Re: Vamos a hacernos ricos, o no
11 Agosto 2017, 03:38 AM
Cuando aprenderemos a entender que la CIENCIA, no es la VERDAD.

Que la ciencia diga o deje de decir, son solo tonterías, disquisiciones entre egos... A la VERDAD, le importa 333 EGGS, lo que digan los libros, la ciencia ni los científicos, ni nadie más. La VERDAD es la que es.

La ciencia, va avanzando... pero con respecto al Universo, es nada.

Por supuesto es una herramienta que tenemos a mano, para alcanzar a conocer algo de la VERDAD...lo repito: ALCANZAR a CONOCER ALGO. Estos ignifica que cualquiera que erige a la ciencia como la verdad suprema, no está demostrando otra cosa que es un paleto egocéntrico.

La ciencia ahora niega cosas que dentro de varios siglos podrá afirmar rotndamente. Pero ahora lo niega sistemáticamente e incluso molesta o persigue a quien no lo acepta, solo porque lo ha verificado con sus propios ojos... a quién carajo le importa si puedo demostrar todo lo que veo o no?. Nadie puede demostrar todo lo que ve. Tenemos fé en que si uno dice haber ido de viaje a Francia, es verdad y si luego resulta que miente, es su problema. También hemos visto farsantes en la Ciencia y no por eso se considera farsante a todo científico.

La Ciencia tiene poco de qué presumir. Ha ido negando sistemáticamente todo, hasta que algún 'cabezón' que más sistemático se ha negado a pasar por el aro, una y otra vez, hasta que al fin ha podido demostrar que estaban equivocados. entonce sla ciencia 'tacha' lo que decía, cambia y (aquí no ha pasado nunca nada, decimos aquello de que la ciencia evoluciona y hale).

Que la Ciencia no es nadie concreto, todo el mundo lo sabe, pero que la 'Ciencia' impone criterios es incuestionable... Pocos científicos serios tienen el valor suficiente para afirmar sus creencias, por el 'miedito' que les entra que lo destierren de su puesto de trabajo (solo por una creencia). Así que menos payasadas... que esto es harto comprobable si tuvieras (hablo generícamente, nadie se sienta aludido) la edad y amigos o conocidos científicos suficientes y la confianza extrema para que te hablen de sus creencias.
#3194
Curiosamente yo siempre he pensado lo mismo.

Inicialmente lo haría en español, pero no sería tan cretino como son los angloparlantes y permitiría la flexibilidad para que pudiera cambiarse la sintaxis a (casi) cualquier idioma...

En realidad, el código ha de ser luego compilado, luego basta una fase previa desde el lenguaje foráneo x al lenguaje del diseño, y de ahí ya se compila. Obviamente las palabras clave en un idioma, se sumarían a las palabas clave por defecto, como términos prohibidos.

Sería necesario o cuando menos conveniente que en cada idioma se dispusiera de un diccionario de traducción de términos informáticos 'oficial', para no elegir cualquier palabra si no la que los nativos de tal o cual idioma designen como más propicias para la traducción correcta del inglés...

Y por qué no?. Una sintaxis particular si uno decide hacerlo así?. es solo crear un fichero de traducción de las palabras clave en origen por las que se debe remplazar en el código mientras se escribe el código (para que por ejemplo, actúe tambien el intellisense y otras partes) y luego el inverso al compilar... no sería nada complejo, solo una cuestión de voluntad.

Tras muchos años, lo que observo es que los angloparlantes lo tienen enromemente más fácil de aprender que cualquiera que hable español de forma nativa. es demasiado frecuente ver a estudiantes entre 15-25 años con un inglés pésimo y que aprenden demasiado lento, precisamente por que no entienden gran cosa de inglés. Si no tuvieran que lidiar con el idioma, sin duda su curva de aprendizaje sería mucho más fructífera... y tiempo (es cosa aparte), tendrán de aprender inglés de un modo 'adecuado'...

Tus capacidades 'mentales' no deben estar restringidas ni frenadas por un idioma (al menos no por un idioma que no es tu idiaoma nativo). Es ridículo... Imponer como primer requisito aprender inglés, deja en desventaja a todo el planeta que no habla inglés...
#3195
.NET (C#, VB.NET, ASP) / Re: Redondear Multiplos
11 Agosto 2017, 02:53 AM
Tienes varias opciones de redondeo...

La función adecuada depende de como esperes que responda, también con los números negativos.

Si Siempre ha de ser por exceso, la función es Ceiling.
Si lo que deseas es un redondeo al número más próximo, la función es Round.
Si siempre ha de ser la parte entera (eliminar los decimales), la función es Fix.
Si siempre ha de ser el valor más bajo, la función es Int, o Floor.

Aquí un ejemplo de prueba y comentado el resultado que arroja:
Código (vbnet) [Seleccionar]
Dim x as single, y as integer
       x = 15.62
       y = Int(x) ' 15
       y = Fix(x) ' 15
       y = Math.Ceiling(x) ' 16
       y = Math.Floor(x)   ' 15
       y = Math.Round(x)   ' 16

       x = 15.32
       y = Int(x) ' 15
       y = Fix(x) ' 15
       y = Math.Ceiling(x) ' 16
       y = Math.Floor(x)   ' 15
       y = Math.Round(x)   ' 15

       x = -15.62
       y = Int(x) ' -16
       y = Fix(x) ' -15
       y = Math.Ceiling(x) ' -15
       y = Math.Floor(x)   ' -16
       y = Math.Round(x)   ' -16

       x = -15.32
       y = Int(x) ' -16
       y = Fix(x) ' -15
       y = Math.Ceiling(x) ' -15
       y = Math.Floor(x)   ' -16
       y = Math.Round(x)   ' -15



p.d.: Para hacelro con un múltiplo (si mal no entendí, ya me dirás)... sería así un ejemplo:
Código (vbnet) [Seleccionar]

X = (20\(20\3)) * Math.ceiling(20/3)
(20\6) = 3
(20/3) = 6.6666 : Math.Ceiling(6.66666) = 7
x = (3 * 7) = 21
#3196
claro... perdón, lo escribí rápido...

La instrucción InStrRev, exige al menos 2 parámetros obligatorios... la cadena donde se busca, y la cadena que se quiere buscar y devuelve la posición donde se localiza. 0 si no se encontró.

Lo corrijo, aunque esperaba que cualquier error de sintaxis, fueras tu mismo capaz de arreglarlo... corrijo también la falta de los parétesis de cierre...

Código (vb) [Seleccionar]
   Dim k as integer
   
   For k = 0 to Listbox1.Listcount-1
       If (Instrrev(Listbox1.List(k), "[1]")>0) then  ' (Instrrev(Listbox1.List(k) = "[1]"
           Cuenta1 = (Cuenta1 + 1)
       Elseif Instrrev(Listbox1.List(k),"[2]")>0) then
           Cuenta2 = (Cuenta2 + 1)
       End if
   Next
   
   Msgbox "Cuenta de [1]: " & cstr(Cuenta1) & vbcrlf & _
          "Cuenta de [2]: " & cstr(cuenta2)


- Aunque estés empezando, cuando se te presenten dudas con alguna instrucción, o alguna palabra clave, llevas el puntero sobre la palabra (o la seleccionas) y usas la tecla F1, aparecerá la ayuda (si la tienes instalada), sobre dicha instrucción o palabra clave, para profundizar sobre el tema, con los detalles precisos.
- También si te canta un error puedes ir a a la ayuda para profundizar en el tema si el mensaje te resulta tan breve que no te aclara demasiado...
#3197
No existe ninguna otra manera que recorrer la lsita mediante un bucle.

Recorre la lista con un bucle,
- Si el elemento acaba en "[1]" añade 1 al contador de ese tipo...
- Si el elemento acaba en "[2]" añade 1 al contador de este otro elemento...
- Si no acaba en ninguno de estos (suponiendo que tengas también algún "[0]", no haces nada, o quizás debas también sumarlo si por ejemplo acaban en "[2]"...
Fin del bucle


...que en VB6 sería más o menos:
Código (vb) [Seleccionar]
Dim k as integer

For k = 0 to Listbox1.Listcount-1
   If (Instrrev(Listbox1.List(k) = "[1]" then
       Cuenta1 = (Cuenta1 + 1)
   Elseif Instrrev(Listbox1.List(k) = "[2]" then
       Cuenta2 = (Cuenta2 + 1)
   End if
Next

Msgbox "Cuenta de [1]: " & cstr(Cuenta1) & vbcrlf & _
      "Cuenta de [2]: " & cstr(cuenta2)


Ahora, coincido con Elektro, cuandio te reclama:
CitarLa funcionalidad de un ListBox es representar un único elemento (por cada ítem), sin embargo tú estás intentando representar dos cosas distintas al mismo tiempo: elemento y cantidad/número, por lo tanto deberías utilizar otro control más apropiado
#3198
Precisamente poner ceros, para indicar presencia, es un error... el '0' debe inbdicar 'ausencia, esto es 'AGUA', y cualquier otro valor 'un objeto' (incluso tierra)

Si tienes un submarino, por ejemplo desde D5 hasta D9, pués (también por ejemplo) pones D5=6, D6=6, D7=6, D8=6, D9=6, así los submarinos (internamente) los reconoces por el valor 6, las fragatas con 2, un portaviones con 7, un destructor con 5, etc....
Ejemplo de un mapa:


   0 1 2 3 4 5 6 7 8 9
  -----------------------
A | 0 0 0 0 0 0 0 0 2 0
B | 0 0 0 0 0 0 0 0 2 0
C | 7 5 5 5 5 5 0 0 0 0
D | 7 0 0 0 6 6 6 6 6 6 <--- aquí el submarino (pero hay más barcos en el mapa)
E | 7 0 0 2 2 2 2 0 0 0
F | 7 0 3 3 3 3 0 0 0 0
G | 7 0 3 0 0 4 0 0 0 0
H | 7 0 3 0 0 4 0 0 0 0
I | 7 0 0 0 0 4 0 0 0 2
J | 7 0 0 0 0 4 3 3 3 2


Por último fíjate que el valor númérico al mismo tiempo indica el 'tamaño' del barco. Si ocupa 2  casillas d elargo, el valor será 2, si ocupa 4 de largo, usará el valor 4. Esto es útil para distinguir por ejemplo, dos buques de 2 casillas con respecto a uno de 4, o dos de 3 con respecto de 1 de 6 (o 3 de dos). Incluso haciendo esquina uno de 3 con otro de 3, podría parecer (al adversdario) que se trata de uno de 2 y uno de 4)...

Si un mapa fuera tan gigante como 300 casillas, podría no ser necesariamente cuadrado (rectángular), y podrías rellenar como 'tierra' con valor 9.... Así el mapa de 'agua' de cada jugador tendría una forma irregular (incluso islotes). Basta acordar la misma cantidad de casillas 'tierra'.
#3199
Este "Boom" de las monedas digitales, me recuerda aquel "Boom2 al pie dle siglo XX de las ".com" ...nade, se crea la burbuja, se infla, se infla... muchos se forran por el camino, y cuando revienta, los más torpones pagan los platos...

Es indudable que tantas monedas no podrán coexistir de modo indefinido...
#3200
Bufff... el formulario tiene unas 16.400 líneas de código... Eso es casi 1Mb. Pero es que además el código es completamente espagueti... Desisto de perder tiempo revisándolo.

Si te diré al menos, que cuando tengas que eliminar varios ítems, recórrelo siempre desde el final hacia atrás... si tienes que eliminar el íitem 25 y el 144, si eliminas primero el 25, el 144 ocupará luego la posición 143... si eliminas primeor el 144 (que ocupa esa posición), podrás luego perfectamente eliminar el 25 (que también sigue estando en su posición)...
Se llega al caso de qu si hay 150 elementos y hay que eliminar 10, si empiezas desde abajo, cuando vayas a eliminar el 144, ya ni siquiera existe el ítem 144. Mientras exista un ítem, no hacerlo bien implica eliminar uno erróneo y dejar (posiblemente) que debiera habers eeliminado (depende de si están contiguos, salteados, etc...).
Así tatar de eliminar un ítem inexistente arroja errores.

No obstante como además lo tienes conectado a una base de datos, puede que el error te lo esté dando por allí, antes de actualizar la vista.

En fin elimina los ítems deseados empezando desde el último y avanzando hacia atrás... y a ver si te sigue generando el error.

Desde luego bucear en ese código, como se dice a veces "ni cobrando"... Crea clases , encapsula métodos en ellas y pásalas a otros módulos... No dejes todo el peso en un único formulario... Verlo es como entrar en una ciudad por donde pasó un sunami, solo se ve CAOS  :silbar: :silbar: :silbar: