VB.net: Dynamisch Objekte zur Laufzeit generiern

#1969293
Lesenswert?

Hallo,

ich versuche seit 2 Tagen verzweifelt zur Laufzeit dynamisch Objekte zu 
erzeugen und diese zu bestimmen.

Konkret, ich klicke auf ein Panel, will eine PictureBox erstellen, 
dieser PictureBox geb ich  beim Start eigenschaften wie Location und 
Image mit und würde diese PictureBox dann gerne also Member meiner 
Klasse verändern, dh Location und Image. Ich will also bis zu 8 Objekte 
haben mit dem Namen Fahrzeug, da ich weiß das es nicht mehr als 8 
werden, habe ich ein Array daraus gemacht.

Allerdings zeigt es mir nach wie vor nicht mal eine PictureBox an.
1
Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
2
        Dim Mouse_Postion1 As String
3
        Mouse_Postion1 = Cursor.Position.X.ToString
4
        Dim Mouse_Postion2 As String
5
        Mouse_Postion2 = Cursor.Position.Y.ToString
6

7
        Dim indexcount As Integer
8

9
        For indexcount = 0 To maxIC
10
            pic(indexcount) = New PictureBox
11
            pic(indexcount).Name = "Picturebox" & indexcount.ToString + 1
12
            pic(indexcount).Top = 12
13
            pic(indexcount).BackColor = Color.Transparent
14
            pic(indexcount).Location = New Point(pic(indexcount).Location.X = Mouse_Postion1, pic(indexcount).Location.Y = Mouse_Postion2)
15
            pic(indexcount).Visible = True
16
            pic(indexcount).Image = My.Resources.loch
17
            pic(indexcount).Height = 22
18
            pic(indexcount).Width = 17
19

20
            Me.Controls.Add(pic(indexcount))
21
        Next indexcount
22

23
 End Sub

So hätte ich es probiert, aber wie gesagt ohne Erfolg, ich hab schon so 
viele Lösungen in Google ausprobiert und bin nicht vorwärts gekommen.
Ich lese immer in den OpenBooks von Galileo aber eine Lösung dafür 
konnte ich nicht finden.


Hat vlt wer einen Link oder Lösungsvorschlag für mich? Ein Link mit 
einer Erklärung wäre mir lieber, dann lern ich noch was daraus ;)


mfg
Persönliche Seite #1969308
Lesenswert?

Markus B. schrieb:
> einer Erklärung wäre mir lieber
Und mir wäre lieber wenn du wenigstens mal sagst was den nicht so 
klappt wie gedacht? Compilefehler? Warnungen? Explodiert dein PC beim 
starten des Progamms?
Möglicherweise mußt du einfach den Container neu zeichnen?
Und Debugausgabe sind häufig auch nicht soooo verkehrt... außerdem sieht 
es so aus als ob du alle Boxen auf die gleiche Position setzt (wozu du 
hier ein Array benötigst ist mir auch schleierhaft wenn du später nix 
mher damit anstellst...).
#1970366
Lesenswert?

Es passiert schlichtweg nichts, keine Debugangaben oder Compilerfehler, 
es passiert einfach rein gar nix

Und nein ich will diese Boxen später bewegen, nur wär ich schon mal sehr 
froh wenn ich überhaupt eine Box erstellen könnte

Und zur Position, eigentlich sollte es an die Position der Maus gesetzt 
werden
#1970480
Lesenswert?

1
    Dim car_counter As Integer = 0
2

3
    Dim auto(8) As PictureBox   
4

5

6

7
Private Sub ausfahrt_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseDown
8

9
        auto(car_counter) = New PictureBox
10
        auto(car_counter).Name = "auto_" & car_counter
11
        auto(car_counter).Location = New Point(auto(car_counter).Location.X = (400 + car_counter * 10), auto(car_counter).Location.Y = 15)
12
        auto(car_counter).Visible = True
