none
Globale Funktion für neu erstellte PictureBoxen porgrammieren? RRS feed

  • Frage

  • Ich möchte in der Laufzeit meines Programms mehrere Pictureboxen erstellen. Das habe ich schon wie folgt geschafft:

      Dim count As Integer = 0
      Private Sub CreatePictureBox()
        Dim pb As New PictureBox
        With pb
          .Name = "Icon" & CStr(count + 1)
          .Size = New Size(59, 60)
          .Image = My.Resources.Iconbg
          .Location = New Point(20, 20)
        End With
        Me.Controls.Add(pb)
        count += 1
      End Sub
    

    Aber ich würde diese Pictureboxen gerne während das Programm läuft einzeln verschieben können.

    Bei eine Picturebox das sofort fest zu programmieren ist ja easy:

    Dim lstartpos As Point
      Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
          lstartpos = e.Location
        End If
      End Sub
      Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
          Dim lDelta As New Point(e.Location.X - lstartpos.X, e.Location.Y - lstartpos.Y)
          Dim lNewPos = New Point(PictureBox1.Location.X + lDelta.X, PictureBox1.Location.Y + lDelta.Y)
          PictureBox1.Location = lNewPos
        End If
      End Sub
    

    Aber wie kann ich das jetzt automatisieren, bzw. Globaliesieren, dass jede PictureBox, die ich erstelle diesen Code ausführt, also dass man jede Picturebox einzeln verschieben kann???

    Danke im voraus

    Mittwoch, 3. November 2010 17:33

Antworten

  • Hi,
    Aber ich würde diese Pictureboxen gerne während das Programm läuft einzeln verschieben können.

    Aber wie kann ich das jetzt automatisieren, bzw. Globaliesieren, dass jede PictureBox, die ich erstelle diesen Code ausführt, also dass man jede Picturebox einzeln verschieben kann???

    den Code im EventHandler müsstest Du in derart umstellen, dass Du anstelle von "PictureBox1" dann bspw.

    Dim MyPictureBox As PictureBox = CType( sender, PictureBox )
    
    schreibst und dann mit "MyPictureBox" arbeitest. Die Methoden sollten ggfs. vom Namen her nicht auf ein bestimmtes Control hindeuten:
    Private Sub PictureBox_MouseDown( ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs )
      ...
    End Sub
    
    Private Sub PictureBox_MouseMove( ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs )
      ...
    End Sub
    
    
    Die EventHandler kannst Du nach dem Erstellen der Controls mit
     AddHandler pb.MouseDown, AddressOf PictureBox_MouseDown
     AddHandler pb.MouseMove, AddressOf PictureBox_MouseMove
    
    

    zuweisen. Siehe auch: http://msdn.microsoft.com/de-de/library/7taxzxka.aspx

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert MaSch0212 Donnerstag, 4. November 2010 21:00
    Mittwoch, 3. November 2010 17:57
    Moderator

