Динамическое создание контролов

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

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

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Динамическое создание контролов

Сообщение netdemon » 18.11.2010 (Чт) 17:25

неправильно обновляются иконки дисков. Что я делаю не так? помогите.
Вложения
Desktop_Panel.zip
(952.47 Кб) Скачиваний: 111
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Динамическое создание контролов

Сообщение FireFenix » 18.11.2010 (Чт) 20:57

Код: Выделить всё
Error   1   Cannot import the following key file: Desktop_Panel_TemporaryKey.pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: VS_KEY_2ABD5493DC484376   Desktop_Panel


неправильно обновляются иконки дисков

Что значит не правильно? скрин как не правильно и как должно - в студию

P.S. очень много гвонокода и кривая структуиризация проекта
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: Динамическое создание контролов

Сообщение netdemon » 18.11.2010 (Чт) 21:19

легко проверить двумя флешками. Сначала вставляем 2 флешки. Если вынуть ту, которую вставляли последней, то всё нормально, но если вынуть ту, которую вставляли первой- она останется, а последняя уберётся. Хотя по идее должно пройти полное обновление массива контролов в коллекции при изменении количества дисков.

на скрине сверху вниз. На первых двух видно диски M и N
На третьем после того как вынул диск M Картинка осталась а разделитель переместился. То есть контрол из коллекции удалён, но на панели он отображается.

Или может вместо того чтобы делать так:
Код: Выделить всё
For i = cnt - 1 To iCount Step -1
                    Me.Controls.Remove(Me.pDrive(i))            ' Удаляем значки
                Next i


Сделать вот так:
Код: Выделить всё
For i = 0 To iCount Step -1
                    Me.Controls.Remove(Me.pDrive(i))            ' Удаляем значки
                Next i
т.е. Удалить все значки, а потом создать по новой?

А если написать вот так:
Код: Выделить всё
For i = 0 To iCount - 1
                    RemoveHandler pDrive(i).MouseMove, AddressOf EventHandler ' Высвобождаем указатель на обработчик события
                    Me.pDrive(i).Image.Dispose()
                    Me.Controls.Remove(Me.pDrive(i + 1))
                Next i

                Array.Clear(Me.pDrive, 0, Me.pDrive.Length) ' Удаляем значки


то 3 последних диска становятся 'N:'
Вложения
test.jpg
test.jpg (55.37 Кб) Просмотров: 3089
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Динамическое создание контролов

Сообщение FireFenix » 18.11.2010 (Чт) 21:47

Ну так блин, твоя логика тащит
Код: Выделить всё
                For i = iCount To cnt - 1
                    RemoveHandler pDrive(i).MouseMove, AddressOf EventHandler ' Высвобождаем указатель на обработчик события
                Next i

                For i = cnt - 1 To iCount Step -1
                    Me.Controls.Remove(Me.pDrive(i))            ' Удаляем значки
                Next i

При любом удалении элемента у тебя удаляется всегда послений, а не тот который был удалён!

Тебе нужо проверять не по индексу в массиве, а по уникальному ключу, или имени, или букве диска, который ушёл и его убивать
И если уж обновляешь по таймеру, то изменяй картинки/контролы только при входящих изменениях, а не по каждому тику
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: Динамическое создание контролов

Сообщение netdemon » 18.11.2010 (Чт) 21:58