13
        auto(car_counter).SizeMode = PictureBoxSizeMode.AutoSize
14

15
        Me.Controls.Add(auto(car_counter))
16

17
        Label1.Text = auto(car_counter).Location.X
18

19
    End Sub
20

21
    Private Sub ausfahrt_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseUp
22
        auto(car_counter).Image = select_car_color(random_car)
23
        car_counter += 1
24
        If car_counter >= 8 Then
25
            car_counter = 0
26
        End If
27
    End Sub


Mit dem Label hab ich mir jetzt eine Debuganzeige gebastelt, weil ich 
mit Einzelschritten nicht weiter gekommen bin


Zuerst habe ich mir "OK" anzeigen lassen, ging einwandfrei, danach hab 
ich mir "car_counter" anzeigen lassen, hat auch zuverlässig 
funktioniert, nun wollte ich mir die Location anzeigen lassen, bei der 
Abfrage auf X und Y kommt jeweils immer nur eine 0. liegts daran vlt?
Gast #1975547
Lesenswert?

Hallo,

1. Wenn du die Location Eigenschaft verwendest ist die Top Angabe weiter 
oben sinnlos, da sie von Location überschrieben wird.

2. Point wird wie folgt verwendet: Object.Location = New 
Point(xcoordinate, ycoordinate)
Ohne ein =  . Mit dem = verursachts du nur einen Boolschen Wert True 
oder False.

3. Wie ist pic() definiert?
#1975963
Lesenswert?

VBler schrieb:
> Hallo,
>
> 1. Wenn du die Location Eigenschaft verwendest ist die Top Angabe weiter
> oben sinnlos, da sie von Location überschrieben wird.
>
> 2. Point wird wie folgt verwendet: Object.Location = New
> Point(xcoordinate, ycoordinate)
> Ohne ein =  . Mit dem = verursachts du nur einen Boolschen Wert True
> oder False.
>
> 3. Wie ist pic() definiert?

Hallo,

ok das mit der Location teste ich
Aber der aktuelle Code ist der vom 10.12.
Da ist kein .Top mehr enthalten?!
Gast #1976177
Lesenswert?

Hallo Markus,

Entschuldige, hat sich auf den ersten Beitrag bezogen.
Hab's jetzt noch mal selbst getestet, der Code müsste ungefähr so 
aussehen (so funktioniert's zumindest bei mir):
1
    Public car_counter As Integer = 0
2
    Public auto(8) As PictureBox   
3

4
Private Sub ausfahrt_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseDown
Es ist besser, Variablen außerhalb von Subs und Functions mit Public 
oder Privat zu deklarieren.
Ich geh hier mal davon aus, dass 'ausfahrt' eine PictureBox ist.
1
        auto(car_counter) = New PictureBox
2
        auto(car_counter).Name = "auto_" & car_counter
3
        auto(car_counter).Location = New Point(400 + car_counter * 10, 15)
In den Point-Konstrukor musst du die Werte wie oben reinschreiben. Bei 
deiner Variante würde er für x und y 'False' übergeben.
1
        auto(car_counter).Visible = True
2
        auto(car_counter).SizeMode = PictureBoxSizeMode.AutoSize
3
        auto(car_counter).Size = new Size(50, 50)
Die letzte Zeile einfügen wenn du die Größe definieren willst.
1
        ausfahrt.Controls.Add(auto(car_counter))
Wenn, wie oben angenommen 'ausfahrt' eine Picturebox ist, dann ME durch 
ausfahrt ersetzen, um die neuen Pictureboxes innerhalb von ausfahrt 
anzuzeigen.
1
        Label1.Text = auto(car_counter).Location.X
2

3
    End Sub
4

5
    Private Sub ausfahrt_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseUp
6
        auto(car_counter).Image = select_car_color(random_car)
7
        car_counter += 1
8
        If car_counter >= 8 Then
9
            car_counter = 0
10
        End If
11
    End Sub
Bitte beachte, dass die Pictureboxes relativ weit rechts erscheinen 
werden, da bei Location für x=400Pixel+ angegeben sind. Hoffe ich konnte 
dir helfen.
Schönen Abend
#1976376
Lesenswert?

Also "ausfahrt" ist ein Panel, aber sollte von der Funktion her egal 
sein

Und die PictureBox soll innerhalb der Form erscheinen, also doch 
"Me.Controls..."

Wenn ich nun aba eine Größe angebe, hebe ich dann nicht das AutoSize 
auf?

Und die Position wurde händisch ausgetestet, passt also ;)
Gast #1976433
Lesenswert?

