System.Drawing: System.ArgumentException, Ungültiger Parameter

20/01/2008 - 19:57 von Matthias Göbel | Report spam
Hallo,
ich habe folgenden Code in meinem Projekt.
Die Laufschrift funktioniert auch, nur wenn ich das Formular minimiert habe
und dann wiederherstelle bekomme ich diese Fehlermeldung in Zeile "xxx"
(s.u.).
Ich weis aber nicht wo der Fehler liegt, die Argumente für scheinen gültige
Werte zu enthalten.
Kann mir jemand helfen ?


Public Class FrmDBA

Private TickerTrack As Ticker

Private Sub FrmdBA_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
'...
TickerTrack = New Ticker
SpcTrack.Panel1.Controls.Add(TickerControl)
With TickerTrack
.BackColor = SpcTrack.Panel1.BackColor
.ForeColor = SpcTrack.Panel1.ForeColor
.Cursor = Cursors.No
.Dock = DockStyle.None
.Location = New Point(0, 0)
.Size = New Size(SPContainer.Width, SPContainer.Height)
.Margin = New Padding(3) : .Padding = New Padding(0)
.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom
.Font = FontTAG
End With
'...
End Sub

Private Sub TmrdBA_Elapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs) Handles TmrDBA.Elapsed
'...
If dbTrack_ <> dbTrack Then _
TickerTrack.Text = dbTrack : dbTrack_ = dbTrack
'...
End Sub

End Class


Public Class Ticker
Inherits Control
Private WithEvents TmrScroll As New System.Windows.Forms.Timer
Private _ScrollMode As ScrollMode = ScrollMode.On
Public Enum ScrollMode
[On]
[Off]
End Enum
Private _Speed As Single = 3
Private _Position As Single = 0
Private _TextSize As SizeF

Public Sub New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.OptimizedDoubleBuffer Or _
ControlStyles.ResizeRedraw Or _
ControlStyles.UserPaint, True)
With TmrScroll
.Stop(): .Interval = 15
End With
End Sub

Public Property Scroll() As ScrollMode
Get
Return _ScrollMode
End Get
Set(ByVal Status As ScrollMode)
_ScrollMode = Status
If Status = ScrollMode.Off Then
TmrScroll.Stop()
Else : TmrScroll.Start()
End If
End Set
End Property

Public Property Interval() As Integer
Get
Return TmrScroll.Interval
End Get
Set(ByVal mSec As Integer)
Select Case mSec
Case Is < 0 : mSec = 0
Case Is > 10000 : mSec = 10000
End Select
TmrScroll.Interval = mSec
End Set
End Property

Public Property Speed() As Single
Get
Return _Speed
End Get
Set(ByVal Pix As Single)
Select Case Pix
Case Is <= 0 : Pix = 1
Case Is > (FrmDBA.Width / 10) : Pix = FrmDBA.Width / 10
End Select
_Speed = Pix
End Set
End Property

Public Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal Line As String)
Me.Scroll = ScrollMode.Off : _Position = 0
MyBase.Text = Line
Using G As Graphics = Me.CreateGraphics
_TextSize = G.MeasureString(Line, Me.Font)
End Using
If _TextSize.Width > FrmDBA.Width Then Me.Scroll = ScrollMode.On
Me.Invalidate()
End Set
End Property

Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.Clear(Me.BackColor)
If (Len(Me.Text) > 0) AndAlso _
(FrmDBA.WindowState <> FormWindowState.Minimized) Then
Using SB As New SolidBrush(Me.ForeColor)
'xxx:
e.Graphics.DrawString(Me.Text, Me.Font, SB, _Position, 0)
End Using
End If
End Sub