Alle Antworten

  • Hi,
    Aber ich würde diese Pictureboxen gerne während das Programm läuft einzeln verschieben können.

    Aber wie kann ich das jetzt automatisieren, bzw. Globaliesieren, dass jede PictureBox, die ich erstelle diesen Code ausführt, also dass man jede Picturebox einzeln verschieben kann???

    den Code im EventHandler müsstest Du in derart umstellen, dass Du anstelle von "PictureBox1" dann bspw.

    Dim MyPictureBox As PictureBox = CType( sender, PictureBox )
    
    schreibst und dann mit "MyPictureBox" arbeitest. Die Methoden sollten ggfs. vom Namen her nicht auf ein bestimmtes Control hindeuten:
    Private Sub PictureBox_MouseDown( ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs )
      ...
    End Sub
    
    Private Sub PictureBox_MouseMove( ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs )
      ...
    End Sub
    
    
    Die EventHandler kannst Du nach dem Erstellen der Controls mit
     AddHandler pb.MouseDown, AddressOf PictureBox_MouseDown
     AddHandler pb.MouseMove, AddressOf PictureBox_MouseMove
    
    

    zuweisen. Siehe auch: http://msdn.microsoft.com/de-de/library/7taxzxka.aspx

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert MaSch0212 Donnerstag, 4. November 2010 21:00
    Mittwoch, 3. November 2010 17:57
    Moderator
  •  Aber wie kann ich das jetzt automatisieren, bzw. Globaliesieren, dass jede PictureBox, die ich erstelle diesen Code ausführt, also dass man jede Picturebox einzeln verschieben kann???

    Danke im voraus

    Hallo Stefan,

    ich lese masch0212 möchte dieselbe Prozedur für alle PictureBoxen verwenden. Sonst must Du alles 100mal programmieren ... oh je .

    Du must die Prozeduren um die jeweiligen Handles erweitern (alle Ereignisse gehen auf diese Routine):

     Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove, PictureBox2.MouseMove .......
    
    

    Jetzt ist die zentrale Frage: Wo komme ich her? Dazu wertest Du das sender Argument aus:

    With CType(sender, PictureBox)

    Damit hast Du die PictureBox auf welche Du geklickt hast.

    Gruß Ellen 

    P.S. Stefan unsere Lösungen sind gleichwertig. Du benutzt AddHandler und ich die Handles klausel. Dieses Thema hatten wir gerade hier im Forum.

    http://social.msdn.microsoft.com/Forums/de-DE/visualbasicde/thread/06f51e2b-abd6-4688-9624-e6e7ddbea47e


    Ich benutze/ I'm using VB2008 & VB2010
    • Bearbeitet Ellen Ramcke Mittwoch, 3. November 2010 20:43 Nachtrag
    Mittwoch, 3. November 2010 20:15
  • Hallo Ellen,

    ich lese masch0212 möchte dieselbe Prozedur für alle PictureBoxen verwenden. Sonst must Du alles 100mal programmieren ... oh je .

    Du must die Prozeduren um die jeweiligen Handles erweitern (alle Ereignisse gehen auf diese Routine):

    geht aber nicht, da er die Controls dynamisch per Code erzeugt. Da kann man kein Handles ... angeben, weil das Control, auf welches dann verwiesen werden würde, zur Designtime noch gar nicht existiert.

    P.S. Stefan unsere Lösungen sind gleichwertig. Du benutzt AddHandler und ich die Handles klausel.

    Ich weiß :) Aber was wolltest Du mir jetzt damit sagen?

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Mittwoch, 3. November 2010 22:34
    Moderator
  • geht aber nicht, da er die Controls dynamisch per Code erzeugt. Da kann man kein Handles ... angeben, weil das Control, auf welches dann verwiesen werden würde, zur Designtime noch gar nicht existiert.

    Hallo Stefan,

    und wenn ich die Pictureboxen mit WithEvents deklariere? Dann muss das doch gehen.

    Friend WithEvents pb as PictureBox
    
    ' im Code pb dynamisch erzeugen:
    pb = New Picturebox
    
    

    Dann habe ich einen Handle pb.MouseMove. Oder etwa nicht? Lieg ich jetzt falsch hier?

    schöne Grüße Ellen

    P.S. Jetzt hast mich verunsichert. Gerade getestet. Läuft. Eine Picturerbox per Formdesigner (pb1) und pb2 dynamisch erzeugt. Die Handel Klausel geht auch für pb2:

    Public Class Form1
    
      Friend WithEvents pb2 As PictureBox
    
      Private Sub Form1_Load(ByVal sender As System.Object, _
                  ByVal e As System.EventArgs) Handles MyBase.Load
    
        pb2 = New PictureBox
        pb2.Size = pb1.Size
        pb2.Location = New Point(1, 1)
        pb2.BackColor = Color.Beige
        Me.Controls.Add(pb2)
    
      End Sub
    
      Private Sub pb1_MouseClick(ByVal sender As System.Object, _
                    ByVal e As System.Windows.Forms.MouseEventArgs) _
                    Handles pb1.MouseClick, pb2.MouseClick
    
      End Sub
    End Class

     


    Ich benutze/ I'm using VB2008 & VB2010
    • Bearbeitet Ellen Ramcke Donnerstag, 4. November 2010 08:01 Nachtrag
    Donnerstag, 4. November 2010 07:41
  • Hallo Ellen,

    und wenn ich die Pictureboxen mit WithEvents deklariere? Dann muss das doch gehen.

    schau doch bitte nochmal in den Code, den Masch0212 gepostet hat. Da wird nichts mit WithEvents deklariert, das müsste auf Klassenebene zur DesignTime gemacht werden, dann kann man auch Handles ... verwenden. Siehe dazu auch:

      http://msdn.microsoft.com/de-de/library/aty3352y.aspx

    Die Variable "pb" existiert nur innerhalb der Sub.Wenn man das so machen wollte, wie Du es vorschlägst, müsste man zur Designtime folgendes machen:

    Protected|Public|Friend|... WithEvents pb1 As PictureBox
    Protected|Public|Friend|... WithEvents pb2 As PictureBox
    Protected|Public|Friend|... WithEvents pb3 As PictureBox
    ...
    ...
    ...
    Protected|Public|Friend|... WithEvents pb999 As PictureBox

    Und das will man nicht wirklich.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 4. November 2010 07:54
    Moderator
  • Hallo Ellen,
    Die Variable "pb" existiert nur innerhalb der Sub.Wenn man das so machen wollte, wie Du es vorschlägst, müsste man zur Designtime folgendes machen:

    Protected|Public|Friend|... WithEvents pb1 As PictureBox
    Protected|Public|Friend|... WithEvents pb2 As PictureBox
    Protected|Public|Friend|... WithEvents pb3 As PictureBox
    ...

    Hallo Stefan,

    nein. Wenn ich weis, dass ich 999 Pictureboxen erzeugen will, dann würde ich ein array declarieren:

    Friend WithEvent pb(998) as PictureBox
    

    Damit kann man sich die Arbeit unheimlich vereinfachen, in dem Du jede PictureBox über ein Index erreichst.

    Gruß Ellen

    Hallo community!

    Diese von mir .. ) gezeigte Lösung ist FALSCH. Bitte löscht dieses sofort aus Eurem Gedächtnis. Die Definition von pb mit "WithEvent" duldet der Compiler klaglos. Aber, bei dem Einführen der Handles Klausel zur Entwurfszeit ... Handles.   ... gibt es eine Fehlermelsung: Event wurde nicht gefunden. In diesem Fall ist die Addhandler Methode angesagt!

    sorry Ellen


    Ich benutze/ I'm using VB2008 & VB2010

    • Bearbeitet Ellen Ramcke Donnerstag, 11. November 2010 20:50 Nachtrag
    Donnerstag, 4. November 2010 08:14
  • Hallo Ellen,

    nein. Wenn ich weis, dass ich 999 Pictureboxen erzeugen will, dann würde ich ein array declarieren:

    Friend
     WithEvent pb(998) as
     PictureBox
    

    würdest Du das? Bist Du dir da gaaaaaaanz sicher?

    Lies doch bitte mal nochmal im oben verlinkten MSDN Dokument:

      http://msdn.microsoft.com/de-de/library/aty3352y.aspx

    Auszug: Sie können mit WithEvents nur einzelne Variablen und keine Arrays deklarieren.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 4. November 2010 08:19
    Moderator
  • Hallo Ellen,

    Naja, wir wollen ja Lösungen aufzeigen. Ich habe gelernt in NET gibt es IMMER mehrere Wege zum Ziel

    Genau Lösungen. Dein Weg ist jedoch keine Lösung, sondern eine Sackgasse. Es wäre hilfreicher, wenn Du Deine Lösungswege zuvor testest, bevor Du sie hier publizierst, das schafft weniger Verwirrung und hilft dem fragenden mehr, als Spekulation und Halbwissen. Wenn Du unsicher bist oder Fragen hast, dann formuliere es bitte auch als Frage und stelle es nicht als Lösung dar.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 4. November 2010 08:31
    Moderator
  • Hallo Thorsten und Stefan,

    Entschuldigung. Nein, das letzte hab ich nicht getestet.

    Ich habe mir den Code von masch01212 angesehen. Welchen Sinn macht es ein Object wie eine Picturebox local in einer Methode zu deklarieren, welche nach Beendigung derer wieder flüchtig ist, also nicht mehr existiert. ??

    Gruß Ellen

     

     Private Sub CreatePictureBox()
      Dim pb As New PictureBox
      With pb
       .Name = "Icon" & CStr(count + 1)
       .Size = New Size(59, 60)
       .Image = My.Resources.Iconbg
       .Location = New Point(20, 20)
      End With
      Me.Controls.Add(pb)
      count += 1
     End Sub
    
    

    Ich benutze/ I'm using VB2008 & VB2010
    Donnerstag, 4. November 2010 08:42
  • Hallo Ellen,

    Genau Lösungen. Dein Weg ist jedoch keine Lösung, sondern eine Sackgasse. Es wäre hilfreicher, wenn Du Deine Lösungswege zuvor testest, bevor Du sie hier publizierst, das schafft weniger Verwirrung und hilft dem fragenden mehr, als Spekulation und Halbwissen. Wenn Du unsicher bist oder Fragen hast, dann formuliere es bitte auch als Frage und stelle es nicht als Lösung dar.

    Hallo Thorsten, diese ganze Diskussion hätte es nicht gegeben, wenn Stefan nicht etwas definitiv falsches von sich gegeben hätte. Er hat mich regelrecht verunsichert. Ich habe das Gegenteil bewiesen.

    Gruß Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Donnerstag, 4. November 2010 08:50
  • Hallo Ellen,

    Hallo Thorsten, diese ganze Diskussion hätte es nicht gegeben, wenn Stefan nicht etwas definitiv falsches von sich gegeben hätte. Er hat mich regelrecht verunsichert. Ich habe das Gegenteil bewiesen.

    ich bin ja nicht oft grantig aber überdenke deinen Krams nochmal. a) Was soll falsch sein? b) Deine Antwort und deine Annahmen sind falsch. Punkt.

    Dein "Beweis" ist keiner, da er von komplett falschen Voraussetzungen ausgeht. Dynamisch erzeugte Controls, wie Masch0212 sie haben will, werden eben nicht zur Designtime per ... WithEvents Abc As Irgendwas deklariert, sondern ausschließlich zur Laufzeit.

    Wenn ich einen Fehler mache, stehe ich auch dazu. Hier sehe ich aber keinen, Du hast mir auch keinen gezeigt. Wenn Du das nachholst und es wirklich ein Fehler ist, schauen wir weiter.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 4. November 2010 08:59
    Moderator
  • Hallo Ellen,

    Ich habe mir den Code von masch01212 angesehen. Welchen Sinn macht es ein Object wie eine Picturebox local in einer Methode zu deklarieren, welche nach Beendigung derer wieder flüchtig ist, also nicht mehr existiert. ??

    das Control existiert weiterhin, da es durch Me.Controls.Add( ... ) in die Controls Collection der Form aufgenommen wird und somit ein Verweis vorhanden ist.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 4. November 2010 09:01
    Moderator
  • Hallo Ellen,

    diese ganze Diskussion hätte es nicht gegeben, wenn Stefan nicht etwas definitiv falsches von sich gegeben hätte.

    das sehe ich etwas anders und Du solltest noch einmal in Dich gehen und den Thread verfolgen, ob das nicht doch etwas anders war.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 4. November 2010 09:25
    Moderator
  • Hallo Ellen,

    Stefans Antwort war nicht falsch.

    Erinnerst Du Dich noch an die Diskussion:
    Was ist der Unterschied zwischen AddHandler und Deklaration WithEvents?

    Evtl. solltest Du das noch einmal durcharbeiten.

    Gruß Elmar

    Donnerstag, 4. November 2010 09:34
    Beantworter
  • Hallo Ellen,

    Welchen Sinn macht es ein Object wie eine Picturebox local in einer Methode zu deklarieren, welche nach Beendigung derer wieder flüchtig ist, also nicht mehr existiert. ??

    um es noch etwas genauer auszudrücken: Es wird lokal nur eine Variable definiert, die eine Referenz auf eine Instanz einer PictureBox hält. Diese Instanz wird über Controls.Add dem Formular bzw. entsprechenden Container zugewiesen und existiert dadurch weiter, selbst wenn die lokale Variable ihre Gültigkeit verliert. Erst wenn die Instanz auch aus dieser Auflistung entfernt wird und keiner neuen Variablen zugewiesen wird, wird diese Instanz zur Zerstörung freigegeben.

    Das sind eigentlich Grundlagen, daher auch mein Tipp für die Zukunft, sich mit seinen Äußerungen nicht zu weit aus dem Fenster zu lehnen, wenn man noch in der Lernphase der Grundlagen steckt. Wenn Dir etwas unklar ist, frag bitte nach.



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 4. November 2010 09:35
    Moderator
  • Genau danach habe ich gesucht... Danke
    Donnerstag, 4. November 2010 21:00
  • Hallo Ellen,

    ich bin nach wie vor davon überzeugt, dass der von mir aufgezeigte Weg auch eine Lösung ist.

    generell Ja. Aber nicht für das, was Masch0212 machen will. Da ist deine Variante nicht anwendbar.

    Zu der Aussage von Stefan. Auch wenn sie nicht falsch ist, ist doch zumindestens irreführend. Ich habe oben gezeigt, dass auch anders geht.

    Ggfs. hast Du es falsch verstanden, das mag sein. Das ändert aber nichts daran, dass die Aussage im Kontext des Threads bzw. der Anforderungen und Vorgaben von Masch0212 zu sehen ist. Unter "dynamisch generierten Controls" versteht mal im Allgemeinen eben nicht "Protected WithEvents ... As Irgendwas" mit Instanzierung des Objekts im Code (was man sowieso machen muss) sondern eben das, was Masch0212 mit seinem Code zeigt. Und da liegt der Unterschied.

    Ich habe einen Fehler gemacht. So etwas passiert hin und wieder. Schliesslich sind wir alle nur Menschen. Das ist aber kein Grund mich in dieser Art und Weise , wie Du es getan hast, zu attackieren. Ich habe ohnehin in letzter Zeit den Eindruck, daß Du mir nicht wohlgesonnen

    Hätte Thorsten das nicht geschrieben, hätte ich es gemacht (war eigentlich schon am schreiben aber doppelt muss man das ja nicht machen). Du beharrst auf deiner Meinung, das ist auch akzeptiert. Für Leser dieses Threads ist das aber nicht zielführend, da sie dann falsche Informationen aus deinen Postings raus lesen würden.

    Ich für meinen Teil klinke mich hier aus dem Thread aus, da es doch mittlerweile sehr OT ist.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Freitag, 5. November 2010 13:36
    Moderator
  • Hallo Stefan,

    ja ist ok so. Ich nehme meine Worte "falsche Ausage" zurück. Entschuldigung bitte. Mein Beitrag war eh unwichtig. Ich berücksichtige das in Zukunft.

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Freitag, 5. November 2010 20:28
  • Hallo Ellen,
    Mein Beitrag war eh unwichtig. Ich berücksichtige das in Zukunft.

    auch wenn OT, das kann ich so nicht stehen lassen :)

    Kein Beitrag hier ist unwichtig. Im ein oder anderen Sinn hat jedes Posting seine Berechtigung und auch einen Sinn. Es wäre nur zielführender, wenn Du deine Tipps vorher ausprobierst und - was ganz wichtig ist - genau auf die Gegebenheiten hin zusammenstellst.

    Lass dich daher bitte nicht entmutigen, dich weiter hier einzubringen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Freitag, 5. November 2010 20:50
    Moderator
  • Hallo Ellen,

    Das ist aber kein Grund mich in dieser Art und Weise , wie Du es getan hast, zu attackieren.

    es tut mir Leid, wenn Du meine Kritik als "Attacke" aufgefasst hast. Das war nicht meine Intention, ebenso wenig war es persönlich gemeint. Es geht um den rein fachlichen Aspekt, wenn ich meine Meinung hier in Schrift und Wort fasse. Das soll nicht heißen, dass Du Dich nicht beteiligen sollst, sondern Dir nur mehr Zeit mit der Frage und Deiner Antwort nehmen sollst. Testen, ggf. auf die Dokumentation verweisen oder halt dazu schreiben, wenn Du unsicher bist bzw. etwas ungetestet veröffentlichst. Letzten Endes hilft es auch Dir selber etwas zu lernen.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 5. November 2010 21:09
    Moderator