none
VB6 to VB.NET Upgrade Tool RRS feed

  • Frage

  • Hallo,

    ich habe gerade gesehen das das Upgrade Tool folgenden Code erzeugt hat:

    butOK_MouseClick(ByVal eventSender As Object, ByVal eventSender As EventArgs) Handles butOK.MouseClick

    Werden die Argumente in VB.Net normalerweise nicht ByRef and den Handler übergeben?

    P.S. ich nehme an in VB6 war es anders?



    Samstag, 7. Dezember 2019 15:12

Antworten

  • Hi Matthias,
    in VB.NET ist das so. Wenn eine Form unsichtbar ist, sind auch alle Innereien unsichtbar. Im Moment, wo die Sichtbarkeit wieder hergestellt wird (Show) wird außerdem auch das Ereignis "VisibleChanged" ausgelöst. Hier mal eine kleine Demo:

    Public Class Form1
    
      Private WithEvents btn1 As New Button With {.Text = "Show Form", .Dock = DockStyle.Top, .Margin = New Padding(5)}
      Private WithEvents btn2 As New Button With {.Text = "Switch Visibility", .Dock = DockStyle.Top, .Margin = New Padding(5)}
      Private lb1 As New ListBox With {.Dock = DockStyle.Fill, .Margin = New Padding(5)}
      Private Sub Form55_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.AddRange(New Control() {lb1, btn2, btn1})
      End Sub
    
      Private frm As Form
      Private WithEvents frmLabel As Label
      Private col As New List(Of String)
    
      Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
        If frm Is Nothing Then
          frm = New Form
          frmLabel = New Label With {.Text = "frm Label", .Dock = DockStyle.Top}
          frm.Controls.Add(frmLabel)
          ShowResult($"before Show: Visibility of frmLabel: {frmLabel.Visible}")
          lb1.DataSource = col
        End If
        frm.Show()
        ShowResult($"after Show: Visibility of frmLabel: {frmLabel.Visible}")
      End Sub
    
      Private Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If frm Is Nothing Then Exit Sub
        frm.Visible = Not frm.Visible
        ShowResult($"after changing Visible of Form: Visibility of frmLabel: {frmLabel.Visible}")
      End Sub
    
      Private Sub frmLabel_VisibleChanged(sender As Object, e As EventArgs) Handles frmLabel.VisibleChanged
        ShowResult($"Event VisibleChanged: Visibility= {CType(sender, Label).Visible}")
      End Sub
    
      Private Sub ShowResult(msg As String)
        col.Insert(0, $"{Now:hh:mm:ss.fff} {msg}")
        lb1.DataSource = Nothing
        lb1.DataSource = col
      End Sub
    
    End Class

    Unklar ist, warum Dich dieses Verhalten stört.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 19. Dezember 2019 06:20
  • Hi,

    doch, das funktioniert problemlos. Die Erklärung steckt in den beiden Links, die ich dir gepostet hatte. Bitte mal lesen, dann sollte klar sein, warum das geht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 16. Dezember 2019 17:27
    Moderator
  • nur dehalb weil ich meinen Code umschreiben muss :-)

    Wieso?

    Letztendlich werden die Controls zwar automatisch ebenfalls auf Visible = False gesetzt (was ich persönlich zwar auch für unnötig und schlechten Stil halte) aber nur die, die vorher auch Visible = True hatten, werden bei Show bzw. <Form>.Visible = True auch wieder zurückgesetzt.

    Control1.Visible = False
    Control2.Visible = True
    
    Form.Visible = False
    => Control1.Visible = False
    => Control2.Visible = False
    
    Form.Visible = True
    => Control1.Visible = False
    => Control2.Visible = True
    
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 19. Dezember 2019 13:12
    Moderator
  • Hi Matthias,
    Du solltest sowieso ein Umschreiben des Codes in Betracht ziehen. Ich vermute mal, dass Du die Visible-Eigenschaft für die Programmsteuerung genutzt hast. Einen anderen Grund kann ich mir nicht vorstellen. Das wäre ein ganz schlechter Stil, der sowieso ausgemerzt werden sollte. Ansonsten reicht das Ereignis Control.VisibleChanged zur ggf. erforderlichen Aktualisierung von anzuzeigenden Daten. Und das wird auch beim Setzen des äußeren Comtainer auf Visible=True ausgelöst.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 19. Dezember 2019 13:37

