www.mikrocontroller.net

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


Autor: Markus B. (rusticus)
Datum:

Bewertung
0 lesenswert
nicht 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.
Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
        Dim Mouse_Postion1 As String
        Mouse_Postion1 = Cursor.Position.X.ToString
        Dim Mouse_Postion2 As String
        Mouse_Postion2 = Cursor.Position.Y.ToString

        Dim indexcount As Integer

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

            Me.Controls.Add(pic(indexcount))
        Next indexcount

 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...).

Autor: Markus B. (rusticus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus B. (rusticus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    Dim car_counter As Integer = 0

    Dim auto(8) As PictureBox   



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

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

        Me.Controls.Add(auto(car_counter))

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

    End Sub

    Private Sub ausfahrt_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseUp
        auto(car_counter).Image = select_car_color(random_car)
        car_counter += 1
        If car_counter >= 8 Then
            car_counter = 0
        End If
    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?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus B. (rusticus)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: VBler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus B. (rusticus)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: VBler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
    Public car_counter As Integer = 0
    Public auto(8) As PictureBox   

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.
        auto(car_counter) = New PictureBox
        auto(car_counter).Name = "auto_" & car_counter
        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.
        auto(car_counter).Visible = True
        auto(car_counter).SizeMode = PictureBoxSizeMode.AutoSize
        auto(car_counter).Size = new Size(50, 50)
Die letzte Zeile einfügen wenn du die Größe definieren willst.
        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.
        Label1.Text = auto(car_counter).Location.X

    End Sub

    Private Sub ausfahrt_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ausfahrt.MouseUp
        auto(car_counter).Image = select_car_color(random_car)
        car_counter += 1
        If car_counter >= 8 Then
            car_counter = 0
        End If
    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

Autor: Markus B. (rusticus)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: VBler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus B. (rusticus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

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



    Dim car_moving As Integer = 0

    Dim random_car As Integer = 0

    Dim car_color As Bitmap



    Dim car_counter As Integer = 0



    Dim auto(8) As PictureBox







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

        'random_car





        If random_car >= 0 Then

            random_car += 1

        End If

        If random_car = 9 Then

            random_car = 1

        End If



    End Sub





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



        auto(car_counter) = New PictureBox

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

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

        auto(car_counter).Visible = True

        auto(car_counter).SizeMode = PictureBoxSizeMode.AutoSize

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



        Me.Controls.Add(auto(car_counter))



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

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

    End Sub



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

        auto(car_counter).Image = select_car_color(random_car)

        car_counter += 1

        If car_counter >= 8 Then

            car_counter = 0

        End If



    End Sub



    Public Function select_car_color(ByVal color As Integer) As Bitmap



        Select Case color

            Case 1

                select_car_color = My.Resources.auto_1

            Case 2

                select_car_color = My.Resources.auto_2

            Case 3

                select_car_color = My.Resources.auto_3

            Case 4

                select_car_color = My.Resources.auto_4

            Case 5

                select_car_color = My.Resources.auto_5

            Case 6

                select_car_color = My.Resources.auto_6

            Case 7

                select_car_color = My.Resources.auto_7

            Case 8

                select_car_color = My.Resources.auto_8

            Case Else

                select_car_color = My.Resources.auto_1

        End Select



    End Function

End Class

Funktionieren tut es aber leider immer noch nicht

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.