Как мне восстановить элемент управления, который оказался в ловушке за пределами кадра? - PullRequest
4 голосов
/ 05 июня 2011

Это касается только фреймов, и я столкнулся с этим только в Excel 11, но, поскольку это, очевидно, ошибка, возможно, она была исправлена ​​в более поздних версиях, которые я не пробовал.Если вы часто используете фреймы, это в конечном итоге вас укусит.

Проблема

Начните с фрейма и любого другого элемента управления, содержащегося в этом фрейме, скажем, метка,Возьмите метку за правый край (скрещенные стрелки) и перетащите ее через левую границу рамки, пока не увидите ее пунктирный контур за рамкой.Затем, не отпуская мышь, перетащите ее обратно к границе, пока контур не исчезнет, ​​и отпустите кнопку мыши в этой точке.

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

Работает аналогично с нижней и правой границами фрейма, за исключением того, что вы можете восстановитьМетка, увеличив Рамку.Но с верхней и левой границами это не так.

На недостающую метку можно вставить вкладку (она отображается в раскрывающемся списке «Свойства»), но при этом она не выбрана, и ее нельзя удалить, поскольку она можетне будет выбран.Нажатие на имя метки в раскрывающемся списке свойств ничего не делает.

Если , вы знаете, какой кадр проглотил метку (как мы делаем в этом примере), и , если вы знаете, под какой границей этого фрейма он находится (как мы делаем в этом примере), тогда есть способ восстановить отсутствующую метку.Но много раз это будет не так.Если вы на самом деле не видите исчезновение метки, она может легко остаться незамеченной в тот момент, особенно когда кадры накладываются друг на друга.

Один из способов восстановить метку (из-под известной границы в известной рамке) - это использоватьVBE Tools Стивена Буллена (и даже без учета этой проблемы, если у вас не установлен этот замечательный Addin, вы должны это сделать).Нажмите один раз на фрейм (который, как вы знаете, что-то скрывает) и выберите «Все» в меню «Правка» ( Ctrl + A не работает для этого).Затем нажмите и удерживайте Alt-right + arrow (потому что здесь известно, что недостающая метка находится под границей LH) и наблюдайте, как она застенчиво выползает из-под границы рамки.Это лучше, чем просто выбрать все и перетащить все элементы управления вправо, потому что это позволяет заменить все остальные элементы управления в их исходное положение, просто перевернув процесс ( Alt-Left + Arrow) до тех пор, пока все снова не станет правильным.Если вам необходимо идеальное восстановление пикселей в исходном положении, просто посчитайте щелчки правой стрелки, избавьтесь от восстановленной метки, снова выберите «Все» и сделайте то же количество щелчков левой стрелки.

Вопрос

1) Как найти, восстановить и / или удалить элемент управления, захваченный таким образом, если я не знаю, в каком кадре он находится?

Ответы [ 3 ]

3 голосов
/ 05 июня 2011

Вы можете запустить простой макрос для формы, чтобы обнаружить (и удалить, переместить, что хотите) скрытые элементы управления

Private Sub UserForm_Click()
    Dim ctrl As Control

    For Each ctrl In Me.Controls
        If ctrl.Left + ctrl.Width < 0 Or ctrl.Top + ctrl.Height < 0 Then
            Debug.Print ctrl.Name & " " & ctrl.Parent.Name
        End If
    Next
End Sub
0 голосов
/ 26 октября 2018

Самое простое решение этой проблемы: 1. Нажмите на фрейм, который, по вашему мнению, вы потеряли. 2. Выберите все элементы управления, используя Ctrl + A 3. Перетащите все их вместе вниз (если они были потеряны на верхней границе)

0 голосов
/ 05 июня 2011

@ Крис, спасибо за ответ, но я не упомянул о том, что в моей рабочей форме в любой момент времени может быть 50-100 элементов управления, которые были перемещены (временно) за пределы их содержащих фреймов, иВаш метод найдет все это.Это было бы хорошо, если бы я всегда знал имя отсутствующего элемента управления, и большую часть времени я буду знать это, но не всегда.

Однако ваш метод определенно поставил меня на правильный путь.Я начал с поиска элементов управления, которые находятся за пределами содержащей их рамки и прилегают к ней, однако оказывается, что они не прилегают к ней, а находятся на расстоянии до 4 пикселей от рамки (в зависимости от того, где именноконтроль был сброшен).И просто для дополнительного извращения, элементы управления, которые исчезли под верхней и левой границами кадра, (я думаю) всегда находятся за пределами кадра, но элементы управления, которые исчезли под правой и нижней границами, могут быть 0-4 пикселя либо внутриили вне кадра.Довольно некрасиво.

Итак, вот что, кажется, работает хорошо.

Dim ctrl As Control
For Each ctrl In Me.Controls
  With ctrl
    If typeName(.parent) = "Frame" then
       If .Left + .Width > -4 And .Left + .Width < 0 Then Debug.Print .Name & " " & .Parent.Name & " top border"
       If .Top + .Height > -4 And .Top + .Height < 0 Then Debug.Print .Name & " " & .Parent.Name & " left border"
       If .Left > .Parent.Width - 4 And .Left < .Parent.Width + 4 Then Debug.Print .Name & " " & .Parent.Name & " right border"  
       If .Top > .Parent.Height - 4 And .Top < .Parent.Height + 4 Then Debug.Print .Name & " " & .Parent.Name & " bottom border"
    End if
  End With
Next
...