Userform eine Variable als "Referenz" mit geben

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von SoEinVBler.

    Userform eine Variable als "Referenz" mit geben

    Hallo,

    ich erstelle, von mehreren kleinen Bereichen meines Bildschirms, ScreenShots.
    Für die Koordinaten und Maße der ScreenShots habe ich mir mehrere Variablen vom Typ Rectangle angelgt

    Damit ich mir diese Bereiche visualisieren kann, habe ich mir eine transparente Form erezugt, und positioniere für jedes Rechteck eine Instanz dieser Form an diese Stelle.

    So weit so gut, nur würd ich gern die Position der Anzeige-Form mit dem Rechteck "verknüpfen".
    Also wenn ich eine Anzeige-Form verschiebe oder die Größe änder, soll dies gleich wieder in das entprechende Rechteck der Hauptform zurückgeschrieben werden.

    Am liebsten würde ich der Anzeige-Form das Rechteck als "Referenz" mit geben, so dass beim ändern eines Werts dies in der Haupform gleich so mit ankommt.
    Die Anzeig-Form soll sich also sein Rechteck merke und auch darauf zugreifen können.

    Eine Variable des Typs Rectangle in de Anzeigform zu erzeugen und ihr das Rechteck zu übergeben geht ja nicht, da in der Userform dann eine Kopie vorhanden ist.
    Ich bräuchte also so was wie ein "Zeiger"
    Wenn Du in VisualStudio/VB.NET arbeitest, hat ja jedes Form, also auch die Positionierungsforms (PosForms), die Events SizeChanged und LocationChanged. Du kannst also mittels EventHandler die Situationen abfangen, in denen ein Form verschoben oder größengeändert wird. Und wenn die PosForms SubForms von einem Hauptform sind, kann das Hauptform ja bei Erstellung eines PosForms dessen SizeChanged- und LocationChanged-Events abonnieren und bekommt umgehend mitgeteilt, wenn sich bei einem PosForm was geändert hat und Du kannst dann umgehend darauf reagieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    also die Anzeige-Formen werden aus einer Hauptform aufgerufen, mit .Show(). (nicht modal)
    Somit geht es sicher, sich die Events zu abonieren, aber dann muss ich entweder für jede Instanz der Anzeig-Formen eine Eventhandle erzeugen oder
    alle im gleichen abfangen und wieder entscheiden welche Anzeige-Form gehört zu welchem Rechteck.

    Ich kann auch der AnzeigeForm ein Index/Kennung mitgeben und je nachdem eine Sub in der Haupform aufrufen die dann das Rechteck aktualisiert.
    Aber praktisch und einfach zu erweitern ist das alles nicht...

    Die Idee ist halt ich geb der Form einmal das Rechteck mit, und dann wäre es erledigt, also einfach im SizeChanged oder LocationChanged-Event das Rechteck aktualisieren, fertig.
    Ist vielleicht etwas Pfeil-Rücken-Brust-Auge:

    VB.NET-Quellcode

    1. 'MainForm
    2. Dim RechteckDasManipuliertWerdenSoll As Rectangle
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Positionierungsform1.Remember(Sub(x) RechteckDasManipuliertWerdenSoll = x)
    5. End Sub
    6. 'Positionierungsform
    7. Property Rechteckmanipulieraktion As Action(Of Rectangle)
    8. Friend Sub Remember(Rechteckmanipulieraktion As Action(Of Rectangle))
    9. Me.Rechteckmanipulieraktion = Rechteckmanipulieraktion
    10. End Sub
    11. Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
    12. Rechteckmanipulieraktion.Invoke(New Rectangle(100, 100, 20, 20))
    13. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    ja das geht tatsächlich, hatte zuerst noch ein Problem in einer Schleife, aber das Beispiel läuft schon mal.
    Ich hatte vorhin sogar im Forum hier das eine Beispiel gelesen, da ging es darum das die Variable oder Klasse am anfangan noch nciht existiert oder so.

    So richtig verstanden hatte ich das Beispiel da nicht und auch jetzt ist es noch nicht ganz klar.
    Ich stelle es mir so vor, dass (in der Haupform?) eine Sub(X) erzeugt wird, die dann von der Positionierungsform angestoßen wird...
    Oder lieg ich da ganz falsch?
    Das stimmt schon ungefähr. Dem PosForm wird eine Aktion mitgegeben, welches es auslösen soll. Das Schöne ist, dass darin eben Hauptform-Variablen verwendet werden können, die das PosForm zwar selber nicht ändern kann. Aber da die Aktion tatsächlich im Hauptform ausgelöst wird, können Hauptform-Variablen darin geändert werden. Es ist also eine Art Funktionszeiger, der da ans PosForm übergeben wird. Das PosForm selbst weiß nur: "Ok, es soll eine Aktion ausgelöst werden, welche einen Rectangle-Parameter hat. Diesen Parameter muss ich übergeben." Und dieser Parameter kommt dann eben in meiner Zeile#5 an und wird der Hauptform-Variable RechteckDasManipuliertWerdenSoll zugewiesen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Mir ist heute noch eine andere Variante eingefallen.

    Die Rechtecke werden einfach immer als Array definiert. (Dim r(0) as Rectangle)

    Da Arrays ja immer als Referenz übergeben werden, kann ich der From einfach das Array übergeben, und schon kann die Anzeige-Form die Rechtecke in der Haupform ändern.

    Da ich eh schon teilweise die Rechtecke als Arrays habe muss ich nur noch den Index mitgeben.
    Kleiner Nachteil, bei den Rechtecken die bisher kein Array waren, muss ich halt immer die Klammern mit angeben...