Private Sub TmrScRoll_Tick(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TmrScroll.Tick
If FrmDBA.WindowState <> FormWindowState.Minimized Then
If (_Position < 0) AndAlso _
(_Position + _TextSize.Width) <= FrmDBA.Width Then
_Position = 0
Else : _Position -= _Speed : Me.Invalidate()
End If
End If
End Sub

End Class

'-
'Fehlermeldung:

System.ArgumentException wurde nicht behandelt.
Message="Ungültiger Parameter."
Source="System.Drawing"
StackTrace:
bei System.Drawing.Graphics.CheckErrorStatus(Int32 status)
bei System.Drawing.Graphics.DrawString(String s, Font font, Brush
brush, RectangleF layoutRectangle, StringFormat format)
bei System.Drawing.Graphics.DrawString(String s, Font font, Brush
brush, Single x, Single y)
bei dBA.Ticker.OnPaint(PaintEventArgs e) in
E:\Benutzer\Matthias\Visual Studio 2005\Projects\dBA\dBA\FrmdBA.vb:Zeile 703.
bei
System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16
layer, Boolean disposeEventArgs)
bei System.Windows.Forms.Control.WmPaint(Message& m)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&
m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,
Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32
dwComponentID, Int32 reason, Int32 pvLoopData)
bei
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)
bei
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,
ApplicationContext context)
bei System.Windows.Forms.Application.Run(ApplicationContext context)
bei
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
bei
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
bei
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
bei dBA.My.MyApplication.Main(String[] Args) in
17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[]
args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

MfG
Matthias
 

Lesen sie die antworten

#1 Karsten Sosna
21/01/2008 - 06:04 | Warnen spam
Hallo Matthias,
da weiß man ja gar nicht wo man anfangen soll.

ich habe folgenden Code in meinem Projekt.
Die Laufschrift funktioniert auch,



dass bezweifele ich, bei mir funktioniert da gar nichts.

nur wenn ich das Formular minimiert habe
und dann wiederherstelle bekomme ich diese Fehlermeldung in Zeile "xxx"
(s.u.).
Ich weis aber nicht wo der Fehler liegt, die Argumente für scheinen
gültige
Werte zu enthalten.



Irgendwo muss ja der Fehler liegen. Ich schàtze mal der Fehler liegt hier:
\\\
e.Graphics.DrawString(Me.Text, Me.Font, SB, _Position, 0)
///
Fast Du die Parameter mal überprüft?

Kann mir jemand helfen ?



Ich versuche es gerade.

Public Class FrmDBA

Private TickerTrack As Ticker

Private Sub FrmdBA_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
'...
TickerTrack = New Ticker
SpcTrack.Panel1.Controls.Add(TickerControl)



SpcTrack.Panel1 gibt es nicht, also durch Me ersetzt. Und TickerControl
sollte wohl TickerTrack werden, alleine deswegen kann das Projekt gar nicht
bei Dir laufen, egal in welchem Zustand sich das Formular befindet.

With TickerTrack
.BackColor = SpcTrack.Panel1.BackColor
.ForeColor = SpcTrack.Panel1.ForeColor
.Cursor = Cursors.No
.Dock = DockStyle.None
.Location = New Point(0, 0)
.Size = New Size(SPContainer.Width, SPContainer.Height)
.Margin = New Padding(3) : .Padding = New Padding(0)
.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom
.Font = FontTAG



FontTAG gib es nicht, also durch Me.Font ersetzt.

End With
'...
End Sub

Private Sub TmrdBA_Elapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs) Handles TmrDBA.Elapsed
'...
If dbTrack_ <> dbTrack Then _
TickerTrack.Text = dbTrack : dbTrack_ = dbTrack
'...
End Sub



Es gibt weder TmrDBA, dbTrack_ noch dbTrack, also komplett auskmmentiert.


End Class


Public Class Ticker
Inherits Control
Private WithEvents TmrScroll As New System.Windows.Forms.Timer
Private _ScrollMode As ScrollMode = ScrollMode.On
Public Enum ScrollMode
[On]
[Off]
End Enum
Private _Speed As Single = 3
Private _Position As Single = 0
Private _TextSize As SizeF

