Hallo,
ich habe ein Programm, welches ein Arbeitsblatt mit Seitenrändern anzeigt. Die Arbeitsoberfläche kann in der Größe verändert werden. Die Oberfläche wird in einer Picturebox (SichtfensterPicture) gezeichnet. Bis jetzt hatte ich zum Aktualisieren folgende Funktion (Die Funktion ist für die bessere Veranschaulichung stark verkürzt):
Jetzt möchte ich diese Funktion in ein Thread auslagern. Dazu habe ich eine neue Klasse namens OberflaecheKlasse erstellt.
Im Hauptformular habe ich Folgendes hinzugefügt:
Nun habe ich schon verstanden, dass ich aus dem Thread heraus nicht die Größen der Picturebox verwenden kann. Daher habe ich die Variablen "Oberflaechenbreite", und "Oberflaechenhoehe" in einem globalen Modul erzeugt. Sie werden jedesmal, wenn sich die Größe der Picturebox ändert, angepaßt. Nun bekomme ich folgenden Fehler:
error BC30519: Fehler bei der Überladungsauflösung, da keine zugreifbare "New" ohne einschränkende Konvertierung aufgerufen werden kann:
Es wir die folgende Zeile markiert:
Wenn ich statt dessen zahlen in die Klammern schreibe, funktioniert es.
Hat jemand eine Idee, woran es liegen kann?
ich habe ein Programm, welches ein Arbeitsblatt mit Seitenrändern anzeigt. Die Arbeitsoberfläche kann in der Größe verändert werden. Die Oberfläche wird in einer Picturebox (SichtfensterPicture) gezeichnet. Bis jetzt hatte ich zum Aktualisieren folgende Funktion (Die Funktion ist für die bessere Veranschaulichung stark verkürzt):
VB.NET-Quellcode
- Public Sub GrafikAufbauen()
- 'Wenn eine vorherige Instanz dieser funktion bereits ausgeführt wird,
- 'so wird der aktuelle Durchgang verlassen.
- If Ausfuehren = False Then
- Exit Sub
- Else
- Ausfuehren = False
- End If
- SichtfensterObjekt.Clear(Programmfarben(Fensterhintergrundfarbe))
- 'Der Arbeitshintergrund wird gezeichnet. Nachdem danach die Arbeitsbereiche
- 'gezeichnet werden, bleiben nur noch die Seitenränder sichtbar.
- If Seitenbreite * ZoomFaktor < SichtfensterPicture.ClientSize.Width Then
- Zeichenbereich.Links = (SichtfensterPicture.ClientSize.Width - (Seitenbreite * ZoomFaktor)) / 2
- Zeichenbereich.Breite = Seitenbreite * ZoomFaktor
- Else
- Zeichenbereich.Links = 0
- Zeichenbereich.Breite = SichtfensterPicture.ClientSize.Width
- End If
- If Seitenhoehe * ZoomFaktor < SichtfensterPicture.ClientSize.Height Then
- Zeichenbereich.Oben = (SichtfensterPicture.ClientSize.Height - (Seitenhoehe * ZoomFaktor)) / 2
- Zeichenbereich.Hoehe = Seitenhoehe * ZoomFaktor
- Else
- Zeichenbereich.Oben = 0
- Zeichenbereich.Hoehe = SichtfensterPicture.ClientSize.Height
- End If
- Using Ausgefuellt = New SolidBrush(Programmfarben(Seitenraenderfarbe))
- Try
- SichtfensterObjekt.FillRectangle(Ausgefuellt, New Rectangle(Zeichenbereich.Links, Zeichenbereich.Oben, Zeichenbereich.Breite, Zeichenbereich.Hoehe))
- Catch myerror As Exception
- End Try
- End Using
- ...
- SichtfensterPicture.Image = SichtfensterPuffer
- end sub
Jetzt möchte ich diese Funktion in ein Thread auslagern. Dazu habe ich eine neue Klasse namens OberflaecheKlasse erstellt.
VB.NET-Quellcode
- Imports System.Threading
- Imports System.Drawing.Imaging
- Public Class OberflaecheKlasse
- Implements IDisposable
- Private Oberflaeche As Bitmap = New Bitmap(1, 1)
- Private OberflaecheObjekt As Graphics = Graphics.FromImage(Oberflaeche)
- Private GrafikErstellen As Thread
- Public Event GrafikAufbauen(Grafik As Bitmap)
- Private Ausfuehren As Boolean
- Public Sub GrafikaufbauStarten()
- If Not GrafikErstellen Is Nothing Then
- Throw New Exception("Ich mach doch schon....")
- End If
- Ausfuehren = True
- GrafikErstellen = New Thread(AddressOf OberflaecheZeichnen)
- GrafikErstellen.Start()
- End Sub
- Public Sub GrafikaufbauStoppen()
- Ausfuehren = False
- End Sub
- Public Sub OberflaecheZeichnen()
- While Ausfuehren
- Oberflaeche = New Bitmap(Oberflaechenbreite, Oberflaechenhoehe)
- OberflaecheObjekt = Graphics.FromImage(Oberflaeche)
- OberflaecheObjekt.Clear(Programmfarben(Fensterhintergrundfarbe))
- 'Der Arbeitshintergrund wird gezeichnet. Nachdem danach die Arbeitsbereiche
- 'gezeichnet werden, bleiben nur noch die Seitenränder sichtbar.
- If Seitenbreite * ZoomFaktor < Oberflaechenbreite Then
- Zeichenbereich.Links = (Oberflaechenbreite - (Seitenbreite * ZoomFaktor)) / 2
- Zeichenbereich.Breite = Seitenbreite * ZoomFaktor
- Else
- Zeichenbereich.Links = 0
- Zeichenbereich.Breite = Oberflaechenbreite
- End If
- If Seitenhoehe * ZoomFaktor < Oberflaechenhoehe Then
- Zeichenbereich.Oben = (Oberflaechenhoehe - (Seitenhoehe * ZoomFaktor)) / 2
- Zeichenbereich.Hoehe = Seitenhoehe * ZoomFaktor
- Else
- Zeichenbereich.Oben = 0
- Zeichenbereich.Hoehe = Oberflaechenhoehe
- End If
- Using Ausgefuellt = New SolidBrush(Programmfarben(Seitenraenderfarbe))
- Try
- OberflaecheObjekt.FillRectangle(Ausgefuellt, New Rectangle(Zeichenbereich.Links, Zeichenbereich.Oben, Zeichenbereich.Breite, Zeichenbereich.Hoehe))
- Catch myerror As Exception
- End Try
- End Using
- ...
- RaiseEvent GrafikAufbauen(Oberflaeche)
- Thread.Sleep(10)
- End While
- End Sub
- End Class
Im Hauptformular habe ich Folgendes hinzugefügt:
VB.NET-Quellcode
- 'Im Klassenkopf
- Private WithEvents Oberflaeche As New OberflaecheKlasse
- 'Innerhalb der Klasse
- Private Sub OberflaecheAnzeigen(Grafik As Bitmap) Handles Oberflaeche.GrafikAufbauen
- SichtfensterPicture.Image = Grafik
- End Sub
- Private Sub SichtfensterPicture_Resize(sender As Object, e As EventArgs) Handles SichtfensterPicture.Resize
- Oberflaechenbreite = SichtfensterPicture.ClientSize.Width
- Oberflaechenhoehe = SichtfensterPicture.ClientSize.Height
- End Sub
Nun habe ich schon verstanden, dass ich aus dem Thread heraus nicht die Größen der Picturebox verwenden kann. Daher habe ich die Variablen "Oberflaechenbreite", und "Oberflaechenhoehe" in einem globalen Modul erzeugt. Sie werden jedesmal, wenn sich die Größe der Picturebox ändert, angepaßt. Nun bekomme ich folgenden Fehler:
error BC30519: Fehler bei der Überladungsauflösung, da keine zugreifbare "New" ohne einschränkende Konvertierung aufgerufen werden kann:
Es wir die folgende Zeile markiert:
Wenn ich statt dessen zahlen in die Klammern schreibe, funktioniert es.
Hat jemand eine Idee, woran es liegen kann?