none
Control in einer Klasse variabel referenzieren RRS feed

  • Frage

  • Hallo

    Ich bin noch ziemlich neu bei VB...

    Ziel ist eine Klasse, in welcher ich in einer beliebigen Form eine ProgressBar steuern kann. Das Ganze soll Frei von vordefinierten Feldnamen sein, damit ich die Klasse auch in anderen Projekten einfügen kann.

    In Access würde ich es etwa so machen (Luftcode und es soll nur zur Anschauung dienen):

    Klasse ControlProgressBar:

    Private pctl as Control

    Sub Start(ControlObjekt as Control, Weitere Parameter...)
    Set pctl = ControlObjekt
    End Sub

    Sub UpdateProgressBar(bytNewValue as byte)
    pctl.Value = bytNewValue
    End Sub

    In der Form:

    Private ClassBar As ControlProgressBar

    Irgendwo dann:

    Set ClassBar = New ControlProgressBar
    ClassBar.Start Me.MeineProgressBar.Control

    Mein Problem jetzt: Ich weiss nicht wie ich in VB in der Klasse ControlProgressBar den Verweis auf ein Control einer Form mache (und an die Klasse übergebe), dessen Name oder Referenz in jedem Projekt unterschiedlich sein kann und ich beim Aufruf der Klasse erst übergeben möchte.

    Ich entschuldige mich jetzt schon, falls ich es zu wenig oder zu wenig verständlich erklärt habe.


    Danke und Gruss Thomas

    Donnerstag, 9. März 2017 13:56

Antworten

  • Hi,

    evtl. versteh ich dich auch falsch aber ich denke, Du wählst den verkehrten Weg.

    Erstell doch einfach ein eigenes Control mit Eigenschaften, Methoden und Ereignissen. Das kann man dann in eine beliebige Form einbauen. D.h. letztendlich steuert sich das Control dann selbst.

      https://code.msdn.microsoft.com/windowsdesktop/Custom-Colored-ProgressBar-a68b61de

      https://emoacht.wordpress.com/2011/10/16/color-customizable-progressbar-for-visual-style/


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Alphawolfi Freitag, 10. März 2017 11:24
    Donnerstag, 9. März 2017 16:06
    Moderator
  • Hi Thomas,
    hier mal ein Beispiel, wo die Farbe der ProgressBar vom Wert abhängt. Kopiere einfach den Code in eine leere Form.

    Imports System.Threading
    
    Public Class Form1
    
      Private pb As New ControlProgressBar With {.Dock = DockStyle.Bottom}
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(pb)
        Call (New Thread(New ThreadStart(AddressOf Demo))).Start()
      End Sub
    
      Private Delegate Sub del(par As Byte)
      Private Sub Demo()
        For i As Byte = 0 To 254
          pb.Invoke(New del(AddressOf pb.UpdateProgressBar), i)
          Threading.Thread.Sleep(100)
        Next
      End Sub
      Public Class ControlProgressBar
        Inherits ProgressBar
    
        Public Sub New()
          Me.SetStyle(ControlStyles.UserPaint, True)
          Me.Minimum = 0
          Me.Maximum = 255
        End Sub
    
        Public Property Level1 As Byte = 100
        Public Property Level2 As Byte = 200
        Private Property BarColor As Color = Color.Gray
        Private Property BarBrush As Brush = New SolidBrush(BarColor)
    
        Sub UpdateProgressBar(bytNewValue As Byte)
          Me.Value = bytNewValue
          Select Case Me.Value
            Case < Level1
              If BarColor <> Color.Green Then
                Me.BarColor = Color.Green
                BarBrush = Brushes.Green
              End If
            Case < Level2
              If BarColor <> Color.Yellow Then
                Me.BarColor = Color.Yellow
                BarBrush = Brushes.Yellow
              End If
            Case Else
              If BarColor <> Color.Red Then
                Me.BarColor = Color.Red
                BarBrush = Brushes.Red
              End If
          End Select
        End Sub
    
        Protected Overrides Sub OnPaint(e As PaintEventArgs)
          Dim rec = e.ClipRectangle
          rec.Width = CType(rec.Width * (CType(Me.Value, Double) / Me.Maximum), Integer) - 4
          If ProgressBarRenderer.IsSupported Then ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle)
          rec.Height = rec.Height - 4
          e.Graphics.FillRectangle(BarBrush, 2, 2, rec.Width, rec.Height)
        End Sub
    
      End Class
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Alphawolfi Freitag, 10. März 2017 11:30
    Freitag, 10. März 2017 10:43

