Удаление элементов управления изображением в пользовательской форме с помощью цикла - PullRequest
0 голосов
/ 17 января 2019

Я создал пользовательскую форму, которая создает до 6 элементов управления изображениями и заполняет их изображениями при нажатии кнопки команды (с помощью флажков вы можете выбрать изображения).

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

( Помните: вся идея состоит в том, чтобы сделать эту процедуру удаления как первое действие в подпрограмме; я не хочу Unload Me и т.д. ...)

Option Explicit
Dim i, k As Byte

Private Sub cmdGetGraphics_Click()
Dim sum_cb As Byte, cb_slct As Byte, y As Byte, sum_img As Byte
Dim Img As MSForms.Image
Dim Control As Control
Dim F(1 To 6) As Integer
Dim img_name As String

For Each Control In Me.Controls
    If TypeName(Control) = "Image" Then
        For i = 1 To 6
          Me.Controls.Remove "Image" & i 'error occurs here: Invalid Argument
        Next i
    End If
Next Control

1 Ответ

0 голосов
/ 20 января 2019

I) Что стоит за проблемой «Неверный аргумент»?

Я предполагаю, что вы создали дополнительные элементы управления изображением, приводящие к ошибке времени выполнения "Неверный аргумент" - см. Случай [2.2].

[1] Как только вы найдете первый Контроль изображения в цикле For Each, Вы уже удалили полный набор элементов управления «Изображение» и i в цикле For i = 1 to 6. Важно знать, что цикл For Each не исправляет исходное содержимое в Me.Controls текущими удалениями и попытается проанализировать всю коллекцию (т.е. Image2, Image3 и т. д. на следующих шагах).

Кейс [2.1] Если ваш набор «Изображение» и элементов управления i * ограничен только этими 6 элементами , не возникнет никакой ошибки времени выполнения "Неверный аргумент" вообще: Более поздняя TypeName проверка Image2 - которая больше не существует - приводит к типу Object вместо Image и таким образом предотвращает дальнейшую попытку удалить ваши шесть элементов управления «Image» и «i» снова.

Дело [2.2] Вы создали дополнительные элементы управления изображением : как только цикл For Each проверяет дополнительный элемент управления изображением, тест TypeName находит тип Image и пытается снова удалить уже удаленную six pack . => Таким образом, имя элемента управления не существует, аргумент фактически недействителен.

II. Заключение

В любом случае вам следует избегать применения метода .Remove к уже удаленным элементам управления. Например, было бы достаточно использовать следующий код раз и навсегда:

For i = 1 To 6
    Me.Controls.Remove "Image" & i          ' property doesn't need brackets
Next i 

IMO было бы даже лучше, однако переосмыслить логику кодирования и повторно использовать элементы управления изображением вместо , удаляя их. Таким образом, вы можете легко очистить их свойство ► .Picture, временно назначив значение LoadPicture(vbNullString) и переназначая имена выбранных изображений с помощью LoadPicture, как только они вам понадобятся. - С.ф. Как очистить изображение в пользовательской форме?

Дополнительные подсказки

Строка объявления Dim i, k As Byte означает, что не указанная переменная i по умолчанию является Variant. - Так что я бы предложил сказать Dim i As Long, k As Byte (в VBA нет никакого преимущества в памяти, чтобы объявить As Integer, особенно в отношении числа строк или столбцов, превышающего целочисленное ограничение; оставим в стороне функции API, где могут понадобиться целые числа)

Неправильно использовать текущий экземпляр пользовательской формы как самоуничтожающийся объект в самом кодовом модуле пользовательской формы с помощью Unload Me. Для более глубокого понимания рекомендую прочесть статью «UserForm1.Show?» .

Синтаксис - см. Справку MS Метод удаления

...