Zähler in Elementenamen Einbauen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Goldwing Studios.

    Zähler in Elementenamen Einbauen

    Hallo Zusammen

    Zur Anschauung erstmal den Code:

    VB.NET-Quellcode

    1. For Each Pic As String In Form1.BilderListe
    2. If GeladenesBild1.ImageLocation = "" And LadeZaehler = 0 Then
    3. Dim ZuLadBild As Image = Image.FromFile(Pic)
    4. Dim Orientation As ExifOrientations = ImageOrientation(ZuLadBild)
    5. If Orientation = ExifOrientations.TopLeft Then
    6. GeladenesBild1.ImageLocation = Pic
    7. ElseIf Orientation = ExifOrientations.RightTop Then
    8. Dim Pic2 As Image = Image.FromFile(Pic)
    9. Pic2.RotateFlip(RotateFlipType.Rotate90FlipNone)
    10. GeladenesBild1.Image = Pic2
    11. End If
    12. GeladenesBild1.Visible = True
    13. LadeZaehler = LadeZaehler + 1


    Nun, ich habe 60 PictureBoxen (GeladenesBild1 .. GeladenesBild60). Da ich nicht den Obigen Code 60 mal wiederholen möchte, wollte ich nun wissen, ob es möglich ist, in einen Elementenamen einen Zähler ein zu bauen, z.B.:

    VB.NET-Quellcode

    1. If GeladenesBild & LadeZaehler + 1.ImageLocation = ""

    ergibt dann

    VB.NET-Quellcode

    1. If GeladenesBild1.ImageLocation = ""

    Ist natürlich quatsch und funktioniert so nicht (jaaa... ich habe es versucht xD :whistling: ).

    Ich habe auch schon das versucht:

    VB.NET-Quellcode

    1. Dim BName As String = "GeladenesBild" & LadeZaehler +1
    2. If BName.ImageLocation = ""

    Funktioniert auch nicht, weil BName ja ein String ist und kein "Elementename". Gibt es da eine Methode? Dann könnte ich mit einem Code alle Boxen füllen.

    Vielen Dank euch schonmal!

    Bladehunt0 schrieb:

    Nun, ich habe 60 PictureBoxen
    also ein völlig verqueres Design.
    Was ist der Plan?
    Wie ist Dein Design?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die PictureBoxen sind eigentlich ausgeblendet und werden nur angezeigt, wenn auch ein Bild geladen wird. Die Pfade werden in der ersten Form über eine SelectFileDialog in eine Liste geschrieben. Wenn ich nun hier "Laden" clicke, werden die Pictureboxen mit den Pfaden der Liste mit Bidern gefüllt.
    Aber das allein führte dazu, dass die Bilder im Portrait Format "liegend" geladen wurde, desshalb das drehen mittels Exifdaten.
    @Bladehunt0:: Ohne das jetzt bis ins Einzelne zu verstehen und Gut zu heißen probier mal dies:

    VB.NET-Quellcode

    1. Private myBoxes As New List(Of PictureBox)
    2. Public Sub New()
    3. InitializeComponent()
    4. ' dies muss nach InitializeComponent() stehen
    5. myBoxes.AddRange({PictureBox1, PictureBox2, PictureBox3, PictureBox4, PictureBox5, PictureBox6})
    6. End Sub
    7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    8. For Each box In myBoxes
    9. box.BackColor = Color.Aqua
    10. Next
    11. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weiß ja nicht was deine "Bilderliste" ist aber machs doch so ( Pseudo-Code, da ich kein VB mehr kann :S )

    Quellcode

    1. for(int i = 0; i < 200; i++)
    2. {
    3. ...dein Kladderadatsch...
    4. Bild.Name = i.ToString()
    5. ...noch irgendwas...
    6. }


    i ist jetzt deine Zahl, die du für irgendwas benutzen kannst. Seis ein Name oder sonstwas, have fun!
    @RodFromGermany
    Vielen Dank für deinen Input! Irgendwie hat mir der gewisse "Klacks" gefehlt, dank dir bekam ich ihn :P

    Ich habe das ganze nun so gelöst:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. ' dies muss nach InitializeComponent() stehen
    4. myBoxes.AddRange({GeladenesBild1, GeladenesBild2, GeladenesBild3, GeladenesBild4, GeladenesBild5, GeladenesBild6, _
    5. GeladenesBild7, GeladenesBild8, GeladenesBild9, GeladenesBild10, GeladenesBild11, GeladenesBild12, _
    6. GeladenesBild13, GeladenesBild14, GeladenesBild15, GeladenesBild16, GeladenesBild17, _
    7. GeladenesBild18, GeladenesBild19, GeladenesBild20, GeladenesBild21, GeladenesBild22, _
    8. GeladenesBild23, GeladenesBild24, GeladenesBild25, GeladenesBild26, GeladenesBild27, _
    9. GeladenesBild28, GeladenesBild29, GeladenesBild30, GeladenesBild31, GeladenesBild32, _
    10. GeladenesBild33, GeladenesBild34, GeladenesBild35, GeladenesBild36, GeladenesBild37, _
    11. GeladenesBild38, GeladenesBild39, GeladenesBild40, GeladenesBild41, GeladenesBild42, _
    12. GeladenesBild43, GeladenesBild44, GeladenesBild45, GeladenesBild46, GeladenesBild47, _
    13. GeladenesBild48, GeladenesBild49, GeladenesBild50, GeladenesBild51, GeladenesBild52, _
    14. GeladenesBild53, GeladenesBild54, GeladenesBild55, GeladenesBild56, GeladenesBild57, _
    15. GeladenesBild58, GeladenesBild59, GeladenesBild60})
    16. End Sub
    17. Private Sub Bilder_Oeffnen(sender As Object, e As EventArgs) Handles BilderOeffnen.Click
    18. If Form1.BilderListe.Count = 0 Then
    19. MsgBox("Bitte Datei angeben")
    20. Else
    21. ProgressBar2.Visible = True
    22. ProgressBar2.Maximum = Form1.AnzahlBilder
    23. For Each Pbox In myBoxes
    24. If Pbox.ImageLocation = "" And Form1.BilderListe.Count <> LadeZaehler Then
    25. Dim ZuLadBild As Image = Image.FromFile(Form1.BilderListe.Item(LadeZaehler))
    26. Dim Orientation As ExifOrientations = ImageOrientation(ZuLadBild)
    27. If Orientation = ExifOrientations.TopLeft Then
    28. Pbox.ImageLocation = Form1.BilderListe.Item(LadeZaehler)
    29. ElseIf Orientation = ExifOrientations.RightTop Then
    30. Dim Pic2 As Image = Image.FromFile(Form1.BilderListe.Item(LadeZaehler))
    31. Pic2.RotateFlip(RotateFlipType.Rotate90FlipNone)
    32. Pbox.Image = Pic2
    33. End If
    34. Pbox.Visible = True
    35. KB1.Visible = True
    36. LadeZaehler = LadeZaehler + 1
    37. ProgressBar2.Value = LadeZaehler
    38. End If
    39. Next
    40. Panel_Platzierung()
    41. ProgressBar2.Visible = False
    42. End If
    43. End Sub

    Funktioniert einwandfrei, danke!
    Und um noch zu erläutern was der Nutzen sein soll:
    Ich habe ein Programm, welches bis jetzt mehrere Bilder öffnen kann,
    anzeigen, grösse bestimmen, resizen und dann umbenannt, der Reihenfolge
    nach speichert. Bald wird es noch einen Code erzeugen können (html), dass ich
    so ganz einfach und schnell Bilder mit Beschreibung, Preview etc. in
    meine HP einbauen kann, ohne gross in deren Code rum zu fingern. Der obige Code zeigt mir nur Previews an, so dass ich den Passenden Kommentar dazu schreiben kann (TextBox unter Bild).
    Somit brauche ich kein ACDSee mehr und den Dreamweaver (wenn überhaupt) nur noch für den Upload. So zu sagen ein Bilder Upload tool für Homepages (oder DIE Homepage) Marke Eigenbau :P
    Wer interesse am fertigen Projekt hat, kann mich ja anschreiben.

    Danke nochmals an alle!
    Verschneite Grüsse aus der Schweiz
    Alexander

    Bladehunt0 schrieb:

    Ich habe ein Programm, welches bis jetzt mehrere Bilder öffnen kann,
    Schmeiß Deine Lösung weg :!:
    Mach Dir eine MultiDocument-Applikation.
    Mach folgendes:
    Form1 mit IsMdiContainer = True, 1 Button.
    Form2.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim dlg = New Form2
    3. dlg.MdiParent = Me
    4. dlg.Show()
    5. End Sub
    In die Form2 packst Du alles, was unmittelbar mit den Bildern zu tun hat.
    Statt des Buttons machst Du Dir dann ein schickes Menü.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Bladehunt0:: Selber Moin.
    Mach genau das, was da streht.
    1. Neues WinForm-Projekt.
    2. Form1: im Designer IsMdiContainer = True
    3. Form2 hinzufügen, (Fenster schließen)
    4. Button auf die Form1 ziehen
    5. meinen Code in die Button_Click reinschreiben
    6. Programm starten
    Hauptfenster groß ziehen, beliebig oft auf den Button klicken. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, funktioniert.
    Und was ist der Vorteil daran? Ist ja das selbe, ausser, dass man ein "Hauptfenster" hat und dann von da aus die anderen öffnet? Und wenn ich das ein zweites mal machen will, (Form3 von Form2 her starten) mit dem selben Code, krieg ich nen Feher, muss ich da was ändern? Ich hab ja schlussendlich mehrere Fenster, die ich brauche.

    Bladehunt0 schrieb:

    Und was ist der Vorteil daran?
    Du brauchst nicht 87 PictureBoxen, sondern Form2 hat genau eine PictureBox.
    Für jede neue PictureBox machst Du eine neue Instanz von Form2 auf. :thumbsup:

    Bladehunt0 schrieb:

    krieg ich nen Feher, muss ich da was ändern?
    Welchen?
    In welcher Codezeile?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe Form1 als maximized Hauptfenster, öffne direkt beim Laden Form2:

    VB.NET-Quellcode

    1. Private Sub laden() Handles Me.Load
    2. IsMdiContainer = True
    3. Dim dlg = New Form2
    4. dlg.MdiParent = Me
    5. dlg.Show()
    6. End Sub

    danach möchte ich aus der Form2 die Form3 öffnen, mittlels Button

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. IsMdiContainer = True
    3. Dim dlg2 = New Form3
    4. dlg2.MdiParent = Me
    5. dlg2.Show()
    6. End Sub

    dann krieg ich "Ein Ausnahmefehler des Typs "System.ArgumentException" ist in System.Windows.Forms.dll aufgetreten." Bei Zeile 4 " IsMdiContainer = True"

    Wegen den Pictureboxen, das ist schon gewollt so, dass ich alle im Überblick habe und sie zusammen sehe, wie sie dann auf de HP erscheinen ;)

    Bladehunt0 schrieb:

    VB.NET-Quellcode

    1. dlg2.MdiParent = Me
    ==>

    VB.NET-Quellcode

    1. dlg2.MdiParent = Me.Parent
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    machs halt nicht mit ner for-Schleife, was um längern einfacher wäre und auch effektiv

    als obergrenze gibts du die Maximalanzahl deiner Pictureboxen an und lässt dann einfach durchlaufen.

    Warum einfach wenn auch unnötig kompliziert geht.

    Goldwing Studios schrieb:

    wenn dus einfach so machen könntest:
    What :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!