Hallo Entwicklerforum,
ich arbeite zur Zeit an meiner Bachelorarbeit und muss dort ein Programm weiterentwickeln.
Mein Problem besteht darin, dass ich mehrere Elemente (ca. 200) in ein Panel schreibe und deren Status (Farbe) sich ändert, wobei es zum flackern kommt.
Ich habe mich bereits ein bisschen über doubleBuffer informiert und dies scheint mein problem wahrscheinlich zu beheben, da die Elemente zur Zeit einzeln gezeichnet werden, wodurch das Flackern entsteht.
Jedoch ist die Klasse "protected" und ich kann die Eigenschaft nicht setzen.
Erklärung:
'Graf ist der Name des Panels
'In der Datei Hier.Draw/Flach.Draw sind die Zeichnungen hinterlegt (e.Graphics.DrawLine usw)
Im MainForm:
[highlight=vbnet]
Public Sub Graf_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Graf.Paint
If Me.m_aktuellerRezepttyp <> Rezepttyp.Fehlgeschlagen Then
If Me.m_aktuellerRezepttyp = Rezepttyp.Flach Then
Me.flach.Draw(sender, Me.m_objectlist, e, Me.Graf, Me.contid, zoom, lasttermid)
Graf.Height = CInt((flach.icount + 120) * zoom)
If flach.jmaximum > 650 Then
Me.Graf.Width = flach.jmaximum
Else
Me.Graf.Width = CInt(650 * zoom)
End If
ElseIf Me.m_aktuellerRezepttyp = Rezepttyp.Hierarchisch Then
Me.Hier.Draw(sender, Me.m_objectlist, e, Me.Graf, Me.contid, zoom, lasttermid, Position.imaximum, Position.jmaximum)
Graf.Height = CInt((Position.imaximum + 180) * zoom)
If Position.jmaximum > 450 Then
Me.Graf.Width = CInt((Position.jmaximum + 180) * zoom) '
Else
Me.Graf.Width = CInt(650 * zoom)
End If
End If
End If
Graf.Focus()
End Sub
[/highlight]
ich glaube gelesen zu haben, dass man die Eigenschaft über ein Control schreiben muss und (ich glaube) diese werden in meiner PanelForm Datei definiert. Dort habe ich schon das "Me.DoubleBuffered=True" hinzugefügt, nur dies definiert nicht die Eigenschaft von Graf (und von Panel) auf True.
Im PanelForm:
[highlight=vbnet]
Imports System
Imports System.Windows.Forms
Imports System.Security.Permissions
' setting security permission to full trust avoids getting weird errors like "window.external is null or not an object"
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> <System.Runtime.InteropServices.ComVisibleAttribut e(True)> _
Public Class PanelForm
Inherits Form
Private WithEvents m_cont As Cont
Public ReadOnly Property CONT() As Cont
Get
Return m_cont
End Get
End Property
Public graf As New Panel()
Public panel As New Panel()
<STAThread()> _
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New MainForm())
End Sub
Private m_mainForm As MainForm
Public ReadOnly Property MAIN_FORM() As Replayer.MainForm
Get
Return m_mainForm
End Get
End Property
Public Sub New(ByRef mainForm As MainForm, ByRef cont As Cont, ByRef graf As Panel)
Me.InitializeComponent()
Me.graf = graf
Me.m_mainForm = mainForm
Me.DoubleBuffered = True
Me.m_mainForm.AddPanelForm(Me)
Me.m_cont = cont
Me.Text = m_cont.NAME
panel.AutoScroll = True
panel.Controls.Add(graf)
panel.Dock = DockStyle.Fill
panel.BackColor = Drawing.SystemColors.Window
Controls.Add(panel)
End Sub
Private Sub PanelForm_FormClosing(ByVal sender As Object, ByVal e As EventArgs) Handles Me.FormClosing
m_mainForm.UnselectTreeView()
m_mainForm.RemovePanelForm(Me)
End Sub
Private Sub PanelForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Public Sub RefreshGraf()
Me.graf.Refresh()
End Sub
Private Sub PanelForm_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Activated
m_mainForm.SelectContInTreeView(m_cont)
End Sub
End Class
[/highlight]
Vielleicht kann mir ja einer von euch Helfen.
Ich kann bei Bedarf auch noch weiteren Quellcode posten.
Würde mich über jede Hilfe sehr freuen [eigentlich bin ich sogar Maschinenbauer und kein Programmierer ]
Grüße,
HexaDezimalCode
ich arbeite zur Zeit an meiner Bachelorarbeit und muss dort ein Programm weiterentwickeln.
Mein Problem besteht darin, dass ich mehrere Elemente (ca. 200) in ein Panel schreibe und deren Status (Farbe) sich ändert, wobei es zum flackern kommt.
Ich habe mich bereits ein bisschen über doubleBuffer informiert und dies scheint mein problem wahrscheinlich zu beheben, da die Elemente zur Zeit einzeln gezeichnet werden, wodurch das Flackern entsteht.
Jedoch ist die Klasse "protected" und ich kann die Eigenschaft nicht setzen.
Erklärung:
'Graf ist der Name des Panels
'In der Datei Hier.Draw/Flach.Draw sind die Zeichnungen hinterlegt (e.Graphics.DrawLine usw)
Im MainForm:
[highlight=vbnet]
Public Sub Graf_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Graf.Paint
If Me.m_aktuellerRezepttyp <> Rezepttyp.Fehlgeschlagen Then
If Me.m_aktuellerRezepttyp = Rezepttyp.Flach Then
Me.flach.Draw(sender, Me.m_objectlist, e, Me.Graf, Me.contid, zoom, lasttermid)
Graf.Height = CInt((flach.icount + 120) * zoom)
If flach.jmaximum > 650 Then
Me.Graf.Width = flach.jmaximum
Else
Me.Graf.Width = CInt(650 * zoom)
End If
ElseIf Me.m_aktuellerRezepttyp = Rezepttyp.Hierarchisch Then
Me.Hier.Draw(sender, Me.m_objectlist, e, Me.Graf, Me.contid, zoom, lasttermid, Position.imaximum, Position.jmaximum)
Graf.Height = CInt((Position.imaximum + 180) * zoom)
If Position.jmaximum > 450 Then
Me.Graf.Width = CInt((Position.jmaximum + 180) * zoom) '
Else
Me.Graf.Width = CInt(650 * zoom)
End If
End If
End If
Graf.Focus()
End Sub
[/highlight]
ich glaube gelesen zu haben, dass man die Eigenschaft über ein Control schreiben muss und (ich glaube) diese werden in meiner PanelForm Datei definiert. Dort habe ich schon das "Me.DoubleBuffered=True" hinzugefügt, nur dies definiert nicht die Eigenschaft von Graf (und von Panel) auf True.
Im PanelForm:
[highlight=vbnet]
Imports System
Imports System.Windows.Forms
Imports System.Security.Permissions
' setting security permission to full trust avoids getting weird errors like "window.external is null or not an object"
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> <System.Runtime.InteropServices.ComVisibleAttribut e(True)> _
Public Class PanelForm
Inherits Form
Private WithEvents m_cont As Cont
Public ReadOnly Property CONT() As Cont
Get
Return m_cont
End Get
End Property
Public graf As New Panel()
Public panel As New Panel()
<STAThread()> _
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New MainForm())
End Sub
Private m_mainForm As MainForm
Public ReadOnly Property MAIN_FORM() As Replayer.MainForm
Get
Return m_mainForm
End Get
End Property
Public Sub New(ByRef mainForm As MainForm, ByRef cont As Cont, ByRef graf As Panel)
Me.InitializeComponent()
Me.graf = graf
Me.m_mainForm = mainForm
Me.DoubleBuffered = True
Me.m_mainForm.AddPanelForm(Me)
Me.m_cont = cont
Me.Text = m_cont.NAME
panel.AutoScroll = True
panel.Controls.Add(graf)
panel.Dock = DockStyle.Fill
panel.BackColor = Drawing.SystemColors.Window
Controls.Add(panel)
End Sub
Private Sub PanelForm_FormClosing(ByVal sender As Object, ByVal e As EventArgs) Handles Me.FormClosing
m_mainForm.UnselectTreeView()
m_mainForm.RemovePanelForm(Me)
End Sub
Private Sub PanelForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Public Sub RefreshGraf()
Me.graf.Refresh()
End Sub
Private Sub PanelForm_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Activated
m_mainForm.SelectContInTreeView(m_cont)
End Sub
End Class
[/highlight]
Vielleicht kann mir ja einer von euch Helfen.
Ich kann bei Bedarf auch noch weiteren Quellcode posten.
Würde mich über jede Hilfe sehr freuen [eigentlich bin ich sogar Maschinenbauer und kein Programmierer ]
Grüße,
HexaDezimalCode
Comment