Почему иногда пропадают иконки в ListView?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Почему иногда пропадают иконки в ListView?

Сообщение brigval » 02.01.2009 (Пт) 13:50

И как сделать, чтоб иконки никогда не пропадали?
brigval

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Почему иногда пропадают иконки в ListView?

Сообщение MIT » 02.01.2009 (Пт) 18:32

При нормальном использовании, вроде, все должно быть нормально... если это не глюк, что вряд ли.
Как говорилось много раз на этом форуме, мы не телепаты. Выкладывай код заполнения/изменения элементов ListView`а, будем разбираться :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Почему иногда пропадают иконки в ListView?

Сообщение brigval » 02.01.2009 (Пт) 19:26

MIT писал(а):Выкладывай код заполнения/изменения элементов ListView`а, будем разбираться :wink:


Спасибо. Вот код.
Пояснения. Программа похожа на Total Commander, отображает в левом и правом ListView папки и файлы.
Назначение программы запоминать историю перемещения/переименования файлов одной из программ САПР.
Иконки папок вставляются из ListImage на форме.Они не пропадают
Иконки файлов считываются функцией API. Ими заполняется в памяти ImageList.
Сначала заполняется ListView в памяти, а не тот, что на форме. Потом все одним махом всталяется в ListView на форме.
Точнее не ListView, а массив элементов ListView.
Пропадают только иконки файлов.
Иконки пропадают не всегда и, кажется, без системы в самый не подходящий момент.
По крайней мере, повторить пропадание иконок не удается.
Такое ощущение, что иконки не перерисовываются.

Код: Выделить всё
 
   '==========================================================================
   '
   ' Процедура формирует массив папкок и файлов и заполняет ими ЛистВью
   '
   Private Sub FillingListViews(ByVal sDir As String, ByVal lv As ListView, _
                                 Optional ByVal sDirOther As String = NS, _
                                 Optional ByVal lvOther As ListView = Nothing, _
                                 Optional ByVal oCursor As Cursor = Nothing)
      Dim arrF(,) As String
      Dim arrOther(,) As String
      Dim bOther As Boolean = False
      '
      ReDim arrF(F_PATH, 0)
      ReDim arrOther(F_PATH, 0)
      '
      If oCursor Is Nothing Then MyBase.Cursor = Cursors.WaitCursor
      '
      ' Добавление в "виртуальный" ListView иконок папок
      '
      With milIcon.Images
         .Clear()
         .Add(ICON_FLD_COLL, ilIcon.Images(ICON_FLD_COLL))
         .Add(ICON_FLD_EXP, ilIcon.Images(ICON_FLD_EXP))
      End With
      '
      ' Заполнение массива путями к папкам и файлам
      '
      FillingArrays(sDir, arrF, sDirOther, arrOther)
      '
      ' Заполнение первого ЛистВью
      '
      FillingListView(sDir, lv, arrF)
      '
      bOther = (sDirOther.Length > 0)
      bOther = bOther And Not lvOther Is Nothing
      If bOther Then
         ' Заполнение второго ЛистВью
         FillingListView(sDirOther, lvOther, arrOther)
      End If
      '
      If oCursor Is Nothing Then MyBase.Cursor = Cursors.Default
      '
   End Sub

   '=============================================================================
   '
   ' Заполнение одного ЛистВью
   '
   Private Sub FillingListView(ByVal sDir As String, ByVal lv As ListView, ByRef arr(,) As String)
      Dim i As Integer = 0
      Dim ub As Integer = arr.GetUpperBound(1)
      Dim lvItem(ub) As ListViewItem
      '
      With lv
         .BeginUpdate()
         For i = 0 To ub
            .SmallImageList = milIcon
            lvItem(i) = New ListViewItem
            ListViewItemAdd(lvItem(i), arr, i)
         Next
         With .Items
            .Clear()
            .AddRange(lvItem)
         End With
         .EndUpdate()
      End With
   End Sub

   '=============================================================================
   '
   ' Добавление папки или файла в ЛистВью
   '
   Private Sub ListViewItemAdd(ByRef lvItem As ListViewItem, _
                               ByRef arrF(,) As String, ByVal i As Integer)
      Dim sKey As String = arrF(F_ICON, i)
      With lvItem
         .SubItems.AddRange(mCol)
         .SubItems(0).Text = arrF(F_NAME, i)
         .SubItems(1).Text = arrF(F_EXTE, i)
         .SubItems(2).Text = arrF(F_SIZE, i)
         .SubItems(3).Text = arrF(F_TIME, i)
         .Name = arrF(F_PATH, i)
         .ToolTipText = .Name
         If milIcon.Images.ContainsKey(sKey) Then
            .ImageKey = sKey
         Else
            .ImageKey = ICON_NO_EXT
         End If
      End With
   End Sub

   '=============================================================================
   '
   ' Добавление иконки файла в ЛистИмидж
   '
   Private Sub AddIcon(ByVal ffn As String)
      Dim oIcon As Icon
      Dim sKey As String = Path.GetExtension(ffn)
      Dim hIcon As Integer
      If sKey.Length > 0 Then
         sKey = sKey.Substring(1)
         If Not milIcon.Images.ContainsKey(sKey) Then
            hIcon = GetIconHandle(ffn)
            If hIcon > 0 Then
               oIcon = Drawing.Icon.FromHandle(hIcon)
               milIcon.Images.Add(sKey, oIcon)
            Else
               milIcon.Images.Add(sKey, ilIcon.Images(ICON_NOT_FOUND))
            End If
         End If
      Else
         ' Расширение у файла может отсутствовать
         If Not milIcon.Images.ContainsKey(ICON_NO_EXT) Then
            milIcon.Images.Add(ICON_NO_EXT, ilIcon.Images(ICON_NO_EXT))
         End If
      End If
   End Sub