Alle Antworten

  • Hallo Matthias,

    Werden die Argumente in VB.Net normalerweise nicht ByRef and den Handler übergeben?

    Nöp.

    Bzgl. ByRef und ByVal evtl. auch das hier lesen:

      Übergeben von Argumenten als Wert und als Verweis (Visual Basic)

      Unterschiede zwischen dem Übergeben von Argumenten als Wert und als Verweis (Visual Basic)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 7. Dezember 2019 18:41
    Moderator
  • Hallo,

    ich kann dann doch zB im FormClosing Handler den Wert e.Cancel auf true setzen.

    Mit ByVal würde das doch nicht funktionieren oder?

    Montag, 16. Dezember 2019 15:21
  • Hi,

    doch, das funktioniert problemlos. Die Erklärung steckt in den beiden Links, die ich dir gepostet hatte. Bitte mal lesen, dann sollte klar sein, warum das geht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 16. Dezember 2019 17:27
    Moderator
  • Hallo,

    ich habe gerade festgestellt das in VB.NET ein LABEL auf einem Windows FORM seine Eigenschaft VISIBLE von TRUE "automatisch" auf FALSE ändert wenn ich FORM.VISIBLE auf FALSE setze.

    "Stimmt" das so?

    In VB6 war das nicht so.

    Kann ich das Verhalten so konfigurieren das es wieder dem in VB6 entspricht?

    Mittwoch, 18. Dezember 2019 17:56
  • Hi Matthias,
    in VB.NET ist das so. Wenn eine Form unsichtbar ist, sind auch alle Innereien unsichtbar. Im Moment, wo die Sichtbarkeit wieder hergestellt wird (Show) wird außerdem auch das Ereignis "VisibleChanged" ausgelöst. Hier mal eine kleine Demo:

    Public Class Form1
    
      Private WithEvents btn1 As New Button With {.Text = "Show Form", .Dock = DockStyle.Top, .Margin = New Padding(5)}
      Private WithEvents btn2 As New Button With {.Text = "Switch Visibility", .Dock = DockStyle.Top, .Margin = New Padding(5)}
      Private lb1 As New ListBox With {.Dock = DockStyle.Fill, .Margin = New Padding(5)}
      Private Sub Form55_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.AddRange(New Control() {lb1, btn2, btn1})
      End Sub
    
      Private frm As Form
      Private WithEvents frmLabel As Label
      Private col As New List(Of String)
    
      Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
        If frm Is Nothing Then
          frm = New Form
          frmLabel = New Label With {.Text = "frm Label", .Dock = DockStyle.Top}
          frm.Controls.Add(frmLabel)
          ShowResult($"before Show: Visibility of frmLabel: {frmLabel.Visible}")
          lb1.DataSource = col
        End If
        frm.Show()
        ShowResult($"after Show: Visibility of frmLabel: {frmLabel.Visible}")
      End Sub
    
      Private Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If frm Is Nothing Then Exit Sub
        frm.Visible = Not frm.Visible
        ShowResult($"after changing Visible of Form: Visibility of frmLabel: {frmLabel.Visible}")
      End Sub
    
      Private Sub frmLabel_VisibleChanged(sender As Object, e As EventArgs) Handles frmLabel.VisibleChanged
        ShowResult($"Event VisibleChanged: Visibility= {CType(sender, Label).Visible}")
      End Sub
    
      Private Sub ShowResult(msg As String)
        col.Insert(0, $"{Now:hh:mm:ss.fff} {msg}")
        lb1.DataSource = Nothing
        lb1.DataSource = col
      End Sub
    
    End Class

    Unklar ist, warum Dich dieses Verhalten stört.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 19. Dezember 2019 06:20
  • nur dehalb weil ich meinen Code umschreiben muss :-)
    Donnerstag, 19. Dezember 2019 13:03
  • nur dehalb weil ich meinen Code umschreiben muss :-)

    Wieso?

    Letztendlich werden die Controls zwar automatisch ebenfalls auf Visible = False gesetzt (was ich persönlich zwar auch für unnötig und schlechten Stil halte) aber nur die, die vorher auch Visible = True hatten, werden bei Show bzw. <Form>.Visible = True auch wieder zurückgesetzt.

    Control1.Visible = False
    Control2.Visible = True
    
    Form.Visible = False
    => Control1.Visible = False
    => Control2.Visible = False
    
    Form.Visible = True
    => Control1.Visible = False
    => Control2.Visible = True
    
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 19. Dezember 2019 13:12
    Moderator
  • Hi Matthias,
    Du solltest sowieso ein Umschreiben des Codes in Betracht ziehen. Ich vermute mal, dass Du die Visible-Eigenschaft für die Programmsteuerung genutzt hast. Einen anderen Grund kann ich mir nicht vorstellen. Das wäre ein ganz schlechter Stil, der sowieso ausgemerzt werden sollte. Ansonsten reicht das Ereignis Control.VisibleChanged zur ggf. erforderlichen Aktualisierung von anzuzeigenden Daten. Und das wird auch beim Setzen des äußeren Comtainer auf Visible=True ausgelöst.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 19. Dezember 2019 13:37