Alle Antworten

  • Hi Thomas,
    da jedes Steuerelement anders aufgebaut ist, ist solch eine Klasse nur sinnvoll für Eigenschaften, die die möglicherweise geplanten Steuerelemente gemeinsam haben. Da sie alle von einer Basisklasse abgeleitet sind, kann man die Eigenschaften der Basisklasse verwenden. Übergeben (z.B. im Konstruktor) wird dann ein Typ der Basisklasse.

    Ich würde jedoch anders herum herangehen. Es wird ein UserControl erstellte, was dann im Innern eine Funktion kapselt, z.B. ein ProgressBar. Nach außen werden nur die Eigenschaften gereicht, die im Programm benötigt werden. Im Programm selbst werden Instanzen des UserControls genutzt.

    Falls ich Dich falsch verstanden haben, erläutere mal etwas genauer, was Du wünschst.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 9. März 2017 14:16
  • Hallo Peter

    Erstmal Danke Für Deine Antwort.

    Die Klasse, die ich erstellen will, ist und bleibt zur Steuerung einer ProgressBar. Ich möchte dann noch Farbe und weiteres anpassen können. Das aber erst in einem nächsten Schritt.

    Momentan geht es mir darum, wie ich das ProgressBar-Control an die Klasse übergebe und dort zur Steuerung nutzen kann.

    Ich möchte dann vom der Form aus, von welcher aus ich die Klasse instanziere, mittels einer Anweisung eine Aktion für die ProgressBar ausführen.

    z.B. in der Form:

    ProgressBarSteuerungsKlasse.Value = 20

    Dann soll sich der Wert der ProgressBar in der Form auf 20 ändern und ev. weiteres noch machen (z.B. einen Text anzeigen, die Farbe ändern oder weiteres)


    Danke und Gruss Thomas

    Donnerstag, 9. März 2017 15:51
  • Hi Thomas,
    genau in solchen Fall sollte ein UserControl gebaut werden, was von der ProgrssBar erbt. Ein Beispiel dazu kann ich erst morgen posten.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 9. März 2017 16:02
  • Hi,

    evtl. versteh ich dich auch falsch aber ich denke, Du wählst den verkehrten Weg.

    Erstell doch einfach ein eigenes Control mit Eigenschaften, Methoden und Ereignissen. Das kann man dann in eine beliebige Form einbauen. D.h. letztendlich steuert sich das Control dann selbst.

      https://code.msdn.microsoft.com/windowsdesktop/Custom-Colored-ProgressBar-a68b61de

      https://emoacht.wordpress.com/2011/10/16/color-customizable-progressbar-for-visual-style/


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Alphawolfi Freitag, 10. März 2017 11:24
    Donnerstag, 9. März 2017 16:06
    Moderator
  • Hi Thomas,
    hier mal ein Beispiel, wo die Farbe der ProgressBar vom Wert abhängt. Kopiere einfach den Code in eine leere Form.

    Imports System.Threading
    
    Public Class Form1
    
      Private pb As New ControlProgressBar With {.Dock = DockStyle.Bottom}
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(pb)
        Call (New Thread(New ThreadStart(AddressOf Demo))).Start()
      End Sub
    
      Private Delegate Sub del(par As Byte)
      Private Sub Demo()
        For i As Byte = 0 To 254
          pb.Invoke(New del(AddressOf pb.UpdateProgressBar), i)
          Threading.Thread.Sleep(100)
        Next
      End Sub
      Public Class ControlProgressBar
        Inherits ProgressBar
    
        Public Sub New()
          Me.SetStyle(ControlStyles.UserPaint, True)
          Me.Minimum = 0
          Me.Maximum = 255
        End Sub
    
        Public Property Level1 As Byte = 100
        Public Property Level2 As Byte = 200
        Private Property BarColor As Color = Color.Gray
        Private Property BarBrush As Brush = New SolidBrush(BarColor)
    
        Sub UpdateProgressBar(bytNewValue As Byte)
          Me.Value = bytNewValue
          Select Case Me.Value
            Case < Level1
              If BarColor <> Color.Green Then
                Me.BarColor = Color.Green
                BarBrush = Brushes.Green
              End If
            Case < Level2
              If BarColor <> Color.Yellow Then
                Me.BarColor = Color.Yellow
                BarBrush = Brushes.Yellow
              End If
            Case Else
              If BarColor <> Color.Red Then
                Me.BarColor = Color.Red
                BarBrush = Brushes.Red
              End If
          End Select
        End Sub
    
        Protected Overrides Sub OnPaint(e As PaintEventArgs)
          Dim rec = e.ClipRectangle
          rec.Width = CType(rec.Width * (CType(Me.Value, Double) / Me.Maximum), Integer) - 4
          If ProgressBarRenderer.IsSupported Then ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle)
          rec.Height = rec.Height - 4
          e.Graphics.FillRectangle(BarBrush, 2, 2, rec.Width, rec.Height)
        End Sub
    
      End Class
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Alphawolfi Freitag, 10. März 2017 11:30
    Freitag, 10. März 2017 10:43
  • Hi Stefan

    Danke für die Links. Damit komme ich weiter.


    Danke und Gruss Thomas

    Freitag, 10. März 2017 11:24
  • Hallo Peter

    Herzlichen Dank für Deinen Code. Das ist super und reicht mir eigentlich für mein Vorhaben.


    Danke und Gruss Thomas

    Freitag, 10. März 2017 11:32