Как я могу увеличить имя переменной, например, bar1, bar2, bar3, V BNET в поле For l oop? - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь упростить мой код:

        bar_x(0) = delocateX(bar1.Left)
        bar_y(0) = delocateY(bar1.Top)
        bar_x(1) = delocateX(bar2.Left)
        bar_y(1) = delocateY(bar2.Top)
        bar_x(2) = delocateX(bar3.Left)
        bar_y(2) = delocateY(bar3.Top)
        bar_x(3) = delocateX(bar4.Left)
        bar_y(3) = delocateY(bar4.Top)

, который продолжается до 29, и я пытался использовать For l oop, чтобы уменьшить количество строк и упростить код. Это моя попытка:

     Function set_bar_positions()
         Dim i As Double
         For i = 0 To 29
             bar_x(i) = delocateX(("bar" & (i + 1)).Left)
             bar_y(i) = delocateY("bar" & (i + 1) + ".Top")
         Next

Как мне упростить эту функцию? enter image description here

Ответы [ 3 ]

0 голосов
/ 11 января 2020

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

Вы можете сделать то же самое и упростить это в конструкторе:

Private bars() as New Control 'make an array of controls


'In the constructor
Sub New(...)

  'If you have 29 bars
  ReDim bars(28)
  bars(0) = bars1
  bars(1) = bars2
  ...

Помните, что массивы начинаются с 0, поэтому вам нужно либо немного поработать над математикой, когда вы хотите bars1, потому что в массиве он имеет индекс 0, либо вы можете запустить свой массив, чтобы иметь 30 элементов, вставьте bars1 в барах (1) et c и просто игнорировать первый элемент массива

Помните, что это устанавливает новую ссылку на существующий объект; Вы можете изменить что-либо в самом объекте, например, bars1.Left = 100 и bars(1) увидит это изменение, но если вы измените bars1 для всего нового объекта, то bars (1) останутся указывать на старый объект, и его тоже нужно будет изменить

0 голосов
/ 17 марта 2020

Мне удалось найти самое простое решение:

Function set_bar_positions()
        For i = 0 To 29
            Dim cs = Me.Controls.Find("bar" & i.ToString(), True)
            If cs.Any() Then
                Dim c = cs.First()
                bar_x(i) = delocateX(c.Left)
                bar_y(i) = delocateY(c.Top)
            End If
        Next
    End Function

В ответе djv

0 голосов
/ 09 января 2020

Тот факт, что вы используете Left и Top, предполагает, что эти переменные относятся к элементам управления. В этом случае вы можете получить доступ к элементам управления по имени через коллекцию Controls родительского элемента. Предполагая, что это элементы управления, добавленные непосредственно в форму в конструкторе:

bar_x(i) = delocateX(Controls("bar" & (i + 1)).Left)
bar_y(i) = delocateY(Controls("bar" & (i + 1)).Top)

Обратите внимание, что это не работает с переменными. Просто удобно, когда вы добавляете элемент управления в форму в конструкторе, создаваемое поле имеет то же имя, которое содержится в свойстве Name элемента управления.

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