2014-12-09 3 views
0

Мне просто интересно, можно ли в Visual Basic 2010 Express прокрутить, скажем, серию RectangleShapes, но использовать цикл For ... Next и проверить конкретное свойство каждого имени прямоугольников. Например:Переменные переменные?

Private Sub RectangleIntersect(ByVal rect As Microsoft.VisualBasic.PowerPacks.RectangleShape) 
    For c = 1 To 31 
     RectangleShape('and then add the c value to the name).Location 
    Next 
End Sub 

Справка высоко ценится. Спасибо за ваше время!

+0

Это немного расплывчато. Можете ли вы более четко объяснить, что вы подразумеваете под «каждой конкретной собственностью»? –

+0

Обратите внимание, что форма прямоугольника «PowerPacks» не совпадает с NET Rectangle, которая может смутить тех, кто не замечает этого в коде. – Plutonix

+0

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

ответ

0

Предполагая, что вы используете один и тот же ShapeContainer (ShapeContainer1 по умолчанию) для всех ваших RectangleShapes:

Private Sub RectangleIntersect(ByVal rect As Microsoft.VisualBasic.PowerPacks.RectangleShape) 
    For Each otherRect As PowerPacks.RectangleShape In ShapeContainer1.Shapes.OfType(Of PowerPacks.RectangleShape)() 
     If Not (otherRect Is rect) Then 
      If otherRect.Bounds.IntersectsWith(rect.Bounds) Then 
       Debug.Print(otherRect.Name & " intersects with " & rect.Name) 
      End If 
     End If 
    Next 
End Sub 

Чтобы получить их "в порядке", как вы просили, вы можете сделать:

Private Sub RectangleIntersect(ByVal rect As Microsoft.VisualBasic.PowerPacks.RectangleShape) 
    For c As Integer = 1 To 31 
     Dim c2 As Integer = c 
     Dim R As RectangleShape = ShapeContainer1.Shapes.OfType(Of PowerPacks.RectangleShape).FirstOrDefault(Function(x) 
                             Return x.Name = "RectangleShape" & c2 
                            End Function) 
     If Not IsNothing(R) AndAlso Not (R Is rect) Then 
      If R.Bounds.IntersectsWith(rect.Bounds) Then 
       Debug.Print(R.Name & " intersects with " & rect.Name) 
      End If 
     End If 
    Next 
End Sub 
0

В блоке кода, который вы предоставили, я предполагаю, что у вас есть куча объектов RectangleShape где-то в родительском классе, которые называются RectangleClassN, где N равно от 1 до 31.

Что вам нужно в качестве параметра для вашего метода - это некоторая коллекция RectangleShapes, а не то, что вы определили как один RectangleShape. Затем вы сможете перебирать их.

Private Sub RectangleIntersect(ByVal rectangles As IEnumerable(Of RectangleShape)) 

    For Each rs As RectangleShape in rectangles 

     If rs.Location = "" Then 

      'something 

     End If 

    Next 

End Sub 

Когда вы вызываете метод, вам необходимо передать какую-то коллекцию, содержащую несколько объектов. См. Надуманный пример ниже.

Dim myRectangles As New List(Of RectangleShape)() 
myRectangles.Add(RectangleShape1) 
myRectangles.Add(RectangleShape2) 

RectangleIntersect(myRectangles) 

Поскольку сбор каждого отдельного объекта будет мучительной, вы могли бы сделать что-то вроде петли через все элементы управления или объектов, которые принадлежат к какой-то контейнер и проверить их тип. Если их тип RectangleObject, добавьте их в коллекцию. Или вы даже можете выполнить этот код внутри вашего метода RectangleIntersect.

For Each rs As RectangleShape In parentContainer.Controls ' or whatever this would be. Children? it depends on what the container is 

... 

Next 
Смежные вопросы