Benutzer mit den meisten Antworten
Control in einer Klasse variabel referenzieren

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 SubSub UpdateProgressBar(bytNewValue as byte)
pctl.Value = bytNewValue
End SubIn der Form:
Private ClassBar As ControlProgressBar
Irgendwo dann:
Set ClassBar = New ControlProgressBar
ClassBar.Start Me.MeineProgressBar.ControlMein 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
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
-
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
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 -
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
-
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 -
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
-
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