Public Sub New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.OptimizedDoubleBuffer Or _
ControlStyles.ResizeRedraw Or _
ControlStyles.UserPaint, True)
With TmrScroll
.Stop(): .Interval = 15
End With
End Sub

Public Property Scroll() As ScrollMode
Get
Return _ScrollMode
End Get
Set(ByVal Status As ScrollMode)
_ScrollMode = Status
If Status = ScrollMode.Off Then
TmrScroll.Stop()
Else : TmrScroll.Start()
End If
End Set
End Property

Public Property Interval() As Integer
Get
Return TmrScroll.Interval
End Get
Set(ByVal mSec As Integer)
Select Case mSec
Case Is < 0 : mSec = 0
Case Is > 10000 : mSec = 10000
End Select
TmrScroll.Interval = mSec
End Set
End Property

Public Property Speed() As Single
Get
Return _Speed
End Get
Set(ByVal Pix As Single)
Select Case Pix
Case Is <= 0 : Pix = 1
Case Is > (FrmDBA.Width / 10) : Pix = FrmDBA.Width / 10



Wo gibt es in dieser Klasse FrmDBA?!?!?

End Select
_Speed = Pix
End Set
End Property

Public Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal Line As String)
Me.Scroll = ScrollMode.Off : _Position = 0
MyBase.Text = Line
Using G As Graphics = Me.CreateGraphics
_TextSize = G.MeasureString(Line, Me.Font)
End Using
If _TextSize.Width > FrmDBA.Width Then Me.Scroll =
ScrollMode.On
Me.Invalidate()
End Set
End Property



Nur weil !ich! das Property überschrieben habe, heißt das nicht, dass man
das so machen muss. Das Abfangen vom Event TextChanged hàtte es auch getan.
Umbennen von VariablenByVal Line As String) hilft, an der Stelle auch nicht,
das ich nicht meinen Code wieder erkenne. An dieser Stelle einen
_rechtherzlichen Dank_ für die Rückmeldung meines am 19.12.2007 geposteten
Codes. :=(


Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.Clear(Me.BackColor)
If (Len(Me.Text) > 0) AndAlso _
(FrmDBA.WindowState <> FormWindowState.Minimized) Then
Using SB As New SolidBrush(Me.ForeColor)
'xxx:
e.Graphics.DrawString(Me.Text, Me.Font, SB, _Position, 0)
End Using
End If
End Sub



Auch hier hàtte das Paint-Event ausgereicht. Ich überschreibe die
OnPaint-Methode aus Gewohnheit, weil ich in 99% der Fàlle den
Basisklassenaufruf verhindere. Und da Du nicht OnPaintBachGround
überschrieben hast, kannst Du Dir das Löschen des Hintergrundes sparen.


Private Sub TmrScRoll_Tick(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TmrScroll.Tick
If FrmDBA.WindowState <> FormWindowState.Minimized Then
If (_Position < 0) AndAlso _
(_Position + _TextSize.Width) <= FrmDBA.Width Then



Hier schon wieder. "FrmDBA" hat in der Klasse !nichts! verloren. Wenn Du
einen Instanzmember in der Klasse hast, der so heißt ist das O.k.., den gibt
es aber nicht.

_Position = 0
Else : _Position -= _Speed : Me.Invalidate()
End If
End If
End Sub

End Class



Gewöhne dir bloß diese Mehrfachanweisungen in eine Zeile ab, das ist so
bescheiden zu lesen. Ich bin dafür das man die Doppelpunkte in VB verbietet.

So und hàttest Du nicht soviel an _meinem _Code "rumgepfuscht" würde das
Ganze auch immernoch laufen und das tut es, ich habe es gerade nochmal
ausprobiert!.
Hier sieht man ganz deutlich, das Du Code "blind" übernommen hast ohne ihn
zu verstehen. :=(
Scotty

Ähnliche fragen