Forum: PC-Programmierung VB.net: Dynamisch Objekte zur Laufzeit generiern


von Markus B. (rusticus)


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

von Läubi .. (laeubi) Benutzerseite


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...).

von Markus B. (rusticus)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich meinte damit das du Debugausgaben machen sollt um Festzustellen ob 
überhaupt die Funktion aufgerufen wird, und in der Schleife eventuell 
mal die Verwendeten Parameter ausgeben.

Markus B. schrieb:
> Und zur Position, eigentlich sollte es an die Position der Maus gesetzt
> werden
Alle 9 Boxen?

von Markus B. (rusticus)


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?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Markus B. schrieb:
> Abfrage auf X und Y kommt jeweils immer nur eine 0. liegts daran vlt?
Das mußt du doch entscheiden ob in deiner Logik das Auftreten von "0" 
als Postion zu irgendwelchem Fehlverhalten führen könnte.

von Markus B. (rusticus)


Lesenswert?

Läubi .. schrieb:
> Das mußt du doch entscheiden ob in deiner Logik das Auftreten von "0"
> als Postion zu irgendwelchem Fehlverhalten führen könnte.

Das versteh ich nicht ganz

Ich habe doch meine X und Y Position klar mit einen Punkt definiert?
X = 400 und Y = 15, unabhängig vom Rest? Oder seh ich das falsch?!

von VBler (Gast)


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?

von Markus B. (rusticus)


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?!

von VBler (Gast)


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

von Markus B. (rusticus)


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 ;)

von VBler (Gast)


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?

von Markus B. (rusticus)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.