А это что по твоему? :
Код: Выделить всё
Dim cDrive As System.IO.DriveInfo                       ' Информация о диске

        Dim sDrive As String                                    ' Хранит букву диска
        Dim iCount As Integer                                   ' Количество дисков в системе
        Dim i As Integer
        Static cnt As Integer                                   ' Количество экземпляров значков дисков

        iCount = My.Computer.FileSystem.Drives.Count            ' Получаем количество дисков

        If cnt <> iCount Then                                   ' Если количество дисков и значков не совпадает
            If cnt > iCount Then                                ' и если значков больше чем дисков
                For i = 0 To iCount - 1
                    RemoveHandler pDrive(i).MouseMove, AddressOf EventHandler ' Высвобождаем указатель на обработчик события
                    Me.pDrive(i).Image.Dispose()
                    Me.Controls.Remove(Me.pDrive(i + 1))

                Next i

                Array.Clear(Me.pDrive, 0, Me.pDrive.Length) ' Удаляем значки

            End If
            cnt = iCount                                        ' запоминаем количество значков


            ReDim pDrive(iCount - 1)                            ' Меняем размерность массива значков
            For i = 0 To iCount - 1                             ' Цикл по количеству дисков


                sDrive = My.Computer.FileSystem.Drives.Item(i).ToString ' Получаем букву диска
                cDrive = My.Computer.FileSystem.GetDriveInfo(sDrive)    ' Получаем информацию о диске
                pDrive(i) = New PictureBox                              ' Создаём новый экземпляр картинки

                AddHandler pDrive(i).MouseMove, AddressOf EventHandler  ' Передаём указатель на MouseMove
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''' в другую процедуру.

                ' добавить значёк

                pDrive(i).Height = 25                                           ' Высота значка
                pDrive(i).Width = 25                                            ' Длина значка
                pDrive(i).SizeMode = PictureBoxSizeMode.StretchImage            ' Растянуть картинку в значке
                Select Case cDrive.DriveType                                    ' Получить тип диска 
                    Case IO.DriveType.Fixed                                     ' и загрузить картинку из
                        pDrive(i).Image = My.Resources.rPanel.HARD.ToBitmap     ' ресурса.
                    Case IO.DriveType.CDRom
                        pDrive(i).Image = My.Resources.rPanel.CDDVD.ToBitmap
                    Case IO.DriveType.Network
                        pDrive(i).Image = My.Resources.rPanel.NET.ToBitmap
                    Case IO.DriveType.NoRootDirectory
                        pDrive(i).Image = My.Resources.rPanel.netu.ToBitmap
                    Case IO.DriveType.Ram
                        pDrive(i).Image = My.Resources.rPanel.RAM.ToBitmap
                    Case IO.DriveType.Removable
                        pDrive(i).Image = My.Resources.rPanel.usb.ToBitmap
                    Case IO.DriveType.Unknown
                        pDrive(i).Image = My.Resources.rPanel.usb.ToBitmap

                End Select
                '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Расстановка значков
                pDrive(i).Left = 75 + i * (pDrive(i).Width + 5)
                pDrive(i).Top = 5
                pDrive(i).BorderStyle = BorderStyle.None
                pDrive(i).BackColor = Color.Transparent
                pDrive(i).ContextMenuStrip = mnuDisk
                pDrive(i).Tag = sDrive
                LineShape4.X1 = pDrive(i).Left + pDrive(i).Height + 5
                LineShape4.X2 = LineShape4.X1
                Button2.Left = LineShape4.X1 + 5
                Button3.Left = Button2.Left + Button2.Width + 5

            Next i
            Me.Controls.AddRange(pDrive)
        End If
       
    End Sub


Смотри коментарии. Если количество отображаемых дисков не совпадает с текущим, то выполняется весь код.
Удаление всех значков, а после чего они создаются по новой.
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Динамическое создание контролов

Сообщение FireFenix » 18.11.2010 (Чт) 22:02

netdemon писал(а):А это что по твоему?

Это по моему то, чего нету в том проекте, который ты выложил!
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: Динамическое создание контролов

Сообщение netdemon » 18.11.2010 (Чт) 22:16

Код: Выделить всё
Me.pDrive(i).Image.Dispose()
Array.Clear(Me.pDrive, 0, Me.pDrive.Length)

Только эти строчки добавил
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Динамическое создание контролов

Сообщение FireFenix » 18.11.2010 (Чт) 22:20

Совет тотжий что и в 3ем посте - неверная логика...
не нужно каждый раз создавать или удалять значки! Это сильно понижает производительность!

Тебе нужно полученный массив дисков сравнить с существующем, выявить отсутствующие или лишние диски и только их удалять/изменять, а не все при каждом изменении
Сравнивать можешь к примеру по имени диска
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: Динамическое создание контролов

Сообщение netdemon » 18.11.2010 (Чт) 22:25

Большое спасибо. Вот сам ошибку нашёл и переписал процедуру.

В данном случае проще будет удалять все значки и рисовать снова. Это будет намного быстрее и практичнее чем выявлять вынутый диск по буквам.
Код: Выделить всё
Private Sub DriveUpdate()


        Dim cDrive As System.IO.DriveInfo                       ' Информация о диске

        Dim sDrive As String                                    ' Хранит букву диска
        Dim iCount As Integer                                   ' Количество дисков в системе
        Dim i As Integer
        Static cnt As Integer                                   ' Количество экземпляров значков дисков

        iCount = My.Computer.FileSystem.Drives.Count            ' Получаем количество дисков

        If cnt <> iCount Then                                   ' Если количество дисков и значков не совпадает
            If cnt <> 0 Then                                ' и если значков больше чем дисков
                For i = 0 To pDrive.Count - 1
                    RemoveHandler pDrive(i).MouseMove, AddressOf EventHandler ' Высвобождаем указатель на обработчик события
                    Me.Controls.Remove(Me.pDrive(i))

                Next i

                Array.Clear(Me.pDrive, 0, Me.pDrive.Length) ' Удаляем значки

            End If
            cnt = iCount                                        ' запоминаем количество значков


            ReDim pDrive(iCount - 1)                            ' Меняем размерность массива значков
            For i = 0 To iCount - 1                              ' Цикл по количеству дисков


                sDrive = My.Computer.FileSystem.Drives.Item(i).ToString ' Получаем букву диска
                cDrive = My.Computer.FileSystem.GetDriveInfo(sDrive)    ' Получаем информацию о диске
                pDrive(i) = New PictureBox                              ' Создаём новый экземпляр картинки

                AddHandler pDrive(i).MouseMove, AddressOf EventHandler  ' Передаём указатель на MouseMove
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''' в другую процедуру.

                ' добавить значёк

                pDrive(i).Height = 25                                           ' Высота значка
                pDrive(i).Width = 25                                            ' Длина значка
                pDrive(i).SizeMode = PictureBoxSizeMode.StretchImage            ' Растянуть картинку в значке
                Select Case cDrive.DriveType                                    ' Получить тип диска 
                    Case IO.DriveType.Fixed                                     ' и загрузить картинку из
                        pDrive(i).Image = My.Resources.rPanel.HARD.ToBitmap     ' ресурса.
                    Case IO.DriveType.CDRom
                        pDrive(i).Image = My.Resources.rPanel.CDDVD.ToBitmap
                    Case IO.DriveType.Network
                        pDrive(i).Image = My.Resources.rPanel.NET.ToBitmap
                    Case IO.DriveType.NoRootDirectory
                        pDrive(i).Image = My.Resources.rPanel.netu.ToBitmap
                    Case IO.DriveType.Ram
                        pDrive(i).Image = My.Resources.rPanel.RAM.ToBitmap
                    Case IO.DriveType.Removable
                        pDrive(i).Image = My.Resources.rPanel.usb.ToBitmap
                    Case IO.DriveType.Unknown
                        pDrive(i).Image = My.Resources.rPanel.usb.ToBitmap

                End Select
                '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Расстановка значков
                pDrive(i).Left = 75 + i * (pDrive(i).Width + 5)
                pDrive(i).Top = 5
                pDrive(i).BorderStyle = BorderStyle.None
                pDrive(i).BackColor = Color.Transparent
                pDrive(i).ContextMenuStrip = mnuDisk
                pDrive(i).Tag = sDrive
                LineShape4.X1 = pDrive(i).Left + pDrive(i).Height + 5
                LineShape4.X2 = LineShape4.X1
                Button2.Left = LineShape4.X1 + 5
                Button3.Left = Button2.Left + Button2.Width + 5

            Next i
            Me.Controls.AddRange(pDrive)
        End If
       
    End Sub



