Как я могу ускорить массовое создание элементов управления во время выполнения? - PullRequest
1 голос
/ 16 декабря 2009

Я застрял с VB6 и использую Form.Controls.Add(...) для создания группы элементов управления во время выполнения.

К сожалению, это, кажется, очень медленный процесс с сильным мерцанием.

Есть ли способ ускорить процесс? Возможно, можно как-то уведомить VB6, что я делаю массовую вставку новых элементов управления.

Ответы [ 4 ]

5 голосов
/ 16 декабря 2009

Вы можете использовать скрытую картинку для контейнера, как это

Set oCtl = Controls.Add("VB.TextBox", "txtMy1", picHidden)

Затем вы можете либо показать контейнер, который будет работать так быстро, насколько это возможно, либо скрыть элементы управления и сбросить контейнер, как этот

oCtl.Visible = False
Set oCtl.Container = Form1 ' or picHidden.Container

В любом случае вы можете уменьшить мерцание, используя скрытый контейнер.

3 голосов
/ 16 декабря 2009

Отключение формы при создании элементов управления помогает. Если это практично, это еще больше поможет установить Visible = False в этой форме.

3 голосов
/ 16 декабря 2009

Для этого я использовал контрольные массивы. Создайте отдельный экземпляр каждого типа элемента управления, который вам нужен - текстовое поле, метка, раскрывающийся список и т. Д. Установите для свойства Index каждого элемента управления значение 0 (что превращает каждый элемент управления в базовый элемент управления для массива элементов управления). , Теперь установите для других свойств то, что имеет смысл для каждого типа элемента управления в вашем приложении. Эти свойства будут применяться к каждому новому элементу управления при его создании. Убедитесь, что для свойства Visible установлено значение False.

Затем добавьте элементы управления во время выполнения с помощью оператора Load. Расположите их соответствующим образом, установите любые уникальные свойства, загрузите ваши данные и т. Д., Затем, когда все это будет сделано, просмотрите каждый массив элементов управления по индексу и установите для свойства Visible каждого элемента управления значение True. Это достаточно быстро, чтобы избежать мерцания, по крайней мере, для разумного количества элементов управления. Таким образом, я обработал почти 200 элементов управления без мерцания.

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

Да, вам нужно управлять индексом для длины каждого массива элемента управления, чтобы сообщить вам, можете ли вы использовать повторно или создать новый, но пара вспомогательных функций может значительно упростить необходимое отслеживание. Примерно так:

Set newTextBox = GetNextTextBox

, где функция GetNextTextBox обрабатывает отслеживание всех доступных элементов управления текстовым полем, и какой из них «следующий», поэтому он может решить, может ли он повторно использовать существующий или создать новый.

У вас также могут быть такие функции, как, например, ResetTextBoxes, которые делают все текстовые поля невидимыми и сбрасывают счетчик «следующий доступный».

1 голос
/ 18 декабря 2009

Я часто использую вызов API LockWindowUpdate, чтобы отключить рисование в списке при добавлении большого количества элементов. Он значительно ускоряет загрузку и прост в объявлении и использовании. Я предполагаю, что это будет работать так же хорошо для формы. Но поскольку Кен Уайт указал мне на эту статью , в которой объясняется, почему использование LockWindowUpdate неправильно, я начал изменять свой код, чтобы вместо него использовать SendMessage. Пока что он работает так же хорошо, как и LockWindowUpdate.

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_SETREDRAW = &HB

Private Sub AddMyControls()

    ' The SendMessage function returns 0 for this message if successful,
    ' instead of using Call assign the return to a variable to check the success

    Call SendMesssage(Me.hwnd, WM_SETREDRAW, False, 0) ' prevent re-drawing while adding controls
    ' .... add controls

    ' It might be nice to know if the function was successful here
    ' or re-drawing might not be re-enabled and the user would wonder what's up
    Call SendMesssage(Me.hwnd, WM_SETREDRAW, True, 0)  ' re-enable drawing

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