Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/08/2008, 13:13
Avatar de Txoco
Txoco
 
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: código que no funciona para mostrar imégenes

Hola!

Peazo código!

Le he echado un ojo y mejor que buscar dónde falla, te voy a dar algunos consejillos que van a hacer que rutinas tan complejas sean más legibles y eficaces, y te resulte más fácil encontrar este tipo de errores:

- En primer lugar, no utilices la propiedad Text de los ComboBoxes para comprobar nada. Imagina que pasado mañana en lugar de "Carga Uniforme" tienes que poner otra cosa (o traducirlo a otro idioma)... ya tendrías que cambiar mucho código. Probablemente incluso tu problema esté ahí. En su lugar, utiliza la propiedad ItemData: en las Combos y en las ListBoxes, hay tantos elementos en ItemData (es un array) como haya en List, de hecho, puedes también introducirlos en tiempo de diseño, pero si quieres llenarlas por código es algo así:

Código:
   With Combo1
        Call .AddItem("Carga uniforme")
        .ItemData(.NewIndex) = 0
        Call .AddItem("Carga puntual")
        .ItemData(.NewIndex) = 1
        .... ' ad infinitum =]
    End With
De esta forma, comprobar qué valor hay es tan sencillo como:

Código:
    If Combo1.ItemData(Combo1.ListIndex) = 0 Then...
Puedes hacerlo aún más legible definiendo constantes o enumeraciones para los distintos valores. De hecho, te recomendaría que te acostumbraras a ello . Por ejemplo, para tu caso:

Código:
Public Enum TipoCargaConst
    TC_Vacio = 0
    TC_SinCarga = 1
    TC_Uniforme = 2
    TC_Puntual = 4     ' Progresión geométrica, estaba pensando en hacer otro truco, pero para el caso actual, da igual los valores que pongas aquí =]
End Enum

Private Sub Form_Load()
    With Combo1
        .Clear
        Call .AddItem("-")
        .ItemData(.NewIndex) = TC_Vacio
        Call .AddItem("Sin Carga")
        .ItemData(.NewIndex) = TC_SinCarga
        Call .AddItem("Carga uniforme")
        .ItemData(.NewIndex) = TC_Uniforme
        Call .AddItem("Carga puntual")
        .ItemData(.NewIndex) = TC_Puntual
       
        .ListIndex = 0
    End With
End Sub
Y para comprobar lo que quieras, lo harías así (se ve la diferencia, verdad? ):
Código:
    If Combo1.ItemData(Combo1.ListIndex) = TC_Uniforme Then ...
Y si un día tienes que cambiar la descripción, la cambias una única vez y en un único sitio.

- Cuando tengas que hacer comprobaciones encadenadas, utiliza la estructura Select Case... End Select. Te reescribo el principio de tu función para que te hagas una idea de cómo quedaría:

Código:
Private Sub codigomomentosvano2()
'A PARTIR DE AQUÍ SON LAS IMÁGENES DE LOS MOMENTOS
Dim i As Integer
Dim m As Integer

    For i = 0 To 27
        picture72(i).Visible = False
    Next
    For m = 0 To 6
        picture81(m).Visible = False
    Next

    'CASO PRIMERO
    If Combo1.Text = 2 And Check2.Value = 0 Then
        'CASO 1º A
        Select Case combo3.ItemData(combo3.ListIndex)
            Case TC_Uniforme:   ' Valor en Combo3
                Select Case combo7.ItemData(combo7.ListIndex)
                    Case TC_Vacio, TC_SinCarga, TC_Uniforme: ' Cualquiera de los tres vale para este caso
                        If combo11.ItemData(combo11.ListIndex) = TC_Vacio Or combo11.ItemData(combo11.ListIndex) = TC_SinCarga Then
                            picture72(2).Visible = True
                            picture81(0).Visible = True
                        End If
                    Case TC_Puntual:
                        If combo11.ItemData(combo11.ListIndex) = TC_Vacio Or combo11.ItemData(combo11.ListIndex) = TC_SinCarga Then
                            If Val(Form8.Text1) = 0 Or Val(Form8.Text1) = Val(Form2.Text2) Then
                                picture72(2).Visible = True
                                picture81(0).Visible = True
                            ElseIf Val(Form8.Text1) < ((Val(Form2.Text2)) / 2) And Val(Form8.Text1) > 0 Then
                                picture72(22).Visible = True
                                picture81(5).Visible = True
                            ElseIf Val(Form8.Text1) = ((Val(Form2.Text2)) / 2) Then
                                picture72(18).Visible = True
                                picture81(4).Visible = True
                            ElseIf Val(Form8.Text1) > ((Val(Form2.Text2)) / 2) And Val(Form8.Text1) < Val(Form2.Text2) Then
                                picture72(26).Visible = True
                                picture81(6).Visible = True
                            End If
                End Select
            Case TC_Puntual:    ' Valor en combo3
                Select Case combo7.ItemData(combo7.ListIndex)
                    case ...
                End Select
            case ...
        End Select
    End If
End Sub
La función sería mucho mas larga porque el propio algoritmo requiere muchas comprobaciones, pero fíjate que ya parece más fácil de seguir, ¿verdad?

Observa que he utilizado también la estructura If... ElseIf ... End If. Es similar a Select Case ... End Select, pero legible a su manera. La idea detrás de esto es que si el programa comprueba una de las opciones y es verdadera, las demás no se van a ejecutar, así que sobra comprobarlas.

- Acostúmbrate también a dar un nombre descriptivo a los controles. "picMomento" es más fácil de seguir que "Picture1"... a mí también me da pereza a veces, no te creas, pero a la larga se acaba agradeciendo

- Y como truquillos, define las variables para contadores y esas cosas como Long, no como Integer. Long utiliza 32 bits, mientras que Integer sólo usa 16: los sistemas Windows 2000 y superiores están optimizados para trabajar con Longs y el código puede acelerarse si los utilizas intensivamente.

Espero no haberte apabullado mucho con todo esto, pero he deducido del código que tú vales para esto, así que ¡ánimo!, y si tienes cualquier duda, pregunta sin miedo
__________________
wile sona li mute e sona