Kein Zugriff von Form2 auf Form1

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    back2Post#16:

    In Child1:

    VB.NET-Quellcode

    1. Public Event MyEvent As EventHandler(Of MyEventArgs)
    2. Public Class MyEventArgs : Inherits EventArgs
    3. Public Panel As Panel
    4. Public Sub New(Panel As Panel)
    5. Me.Panel = Panel
    6. End Sub
    7. End Class


    In Parent:

    VB.NET-Quellcode

    1. Private Child As Form2 = Nothing
    2. Private Child2 As Form3 = Nothing
    3. Public Sub CreateChild()
    4. Child = New Form2
    5. AddHandler Child.MyEvent, AddressOf ManipulateChild2
    6. End Sub
    7. Private Sub ManipulateChild2(sender As Object, MyEventArgs As Form2.MyEventArgs)
    8. Child2.Controls.Add(MyEventArgs.Panel)
    9. End Sub

    wegen Zeitmangel ungetestet, aber zumindest vom Prinzip her

    ##########

    Ach ja. Und dann natürlich irgendwann in Child1 auch: RaiseEvent MyEvent(Me, New MyEventArgs With {.Panel = New Panel})
    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.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Mich würden ja eher die Daten interessieren, die auf Form2 und Form3 angezeigt und bearbeitet werden sollen.

    Denn Controls von einer Form (wohmöglich noch dynamisch erzeugt), über die Parentform in eine andere Form zu schleußen, welche dann damit was auch immer was macht, ist in meinen Augen ein No-Go.
    Besser wäre es sich eine Klasse zu bauen, die alle nötigen Properties hat, um in beiden Formularen Daten anzeigen zu können.

    DragsTrail schrieb:

    Child2 soll an das Parent ein Panel, ein Button, ein Label, ein Combobox.selectedIndex übergeben.
    Bestenfalls einen SelectedIndex. Controls zu übergeben wäre ein Fehldesign.
    Kannst Du mal Deinen Plan etwas näher erläutern?
    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!
    @VaporiZed
    Danke für den Code. Den werde ich morgen durch testen. Ich hab das Problem jetzt mit ABSOLUT No-GO gelöst, indem ich die benötigten Daten von Child1 ins Modul ByRef auslagere. Dadurch hat das Child2 vollen Zugriff auf die Daten von Child1. Es funkt Fehlerfrei. Da das aber ein riesen Thema ist machen wir das richtig.

    ​@'RodFromGermany'
    ​Du wirst dich vielleicht an das Thema noch erinnern: Panel1.DragDrop. Die List of Controls die sich automatisch aktualisiert bzw. Control.Clone :D Dieses Panel1 befindet sich in Child1.
    ​Es dient der Visualisierung eines Bearbeitungsschemas einer Zerspanungsmaschine. Das Child1 kann 20 weitere Childs aufrufen und jedes dieser Childs stellt ein Bearbeitungsvorgang mit jeweiligen Daten da.
    ​z.B. Schnittgeschwindigkeit, Zustellung, Materialaufmaß usw.

    Jedes dieser 20 Childs soll in Child1.Panel1 eine GroupBox mit einem Bild einem Label und einem Button erzeugen. Ich will das so haben weil ein Bild mehr als 1000 Worte sagt. Das hat ja in Testprogramm perfekt gefunkt. Da gabs aber auch kein Parent/Child. Jetzt bin ich ja schlauer.

    ​Besser kann ich das jetzt nicht erklären.

    DragsTrail schrieb:

    Ich hab das Problem jetzt mit ABSOLUT No-GO gelöst, indem ich die benötigten Daten von Child1 ins Modul ByRef auslagere.
    Soo schlimm NoGo ist das garnet.
    Du trennst gewissermassen Daten und Oberfläche, und stellst die Daten an einem einzigen Ort zentral zur Verfügung.
    Dassis eiglich sogar ganz ausgezeichnet, und könnte man nur noch verbessern, indem man etwa die für Datenverarbeitung vorgesehenen Technologien verwendet.

    DragsTrail schrieb:

    Panel1.DragDrop
    Weiß ich jetzt nicht mehr.
    Ich habe das Gefühl, dass Du da einen Haufen Teilaufgaben zusammenwürfelst, ohne ein einheitliches / ganzheitliches Konzept zu haben.
    Vielleicht stellst Du mal vor, was da global läuft.
    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!
    Ein Konzept gab es schon. Trotzdem kommt immer wieder etwas dazwischen wo man am Anfang nicht berücksichtigt hat.

    Global läuft mit dem Baustein nichts mehr. Also das Child1 mit dem Panel und die anhängenden 20 anderen Childs haben keine weiteren Verbindung. Die Daten aus diesem Baustein kommen in eine XML. Diese XML bedient dann andere Funktionen.

    @VaporiZed
    Hab dein Code im neuen Projekt getestet mit ein paar Veränderungen. Würde sehr gut funken. In diesen Fall werde ich den nicht übernehmen, weil ich sehr viel umbauen muss und ich schon eine Lösung habe die fehlerfrei Funktioniert. Jedoch aber wird der nächste Baustein davon profitieren und auch so aufgebaut werden. :thumbsup:

    Hier meine Lösung falls es jemanden interessiert als Beispiel.

    Im Child1 LoadEvent:

    VB.NET-Quellcode

    1. Set_Panel(Panel1)


    Modul:

    VB.NET-Quellcode

    1. Module Module1
    2. Public Mod_Panel1 As Panel
    3. Public Sub Set_Panel(ByRef p As Panel)
    4. Mod_Panel1 = p
    5. End Sub
    6. End Module


    Sowohl Child1 als auch die anderen 20 Childs verwenden jetzt das Mod_Panel1.

    Da ja von den 20 Childs immer nur 1 aktiv sein darf, hatte ich zuerst eine Überwachung über ControlUnderMouseposition. Wenn es kein Child von den 20 ist, dann Return.

    Hab ich rausgetan. Ich kann die Sünde einfach nicht lassen. Jetzt ist Child2 bis 21.ShowDialog() und fertig.

    Noch mal vielen Dank an ALLE.

    Schöne Grüße

    Beiträge zusammengefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Na, dass is nun nicht so schön, wie du es in post#24 andeutest:

    DragsTrail schrieb:

    indem ich die benötigten Daten von Child1 ins Modul ByRef auslagere.
    Weil was du da "auslagerst" sind keine Daten, sondern sind Controls.
    Also betreibst du keine Trennung von Gui und Daten, sondern eine ziemlich Verheerende Vermanschung derselben.
    Was meinst du, was passiert, wenn Form2 sich das Mod_Panel1 einfach mal selbst zufügt?
    Probier mal aus - das ergibt höchst überraschende Überraschungen.

    Ist dir der Unterschied von Daten und Gui nicht bekannt?
    Alles was auffm Bildschirm anzeigt ist Gui: nämlich alle Controls, und alle Forms auch (die erben übrigens von Control)
    Dassis was anzeigt.
    Und was angezeigt wird - das sind Daten: Strings, Dates, Integer, ....
    Also das Gui bekommt Daten, und zeigt die an.
    Keinesfalls sollte das Gui Controls bekommen zum Anzeigen. Controls sind höchst komplizierte Objekte mit wahnsinnig vielen Verweisen und Abhängigkeiten. Sowas kann man nicht von a nach b weiterreichen. Jedenfalls muss man sich da nicht wundern, wenn dann was eigentümliches passiert.
    Wir haben da eben verschiedene Ansichten, also ich meine die Bedeutung von auslagern. Ich gebe dir vollkommen Recht.

    Eine Frage: Warum soll sich die Form2 das Mod_Panel selbst hinzufügen???? Das ist gegen jede Logik.

    Wie gesagt es funkt fehlerfrei. Im nächsten Baustein werden/können mehrere Child's nebeneinander existieren und da werde ich das von Grund richtig aufbauen.

    DragsTrail schrieb:

    Warum soll sich die Form2 das Mod_Panel selbst hinzufügen?
    Um das mal auszuprobieren und dabei zu lernen.
    Wir haben da eben verschiedene Ansichten
    und diese Ansichten anzugleichen, allerdings auf unsere Sicht, nicht auf Deine.
    Sonst kann Dir nicht (effektiv) geholfen werden.
    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!

    DragsTrail schrieb:

    Eine Frage: Warum soll sich die Form2 das Mod_Panel selbst hinzufügen???? Das ist gegen jede Logik.
    Nö - was soll daran unlogisch sein, wenn in Form2 steht:

    VB.NET-Quellcode

    1. Me.Controls.Add(Mod_Panel1)


    Für mich ist eher so'n Satz unlogisch:

    DragsTrail schrieb:

    Wir haben da eben verschiedene Ansichten, [...]. Ich gebe dir vollkommen Recht.
    Ja, wattn nu? ;)


    Also ihr reist jetzt den Satz komplett aus dem Zusammenhang :D
    ​Ansicht ist bezogen auf das Wort "AUSLAGERN". Ich habe nicht behauptet das ich das besser kann oder weis, sondern aus Unwissenheit. 8-)

    ​Wo steht in Form2

    VB.NET-Quellcode

    1. ​Me.Controls.Add(Mod_Panel1)


    ​In Form2 ( Child1 ) ist das Panel1. Dieses wurde durch den Designer eingefügt. Beim laden ist es ja als Control vorhanden aber ich benutze es ja nirgendwo. Nicht direkt.
    Sowohl in Child1 als auch in den anderen 20 Childs wird nur Mod_Panel1 verwenden.

    ​Recht hast du eben, weil du recht hast. Ich hab jetzt hier auch was gelernt und werden das im nächsten Baustein einfließen lassen.
    Lies doch mal die Antworten hier richtig. Es hat niemand gesagt das In Form2 ​Me.Controls.Ass(Mod_Panel1) steht, sonder was ist WENN es da stehen würde?
    Die Antwort hat RodFromGermany schon gegeben.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.