Wie erstelle ich mit VB.NET 2003 eine Zeichnung aus einem mehrdimensionalen Array und lege mit "rfg" die Reihenfolge fest?

Antwort vom

Ja. Das geht in VB.NET 2003, indem du: 1. die Daten in einem Array hältst, 2. nach `rfg` sortierst, 3. die Bilder in genau dieser Reihenfolge zeichnest. Ein mehrdimensionales Array ist dafür aber unpraktisch. Besser ist ein Array von Strukturen oder Klassen. ## Prinzip Jeder Eintrag enthält z. B.: - `ID` - `Bildpfad` - `X` - `Y` - `Breite` - `Höhe` - `RFG` = Zeichenreihenfolge Dann sortierst du alle Elemente nach `RFG` aufsteigend: - kleine `RFG` zuerst = hinten - große `RFG` zuletzt = vorne ## Beispiel für VB.NET 2003 ```vbnet Public Structure ZeichenObjekt Public ID As Integer Public Bildpfad As String Public X As Integer Public Y As Integer Public Breite As Integer Public Hoehe As Integer Public RFG As Integer End Structure ``` ### Array anlegen ```vbnet Dim objekte() As ZeichenObjekt ReDim objekte(2) objekte(0).ID = 1 objekte(0).Bildpfad = "C:\bild1.bmp" objekte(0).X = 10 objekte(0).Y = 10 objekte(0).Breite = 100 objekte(0).Hoehe = 100 objekte(0).RFG = 2 objekte(1).ID = 2 objekte(1).Bildpfad = "C:\bild2.bmp" objekte(1).X = 30 objekte(1).Y = 30 objekte(1).Breite = 100 objekte(1).Hoehe = 100 objekte(1).RFG = 1 objekte(2).ID = 3 objekte(2).Bildpfad = "C:\bild3.bmp" objekte(2).X = 50 objekte(2).Y = 50 objekte(2).Breite = 100 objekte(2).Hoehe = 100 objekte(2).RFG = 3 ``` ## Nach `RFG` sortieren In VB.NET 2003 notfalls einfach per BubbleSort: ```vbnet Dim i As Integer Dim j As Integer Dim temp As ZeichenObjekt For i = 0 To objekte.Length - 2 For j = i + 1 To objekte.Length - 1 If objekte(i).RFG > objekte(j).RFG Then temp = objekte(i) objekte(i) = objekte(j) objekte(j) = temp End If Next Next ``` ## Zeichnen Zum Beispiel im `Paint`-Ereignis: ```vbnet Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint Dim i As Integer Dim img As Image For i = 0 To objekte.Length - 1 img = Image.FromFile(objekte(i).Bildpfad) e.Graphics.DrawImage(img, objekte(i).X, objekte(i).Y, objekte(i).Breite, objekte(i).Hoehe) img.Dispose() Next End Sub ``` ## Wichtig `Image.FromFile` im Paint-Ereignis ist langsam. Besser: Bilder vorher laden und im Speicher halten. ## Falls du unbedingt ein mehrdimensionales Array willst Dann etwa so: ```vbnet ' 0=ID, 1=Bildpfad, 2=X, 3=Y, 4=Breite, 5=Hoehe, 6=RFG Dim daten(2, 6) As Object ``` Das funktioniert, ist aber schlecht wartbar, weil `daten(i, 6)` viel unklarer ist als `objekte(i).RFG`. ## Fazit Ja, die Reihenfolge steuerst du einfach über `RFG`, indem du vor dem Zeichnen danach sortierst. Am besten mit einer `Structure` statt mit einem mehrdimensionalen Array.

Verwandte Fragen

Wie fügt man in VB.NET 2003 einem neuen DataSet aus XML ein gefülltes eindimensionales Array per DataTable.Rows.Add(Object()) hinzu?

In VB.NET 2003 / ADO.NET fügst du ein gefülltes 1-dimensionales Array zu einer DataTable im DataSet so hinzu: vb Dim werte() As Object = New Object() {"Max", 25, "Berlin"...

Wie übergebe ich in VB.NET 2003 einer Form in einem Panel die Key-Steuerung?

In VB.NET 2003 / WinForms bekommt eine Form, die in einem Panel steckt, die Tastaturereignisse normalerweise nicht automatisch sauber. Üblich ist: 1. KeyPreview = True auf der Host-Form setzen...

VB.NET 2003: Wie liest oder schreibt man aus einer in ein Panel geladenen Form auf die Hauptform?

In VB.NET 2003 greifst du von der im Panel geladenen Form auf die Hauptform zu, indem du der eingebetteten Form eine Referenz auf die Hauptform übergibst. Prinzip: Hauptform erstellt Kindform Ha...

Wie bleibt eine in ein Panel geladene Form in VB.NET 2003 immer so groß wie das Parent-Panel?

In VB.NET 2003 gelingt das am einfachsten so: 1. Formular nicht top-level anzeigen 2. ins Panel einfügen 3. Dock = Fill setzen Beispiel: vb Dim f As New Form2 f.TopLevel = False f.FormBorde...

Wie runde ich in VB.NET 2003 das Ergebnis von 22 / 7 auf und rechne dann mit 28 weiter?

In VB.NET 2003 kannst du zum Aufrunden Math.Ceiling verwenden. Beispiel: vb Dim wert As Double Dim ergebnis As Integer wert = 22 / 7 ergebnis = CInt(Math.Ceiling(wert)) ergebnis = ergebnis + 28...

Wie verschiebe ich in VB.NET 2003 eine übergroße PictureBox in einem Panel per Maus, sodass die Scrollbalken die neue Position automatisch anzeigen?

Ja. In VB.NET 2003 geht das am einfachsten so: PictureBox größer als Panel Panel.AutoScroll = True Beim Ziehen mit der Maus nicht die PictureBox.Location direkt setzen Stattdessen die Scrol...

Wie wird in VB.NET 2003 eine PictureBox in einem kleineren Panel zentriert angezeigt, auch bei AutoScroll?

Ja. In VB.NET 2003 geht das, aber PictureBox zentriert sich in einem Panel mit AutoScroll=True nicht automatisch. Die Position muss nach Größe und Scrollbereich selbst gesetzt werden. Beis...

Können XML-DataTables in VB.NET 2003 ineinander verschachtelt werden?

Ja. In VB.NET 2003 / ADO.NET DataSet können XML-Daten so dargestellt werden, dass DataTables logisch verschachtelt wirken — aber nicht als echte DataTable-in-DataTable-Struktur. Kurz gesa...

Ist es sinnvoll, ein zweidimensionales Array zum Sortieren zuerst in ein ListView zu laden?

Nein. Ein 2D-Array erst in ein ListView zu laden, nur damit das ListView sortiert, ist in der Regel nicht sinnvoll: unnötiger Umweg langsamer stärker an UI gebunden schlechter wartbar Ein...

Wie sortiere ich in VB.NET 2003 ein Array mit 10 Zeilen und 15 Spalten nach der 8. Spalte auf- oder absteigend?

In VB.NET 2003 sortierst du ein zweidimensionales Array nicht direkt mit einer eingebauten Sortierfunktion nach einer bestimmten Spalte. Üblich ist: 1. die Zeilen vergleichen, 2. beim Sortieren...