Аргумент Исключение в основном методе (winforms) - PullRequest
0 голосов
/ 14 апреля 2011
     static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new SpaceInvaders());// i get an error here when i start the form application.. it says Argument Exception. Parameter is not valid
    }

Моя основная форма выглядит так:

    public SpaceInvaders()
    {
        InitializeComponent();

    }

    public void SpaceInvaders_Load(object sender, EventArgs e)
    {
}

вот трассировка стека

"в System.Drawing.Graphics.GetHdc () \ r \ n в System.Drawing.BufferedGraphics.RenderInternal (HandleRef refTargetDC, буфер BufferedGraphics) \ r \ n в System.Drawing.BufferedGraphics.Render () \ r \ n в System.Windows.Forms.Control.WmPaint (сообщение & m) \ r \ n в System.Windows.Forms.Control.WndProc (сообщение & m) \ r \ n в System.Windows.Forms.ScrollableControl.WndProc (сообщение & m ) \ r \ n в System.Windows.Forms.ContainerControl.WndProc (Message & m) \ r \ n в System.Windows.Forms.Form.WndProc (Message & m) \ r \ n в System.Windows.Forms.Control. ControlNativeWindow.OnMessage (Message & m) \ r \ n в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) \ r \ n в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam , IntPtr lparam) \ r \ n в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & msg) \ r \ n в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMagerCoop dwComponentID, причина Int32, Int32 pvLoopData) \ r \ n в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, контекст ApplicationContext) \ r \ n в System.Windows.Forms.Application.ThreadContext.RunMessageLoop ( , Контекст ApplicationContext) \ r \ n в System.Windows.Forms.Application.Run (Form mainForm) \ r \ n в WindowsFormsApplication1.Program.Main () в D: \ Documents and Settings \ Dima \ Мои документы \ Visual Studio 2008 \ Projects \ SpaceInvaders \ SpaceInvaders \ Program.cs: строка 18 \ r \ n в System.AppDomain._nExecuteAssembly (сборка сборки, аргументы String []) \ r \ n в System.AppDomain.ExecuteAssembly (сборка строк FileFile, Evidence AssemblySecurity, String [] args) \ r \ n в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () \ r \ n в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) \ r \ n в System.Threading.ExecutionContext.Run (ExecutionContext) executeContext, обратный вызов ContextCallback, состояние объекта) \ r \ n в System.Threading.ThreadHelp er.ThreadStart () "

«Параметр недействителен.»

Я думаю, что нашел проблему:

  public void Draw(Graphics  g,int animationCell)
    {
     // some code
        g.dispose()//that method threw the exception can someone tell me why? i thought you do need to dispose your graphics object at the end when you finish using it.
       }

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Я думаю, вам следует отладить с помощью Step Into (F11), чтобы вы могли зайти в форму SpaceInvaders и посмотреть, есть ли в методах нулевой или иным образом недопустимый аргумент.

Исключение не может быть вызвано сразу этой строкой:

Application.Run(new SpaceInvaders());

Но некоторые функции инициализации могут создавать проблемы.

Редактировать после просмотра трассировки стека и кода:

Пожалуйста, смотрите раздел //some code. Проверьте, не содержит ли этот код до g.dispose() обработчики событий, которые выполняются после метода Draw. Если это так, то этот обработчик событий должен быть тем, который требует графический объект, но вы уже располагаете им. Следовательно, графический параметр равен нулю. Пожалуйста, поставьте эту //some code часть, если вам нужна дополнительная помощь.

1 голос
/ 14 апреля 2011

Вы не должны распоряжаться чужим Graphics объектом.

Избавляйтесь от объектов, которыми вы владеете, и только тогда, когда вы уверены, что никто другой не будет их использовать.

Если вы получаете одноразовый предмет от кого-то другого, вы должны предположить (если они не скажут иначе), что они утилизируют его, когда вы закончите.Вам не следует утилизировать его самостоятельно, и вы не должны сохранять его на потом (поскольку они могли его утилизировать)

1 голос
/ 14 апреля 2011

Краткий ответ:

Только не вызывайте Dispose () для объекта Graphics в методе Draw () -. Графика-объект содержит дескриптор родной поверхности рисования. Если вы утилизируете его, ваша форма не может быть нарисована на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...