Abend,

Also wenn die Pictureboxes in der Form erscheinen sollen, stimmt 
natürlich me.controls..

Eine Größenangabe hebt Autosize nicht auf, ganz im Gegenteil. Ist 
eigentlich nur dazu gedacht, im vorraus der Picturebox eine definierte 
Größe zu geben. Hast recht, ist in diesem Fall wohl eher unnötig.

Funktioniert der Code inzwischen schon?
#2022341
Lesenswert?

hallo,

also nach langer Zeit bin ich wieder an dem Thema dran
1
Public Class Form1
2

3

4

5
    Dim car_moving As Integer = 0
6

7
    Dim random_car As Integer = 0
8

9
    Dim car_color As Bitmap
10

11

12

13
    Dim car_counter As Integer = 0
14

15

16

17
    Dim auto(8) As PictureBox
18

19

20

21

22

23

24

25
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
26

27
        'random_car
28

29

30

31

32

33
        If random_car >= 0 Then
34

35
            random_car += 1
36

37
        End If
38

39
        If random_car = 9 Then
40

41
            random_car = 1
42

43
        End If
44

45

46

47
    End Sub
48

49

50

51

52

53
    Private Sub ausfahrt_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseDown
54

55

56

57
        auto(car_counter) = New PictureBox
58

59
        auto(car_counter).Name = "auto_" & car_counter
60

61
        auto(car_counter).Location = New Point(400 + car_counter * 10, 15)
62

63
        auto(car_counter).Visible = True
64

65
        auto(car_counter).SizeMode = PictureBoxSizeMode.AutoSize
66

67
        auto(car_counter).Size = New Size(50, 50)
68

69

70

71
        Me.Controls.Add(auto(car_counter))
72

73

74

75
        Label1.Text = auto(car_counter).Location.Y
76

77
        Label2.Text = auto(car_counter).Location.X
78

79
    End Sub
80

81

82

83
    Private Sub ausfahrt_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseUp
84

85
        auto(car_counter).Image = select_car_color(random_car)
86

87
        car_counter += 1
88

89
        If car_counter >= 8 Then
90

91
            car_counter = 0
92

93
        End If
94

95

96

97
    End Sub
98

99

100

101
    Public Function select_car_color(ByVal color As Integer) As Bitmap
102

103

104

105
        Select Case color
106

107
            Case 1
108

109
                select_car_color = My.Resources.auto_1
110

111
            Case 2
112

113
                select_car_color = My.Resources.auto_2
114

115
            Case 3
116

117
                select_car_color = My.Resources.auto_3
118

119
            Case 4
120

121
                select_car_color = My.Resources.auto_4
122

123
            Case 5
124

125
                select_car_color = My.Resources.auto_5
126

127
            Case 6
128

129
                select_car_color = My.Resources.auto_6
130

131
            Case 7
132

133
                select_car_color = My.Resources.auto_7
134

135
            Case 8
136

137
                select_car_color = My.Resources.auto_8
138

139
            Case Else
140

141
                select_car_color = My.Resources.auto_1
142

143
        End Select
144

145

146

147
    End Function
148

149
End Class

Funktionieren tut es aber leider immer noch nicht

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren