Declaración duplicada del miembro Size y Point.

Iniciado por zalazar16, 11 Agosto 2017, 12:19 PM

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

zalazar16

Este error viene generandose de una aplicación que alguien lo adujo de C# a VB.NET, con un supuesto programa en vz de traducirlo manualmente y el código C# original se perdió y quedó el revoltillo de VBNET... Sé, que ya el amigo Elektro, muy maravillosa su ayuda y excelente usuario, me ayudó con e programa anterior, he tratado de corregir ese error pero no he podido, me sigue lanzando esa misma fila de hileras de error.


Si hay alguien en el grupo que me pueda ayudar o cualquier cosa que pueda aportar, bienvenido sea, y a quien interese aqui está el link del CodeFonte que lanza los errores  :)

http://www.mediafire.com/file/1bl0l4c5xc2nn0t/LOTER%C3%8DA+MONTOS+ALTOS.zip

Serapis

#1
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.

zalazar16

Es que el código fuente y en la forma que se programó la aplicación.... Da asco sinceramente, la aplicación no la programé yo, pero me pidieron que modificara algo, es un fastidio, en ves de Formularios, un solo formulario para todo y groupboxs como si fueran ventas, por lo menos e el otro el amigo Elektro pudo quitar el error de size y point, y pudo correr bien el programa, es que en todos lados dice dim size as new size
uno debajo del otro, al igual que en point....... No sé exactament que hizo, pero comparando le agrego una letra a cada componente y suprimío las posiciones, aunque también es raro que las declaraciones size y point den valores hexadecimales.... creo que este programa fue hcho en otro lenguaje, entorno a visual studio pero no VBNET, y tradujeron todo a las patadas..... Muchas gracias or tu ayuda. y sí es un tremendo spaguetti, demasiadas lineas de código innecesario, creo que hay más codigo basura que lo que ncesita la app :rolleyes:

Serapis

#3
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).