brigval

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Почему иногда пропадают иконки в ListView?

Сообщение MIT » 02.01.2009 (Пт) 19:47

Попробуй так:
В процедуре AddIcon
Замени строку
milIcon.Images.Add(sKey, oIcon)
на
milIcon.Images.Add(sKey, oIcon.Clone)

И ilIcon.Images(...) на ilIcon.Images(...).Clone
Должно помочь. Если нет - то в данном тоьой коде без отладки зацепится вроде не за что.

З.Ы. А нафиг тебе массив (!) ListVIew? Ведь можно обойтись структурой, массивом массивов элементов, на худой конец...
Последний раз редактировалось MIT 02.01.2009 (Пт) 19:59, всего редактировалось 1 раз.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Почему иногда пропадают иконки в ListView?

Сообщение brigval » 02.01.2009 (Пт) 19:57

MIT писал(а):Попробуй так:
В процедуре AddIcon
Замени строку
Код: Выделить всё
milIcon.Images.Add(sKey, oIcon)
на
Код: Выделить всё
milIcon.Images.Add(sKey, oIcon[b].Clone[/b])

И ilIcon.Images(...) на ilIcon.Images(...).Clone

Спасибо. Попробую.
brigval

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Почему иногда пропадают иконки в ListView?

Сообщение brigval » 18.02.2009 (Ср) 8:13

>MIT
Спасибо. Все заработало как надо. Не было возможности проверить раньше, поэтому не отвечал.

А нафиг тебе массив (!) ListVIew?

Это не массив листвью, а массив элементов листвью. Массивом элементов можно одномоментно заполнять листвью. Я применил этот способ заполнения листвью, потому что думаю, что он ускоряет заполнение. Хотя точно не знаю, так ли это на самом деле.
brigval

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Почему иногда пропадают иконки в ListView?

Сообщение MIT » 18.02.2009 (Ср) 9:23

brigval писал(а):Это не массив листвью, а массив элементов листвью.
И правда... Даже забыл с чего вдруг такое написал :)
brigval писал(а):Я применил этот способ заполнения листвью, потому что думаю, что он ускоряет заполнение. Хотя точно не знаю, так ли это на самом деле.
Да, так намного быстрее, что хорошо заметно при добавлении 10-20 тысяч элеметнов, так как происходит всего лишь одно обращение к контролу вместо тех же 20 тысяч.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Почему иногда пропадают иконки в ListView?

Сообщение brigval » 28.02.2009 (Сб) 10:36

Видимо я выдал желаемое за действительное и поспешил с положительным ответом. Прошу извинить.

К моему большому огорчению, Clone не помогает.

Изображение
brigval

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Почему иногда пропадают иконки в ListView?

Сообщение brigval » 28.02.2009 (Сб) 10:41

Замечено, что пропадают только иконки файлов, то есть загружаемые программно, а не из имиджлиста.
Иногда иконки самопроизвольно заменяются на другие из числа загружаемых программно.
brigval

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Почему иногда пропадают иконки в ListView?

Сообщение brigval » 28.02.2009 (Сб) 14:22

Ну, в общем, разобрался.
Проблема была здесь
Код: Выделить всё
With milIcon.Images
         .Clear()
         .Add(ICON_FLD_COLL, ilIcon.Images(ICON_FLD_COLL))
         .Add(ICON_FLD_EXP, ilIcon.Images(ICON_FLD_EXP))
      End With

Каждый раз, заполняя другой листвью, я ощищал имиджлист. Так как он один на два листвью, то когда набор в другом листвью не совпадал с набором иконок в первом листвью, иконки в первом листвью пропадали. Перенос приведенного участка кода в загрузку формы решил проблему. Иконки больше не пропадают.
Иконки теперь накапливаются в листимидже, что меня дла практических целей вполне устраивает.
brigval


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList