Migracion

De GrialWIKI

(Diferencias entre revisiones)
(El evento opt_Servicio.CheckedChanged se puede disparar cuando se inicializa el formulario)
(Eventos CheckedChanged se disparan antes de cargar el MainForm)
Línea 217: Línea 217:
End Sub
End Sub
</code>
</code>
-
 
-
==Eventos CheckedChanged se disparan antes de cargar el MainForm==
 

Revisión de 15:38 7 sep 2010

Contenido

Notas para la Conversión de VB6 a VB.NET

Gosub/Return

"Gosub" no esta soportado en VB.NET

Para convertir, por ejemplo un "Sub CorteControl" que utilice internamente rutinas con "Gosub" hacer lo siguiente:

  1. Crear una Private Class CorteControl_Class (interna, dentro de la clase actual)
  2. Colocar las variables generales del "Sub CorteControl" como variables privadas de la "Private Class CorteControl_Class"
  3. Agregar una propiedad "Dim Host As MainForm" al principio de la nueva clase
  4. Crear un "Sub Proc()" dentro de la clase y colocar el codigo del "Sub CorteControl"
  5. Crear un Sub por cada rutina de gosub que existia en el "Sub CorteControl" original
    1. Por Ejemplo si decia "Gosub Rutina1", crear un "Sub Rutina1" dentro de la clase
  6. Reemplazar los Gosub, por llamadas a los sub (eliminar la palabra gosub directamente)
  7. El "Sub CorteControl" original que se reemplaza debe quedar:
    1. Sub CorteControl()
    2. Dim a as New CorteControl_Class()
    3. a.Host = Me
    4. a.Proc()
    5. End Sub

Debido a que "CorteControl_Class" pasará a ser una "clase", no tiene acceso directo a las variables del formulario principal (MainForm). Es por eso que se crea la variable "Host as MainForm" y se asigna (a.Host = Me) antes de llamar al método "Proc"

Dentro de los subs de la clase, se debe colocar "Host." para acceder a las variables generales del Form. Para identificar dónde agrear "Host." revisar el codigo de los subs dentro de la clase buscando el siguiente error informado por el IDE de .NET: "Error 10: La referencia a un miembro no compartido requiere una referencia de objeto." Este error se soluciona agregando "Host." delante de la variable.

Ejemplo

Por ejemplo, el siguiente codigo en VB6:

    Private Sub GrialPrintOREC_gpr_PrintDocument()
 
        On Error GoTo ErrH
 
        Dim text_Renamed As String
        Dim CantidadEntregas As Short
        Dim CantidadDestinos As Short
        Dim ArticuloCorte As String
        Dim DetalleArticulo As String
 
        With GrialPrintOREC_gpr
 
            Preejec18Grq.Rst.Sort = "NumRenglon"
            Preejec18Grq.MovePreStart()
            While Preejec18Grq.NextRecord
 
                    'ubico a ver si ese renglon de la gestion esta en este compromiso
                    If GrialPrintOREC_gpr.UserCancel Then Exit Sub
                    If GrillaPe21Grq.Find("RELA_PREEJEC18=" & Preejec18Grq.Rst!ID_PREEJEC18) Then
 
                        If ProveedorCorte <> GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD Then
                            Gosub CierraProveedor()
                            Gosub AbreProveedor()
                        End If
                        ArticuloCorte = GrillaPe21Grq.Rst!PREFORM15_CODIGO
             End While
 
            Gosub CierraProveedor()
 
            .Printer_Advance(2)
            .Wt(.PrintPos_LeftMargin, encabe, 10000, Print.Align.Left_WordWrap)
            .Printer_Advance()
 
        End With
 
        Exit Sub
 
AbreProveedor:
        ProveedorCorte = GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD
        Return
 
CierraProveedor:
 
        If ProveedorCorte <> "" Then
            'Imprimo footer del Proveedor
            With GrialPrintOREC_gpr
                .WtCol("Cantidad", "Total: ")
                .WtCol("Total", VB6.Format(TotalAdjudicado, "Currency"))
            End With
 
        End If
 
        TotalAdjudicado = 0
 
        Return
 
 
ErrH:
        MsgError(GrialCont)
        eventArgs.Cancel = True
 
    End Sub

Debe quedar convertido para VB.NET en:

    Private Sub GrialPrintOREC_gpr_PrintDocument()
      On Error GoTo ErrH
      Dim a as New GrialPrintOREC_gpr_PrintDocument_Class
      a.Host = Me
      a.Proc()
      Exit Sub
    ErrH:
      MsgError(GrialCont)
    End Sub
 
    Private Class GrialPrintOREC_gpr_PrintDocument_Class
 
        Public Host as MainForm
 
        Dim text_Renamed As String
        Dim CantidadEntregas As Short
        Dim CantidadDestinos As Short
        Dim ArticuloCorte As String
        Dim DetalleArticulo As String
 
     Sub Proc()
 
        With Host.GrialPrintOREC_gpr
 
            Host.Preejec18Grq.Rst.Sort = "NumRenglon"
            Host.Preejec18Grq.MovePreStart()
            While Host.Preejec18Grq.NextRecord
 
                    'ubico a ver si ese renglon de la gestion esta en este compromiso
                    If Host.GrialPrintOREC_gpr.UserCancel Then Exit Sub
                    If Host.GrillaPe21Grq.Find("RELA_PREEJEC18=" & Preejec18Grq.Rst!ID_PREEJEC18) Then
 
                        If ProveedorCorte <> GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD Then
                            CierraProveedor()
                            AbreProveedor()
                        End If
                        ArticuloCorte = GrillaPe21Grq.Rst!PREFORM15_CODIGO
             End While
 
             CierraProveedor()
 
            .Printer_Advance(2)
            .Wt(.PrintPos_LeftMargin, encabe, 10000, Print.Align.Left_WordWrap)
            .Printer_Advance()
 
        End With
 
     End Sub
 
     Sub AbreProveedor()
        ProveedorCorte = GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD
     End Sub 'Return
 
     Sub CierraProveedor()
 
        If ProveedorCorte <> "" Then
            'Imprimo footer del Proveedor
            With Host.GrialPrintOREC_gpr
                .WtCol("Cantidad", "Total: ")
                .WtCol("Total", VB6.Format(TotalAdjudicado, "Currency"))
                .Printer_Advance()
            End With
 
        End If
 
        Host.TotalAdjudicado = 0
 
        End Sub 'Return
 
    End Class

El evento "CheckedChanged" se puede disparar cuando se inicializa el formulario

Lamentablemente el .NET dispara el evento "Changed" de un checkbox o un OptionButton cuando esta haciendo el New del objeto, es decir, mientras se inicializan los controles del Form, e incluso el objeto ni siquiera esta adjunto al Form.

En dichos eventos hay que evitar procesar si el Form aun no está cargado. Hay que ubicar las lineas del tipo:

Private Sub MultiBenefChk_CheckStateChanged(
   ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) 
     Handles MultiBenefChk.CheckStateChanged

Que seria:

Private Sub *_CheckStateChanged(
    ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) 
      Handles *.CheckStateChanged

y en la primer linea de ese sub, agregar:

If Not Created Then Exit Sub

"Created" es una propiedad del Form que esta en False antes de que se muestre el form.

Quedaria por Ejemplo:

Private Sub MultiBenefChk_CheckStateChanged(
   ByVal eventSender As System.Object
  , ByVal eventArgs As System.EventArgs) 
    Handles  MultiBenefChk.CheckStateChanged
 
        If Not Created Then Exit Sub
        OcultarMostrar_Segun_MultiBenef()
 
End Sub
Herramientas personales