Benutzer mit den meisten Antworten
Globale Funktion für neu erstellte PictureBoxen porgrammieren?

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
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.
schreibst und dann mit "MyPictureBox" arbeitest. Die Methoden sollten ggfs. vom Namen her nicht auf ein bestimmtes Control hindeuten:Dim MyPictureBox As PictureBox = CType( sender, PictureBox )
Die EventHandler kannst Du nach dem Erstellen der Controls mitPrivate 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
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
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.
schreibst und dann mit "MyPictureBox" arbeitest. Die Methoden sollten ggfs. vom Namen her nicht auf ein bestimmtes Control hindeuten:Dim MyPictureBox As PictureBox = CType( sender, PictureBox )
Die EventHandler kannst Du nach dem Erstellen der Controls mitPrivate 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
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
-
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.
Ich benutze/ I'm using VB2008 & VB2010- Bearbeitet Ellen Ramcke Mittwoch, 3. November 2010 20:43 Nachtrag
-
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):
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 -
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
-
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 -
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
-
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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
-
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 -
Hallo Ellen,
ich bin nach wie vor davon überzeugt, dass der von mir aufgezeigte Weg auch eine Lösung ist.
Zu der Aussage von Stefan. Auch wenn sie nicht falsch ist, ist doch zumindestens irreführend. Ich habe oben gezeigt, dass auch anders geht.
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
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 -
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 -
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