А вот как теперь вынуть иконки из 'exe' файлов и отрисовать в пунктах меню.?
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Динамическое создание контролов

Сообщение FireFenix » 18.11.2010 (Чт) 23:15

netdemon писал(а):Это будет намного быстрее и практичнее чем выявлять вынутый диск по буквам.

Ну да, ты же внимательно читаешь, что тебе пишут...
не нужно каждый раз создавать или удалять значки! Это сильно понижает производительность!


netdemon писал(а):А вот как теперь вынуть иконки из 'exe' файлов и отрисовать в пунктах меню.?

http://tinyurl.com/37zhnpw
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: Динамическое создание контролов

Сообщение netdemon » 18.11.2010 (Чт) 23:27

Я вижу ты не ищешь лёгких путей. Не проще было так и написать одним словом - "ПОГУГЛИ!!!" :D

Я столько парился с этими иконками, а всё оказалось проще :
Код: Выделить всё
Public Sub GetSettings()

       

        Dim Progs() As String
        Dim Games() As String
        Dim Pcount, GCount As Integer
       
        Dim menuImageSize As System.Drawing.Size

        menuImageSize.Height = 13 : menuImageSize.Width = 13
        Pcount = My.Settings.Progs.Count
        GCount = My.Settings.Games.Count

        ReDim Progs(Pcount - 1)
        ReDim Games(GCount - 1)

        For i = 0 To Pcount - 1
            Progs(i) = My.Settings.Progs.Item(i).ToString
            frmBar.CMS1.Items.Add(GetMenuItemText(Progs(i)), Drawing.Icon.ExtractAssociatedIcon(Progs(i)).ToBitmap)
        Next i

        For i = 0 To GCount - 1
            Games(i) = My.Settings.Games.Item(i).ToString
            frmBar.CMS2.Items.Add(GetMenuItemText(Games(i)), Drawing.Icon.ExtractAssociatedIcon(Games(i)).ToBitmap)
        Next i
    End Sub



Хакер: Тему можно закрыть.
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Динамическое создание контролов

Сообщение alibek » 20.11.2010 (Сб) 10:20

Закрываю.
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList