Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: В GDI+ возникла ошибка общего вида Добавлено: 10.03.11 17:50  

Автор вопроса:  DLF
Подскажите, что делаю не так!
На форме содержится Timer1(100мсек), ImageList1(2 иконки 16х16х32), NotifyIcon1.
Код работает, но после 5-6 минутной работы вылетает ошибка:

System.Runtime.InteropServices.ExternalException не обработано
  ErrorCode=-2147467259
  Message=В GDI+ возникла ошибка общего вида.
  Source=System.Drawing

Public Class Form1

    Dim c As Integer = 0

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Enabled = True
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If IsKeyLocked(Keys.CapsLock) = True Then
            NotifyIcon1.Icon = Icon.FromHandle(CType(ImageList1.Images(c), Bitmap).GetHicon())
            If c <> 1 Then
                c = +1
            Else
                c = 0
            End If
        Else
            NotifyIcon1.Icon = Icon.FromHandle(CType(ImageList1.Images(1), Bitmap).GetHicon())
        End If
    End Sub

End Class

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #1 Добавлено: 11.03.11 00:58
как минимум, ты не освобождаешь ресурсы свежсозданной иконки. Каждые 100 мс.

Ответить

Номер ответа: 2
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #2 Добавлено: 11.03.11 01:03
Большой утечки не будет, так как сборщик мусора все равно будет находить потерявшиеся объекты, финализировать, а в финализаторе у них стоит вызов Dispose.

Другой вопрос, что мешает создать заранее 2 объекта Icon и в таймере подставлять то один то другой?

Ответить

Номер ответа: 3
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #3 Добавлено: 11.03.11 03:25
Мне нужно, чтобы при включенном CapsLock иконка меняла свой цвет (2 иконки с разным задним фоном, которые должны содержаться в ресурсах файла, а не в папке с программой). ImageList для этого вполне подходит (тем более, что я его использую для остальной части кода).

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 11.03.11 17:16
Нет необходимости каждый раз создавать иконку из данных в ImageList, достаточно сделать заране из ImageList создать 2 нужных тебе иконки, затем менять их в таймере. Кол-во операций с GDI сильно уменьшится, вероятно, ошибка тоже пропадет. Память тоже менее активно будет использоваться.

Ответить

Номер ответа: 5
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #5 Добавлено: 11.03.11 21:04
Был у меня перерыв в изучении программирования 2 года. Теперь начинаю всё с начала. Если не трудно, приведи пример. Наверно клёпки в голове не хватает.

Ответить

Номер ответа: 6
Автор ответа:
 Захарка



Вопросов: 0
Ответов: 42
 Профиль | | #6 Добавлено: 12.03.11 02:43
  1. Public Class Form1
  2.  
  3.     Dim c As Integer = 0
  4.     dim icon1 as System.Drawing.Icon;
  5.     dim icon2 as System.Drawing.Icon;
  6.  
  7.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  8.         Timer1.Enabled = True
  9.         icon1 = Icon.FromHandle(CType(ImageList1.Images(c), Bitmap).GetHicon())
  10.         icon2 = Icon.FromHandle(CType(ImageList1.Images(1), Bitmap).GetHicon())
  11.     End Sub
  12.  
  13.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  14.         If IsKeyLocked(Keys.CapsLock) = True Then
  15.             NotifyIcon1.Icon = icon1
  16.             If c <> 1 Then
  17.                 c = +1
  18.             Else
  19.                 c = 0
  20.             End If
  21.         Else
  22.             NotifyIcon1.Icon = icon2
  23.         End If
  24.     End Sub
  25.  
  26. End Class

Ответить

Номер ответа: 7
Автор ответа:
 Захарка



Вопросов: 0
Ответов: 42
 Профиль | | #7 Добавлено: 12.03.11 02:45
ой, сорри не подумал:
  1.  
  2. Public Class Form1
  3.  
  4.     dim icon1 as System.Drawing.Icon;
  5.     dim icon2 as System.Drawing.Icon;
  6.  
  7.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  8.         Timer1.Enabled = True
  9.         icon1 = Icon.FromHandle(CType(ImageList1.Images(0), Bitmap).GetHicon())
  10.         icon2 = Icon.FromHandle(CType(ImageList1.Images(1), Bitmap).GetHicon())
  11.     End Sub
  12.  
  13.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  14.         If IsKeyLocked(Keys.CapsLock) = True Then
  15.             NotifyIcon1.Icon = icon1
  16.         Else
  17.             NotifyIcon1.Icon = icon2
  18.         End If
  19.     End Sub
  20.  
  21. End Class


сразу не понял зачем c нужно(

Ответить

Номер ответа: 8
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #8 Добавлено: 12.03.11 11:44
Спасибо, но до этого и я бы додумался бы. Мне нужно, чтобы иконка мигала при включенном CapsLock, а у NtifyIcon свойство Icon не индексируется. Вот в чем проблема.

Ответить

Номер ответа: 9
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 12.03.11 17:13
здесь нужно добавить еще 4 строчки кода.

Ответить

Номер ответа: 10
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #10 Добавлено: 13.03.11 13:20
?

Ответить

Номер ответа: 11
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #11 Добавлено: 13.03.11 16:19
какие же, Артем

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 14.03.11 05:52
Это вопрос на 64 000 рублей!

Ответить

Номер ответа: 13
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #13 Добавлено: 14.03.11 10:06
Artyom пишет:
здесь нужно добавить еще 4 строчки кода.


Полагаю, что эти?

  1. Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosed
  2.     icon1.Dispose()
  3.     icon2.Dispose()
  4. End Sub

Ответить

Номер ответа: 14
Автор ответа:
 DLF



Вопросов: 9
Ответов: 53
 Профиль | | #14 Добавлено: 18.03.11 20:17
Не думаю...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам