Zugriff unter Forms

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von **Daniel**.

    Zugriff unter Forms

    Hallo an Alle,

    ich habe jetzt schon eine Menge gesucht und probiert aber ich bekomme es einfach nicht gebacken. ?( ?( ?(

    Meinen Ausgangslage:
    Ich habe eine Form 1 die meine Einstellungsdatei einliest und dann je nach Einstellung einen bestimmte Form lädt und sich selbst schließt.
    Der Einfachheit halber nenne die geladene Form mal Form 2.

    Form 2 dient nur zu anzeige von Daten. Diese hat ein TrayIcon das bei einen Click die Form 3 öffnet, die das Steuerungsmenü darstellt.

    Form 2 bleibt immer geöffnet, Form 3 kann auch geschlossen werden.



    Mein Problem:
    Jetzt wollte ich gerne bei einen Button Click in Form 3 einen Wert in eine Eigene Sub von Form 2 übergeben und in dieser Eigenen Sub soll zu Laufzeit ein Labeltext geändert werden.
    Wie ich die Werte in den Sub übergebe weiß ich schon aber ich bekomme die Sub die in der Form 2 sitzt nicht aus Form 3 aufgerufen.

    Leider bekomme ich es nicht zum laufen.

    Visual Basic-Quellcode

    1. Form2.EigeneSub("Irgendwas")

    so funktioniert das schon, hat aber meines Wissen nach nichts mit vb.net zu tun und genau das will ich ja lernen und verstehen.



    So rufe ich die Form 3 auf:

    VB.NET-Quellcode

    1. Dim Form_3 as frm_3
    2. ..
    3. ..
    4. ..
    5. If Form_3 is Nothing then
    6. Form_3 = New frm_3()
    7. Form_3.Show()
    8. ElseIf Form_3.Visible = True then
    9. Form_3.Visible = false
    10. endif


    Ich hoffe ihr könntet mir helfen

    Danke und Grüße Daniel
    Generiere in Form3 einen Konstruktor der als Parameter Form2 erwartet.
    Deklariere zuvor eine globale Variable vom Typ Form2 und weise seinen Wert im Konstruktor zu.

    Wenn du nun Form3 instanziierst , musst du nun Me übergeben.
    Und Gott alleine weiß alles am allerbesten und besser.
    Danke für die schnelle Antwort.

    könnte ich nach dem ich meine Berechnung in Form 3 erfüllt habe auch ein Event an die Form 2 schicken die mir dann meinen Sub den ich benötige ausführt und Werte gleich mit übergeben?

    Grund:
    Habe auf Form 3 eine Combox die ich an ein DataSet gebunden habe und wenn ich es mit dem Konstrutor lösen dann wird der Inhalt er Combobox geändert.
    Wieso weiß ich leider nicht.


    Danke Grüße
    Daniel

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

    Jo, das geht auch, ist sogar besser, denn Form2 ist ja mal diese mal jene Form-Klasse, je nachdem wie beim Startup in Form1 entschieden wurde.

    Nur "Event an Form2 schicken" ist Wirrsal.
    Ein Event schickt man nicht irgendwo hin, sondern man löst es nur aus.
    Und wer es empfangen will, muss zuvor dafür gesorgt haben, dass er es empfangen kann (mittels Handles-Klausel, oder mittels AddHandler).
    Gugge Alles über Events



    Wenn du das gelöst hast, ist die nächste Frage, was soll überhaupt Form1, wenn es doch nur Einstellungen liest und dann wieder schließt?
    Einstellungen lesen kann man auch ohne ein Form (was scheints eh garnet angezeigt wird).
    Aber das ist erst die nächste Frage - löse erstmal das mit dem Event, ausgelöst von Form3, und empfange von Form2 (was zuvor dafür sorgen musste, dass es es empfangen kann).
    Danke für die schnelle Antwort.

    Ich habe jetzt ca 2 Stunden probiert, gelesen und dein Video etliche mal angesehen, aber ich kann es für meinen Fall nicht anwenden.


    Kurz nochmal zum Ablauf was passieren soll:


    Form 1 startet, liest Daten ein und anhand der Daten wird einen bestimmte Form 2 geöffnet (die besserer Lösung kommt dann an die Reihe wenn ich das hier gelöst habe) :D

    Form 2 zeigt mir Daten an und bleibt immer geöffnet.
    Mit einen Klick auf das TrayIcon von Form 2 öffne ich mein Menü bzw. Form 3.

    In Form 3 wählt man aus einer Combobox einen Wert aus, und klickt auf den Button Ändern.
    Dieser Button führt beim Klick einen Code aus und wenn dieser erledigt ist soll eine Sub in Form 2 aufrufen werden die die Text Eigenschaft meiner Labels ändert.

    Die ausgeführte Sub muss aber auf eine Variable zugreifen die mit Form 1 eingelesen wird und dann an Form 2 weitergegeben wurde.


    Sorry aber ich weiß einfach nicht wie ich das momentan lösen soll.
    Lief ja alles schon, aber leider mit Code der nicht vb.net ist sondern eher vb 6 und davon will ich weg.


    Danke Daniel
    Wie der gewünschte Ablauf ist, habich glaub schon recht verstanden.
    Wenn du in deim Problem vorankommen willst, musst du erklären, was nu das Problem ist.
    "kann ich nicht" - dabei kann dir niemand helfen.
    NIchtmal, wenn jemand das für dich fertig-codet, wäre dir wirklich geholfen, denn die Hilfe sollte imo nicht in der Lösung bestehen, sondern im Verständnis der Lösung.

    ah -

    **Daniel** schrieb:

    kann es für meinen Fall nicht anwenden
    Hast du gedacht, du könntest meinen Code bei dir einpasten, und täte, was du wollest? - so geht das nur in seltensten Fällen.

    Das Tut ist dazu da, verständlich zu machen, wie man Events programmiert und abonniert - beinhaltet also alles, was du brauchst, um deine eigene gute Idee aus post#3 umzusetzen.

    NUn setze sie um, oder versuche es wenigstens. Melde zurück, an welchen Punkten ggfs. Probleme auftreten - wie gesagt - mit "kann ich nicht" kann niemand helfen.
    :D habe zum 10.mal jetzt dieses Tutorial durchgelesen: Dialoge: Instanziierung von Forms und Aufruf von Dialogen

    Hab des jetzt mal auf mein Projekt angewandt.

    In Form 1:

    VB.NET-Quellcode

    1. Private WithEvents form2 As frm2



    Form 2 aufrufen:

    VB.NET-Quellcode

    1. If form2 Is Nothing OrElse form2.IsDisposed Then
    2. form2 = New frm2
    3. End If
    4. If Not form2 .Visible Then
    5. form2.Show(Me)
    6. Else
    7. form2.Close()
    8. End If



    In Form 2:

    VB.NET-Quellcode

    1. Public Event Daten_Ändern(ByVal text1 As String, ByVal text2 As String, ByVal text3 As String)


    Passiert beim klick auf Button ändern

    VB.NET-Quellcode

    1. RaiseEvent Daten_Ändern(info1,info2, info3)


    Hier dann der Sub in Form 1:

    VB.NET-Quellcode

    1. Public Sub Ändern(ByVal Pal_Nr As String, ByVal NCP As String, ByVal BEN As String) Handles form2.Daten_Ändern
    2. ...



    So das funktieriert erstmal alles, so das ich jetzt endlich mit dem Rest weitermachen kann.

    @ ErfinderDesRades:
    Gebe dir ja recht ich hätte mein Problem genauer beschreiben sollen, aber ich habe es ja gott sei dank mit hilfe des Tutorials gelöst. Copy / Paste war nie meine Absicht.

    Ich hoffe die Lösung findet deine Zustimmung. ;)

    Grüße und Danke für die Geduld
    Daniel

    P.S.: Wie kann ich denn ohne meine Form1 Einstellungen einlesen, verarbeiten und dann die dazugehörige Form laden?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „**Daniel**“ ()

    naja, dein Code ist höchst undurchsichtig, und hofflich stehen deine Snippets nicht wirklich so in deim Projekt.
    Weil Form2 hat bei dir glaub4 verschiedene Namen.

    In Snippet#1 gibts eine frm2-Instanz mit Namen form2

    In Snippet#2 taucht auf einmal ein form_form2 - niemand weiß woher, aber es wird auf Nothing und .IsDisposed getestet.
    Falls einer der Tests zutrifft wird witzigerweise ein neues frm2 erstellt und an form2 zugewiesen - form_form2 bleibt davon ja ganz unberührt.

    In Snippet#4 schließich addressiert die Handles-Klausel dann nochmal was ganz anderes, nämlich ein form_menü_18 - wo immer das nu auf einmal herkommt.
    Ok - nun ist der Code zumindest konsistent.
    Wie du mit "Kopiere die Form Namen immer um, so das die Verwirrung nicht allzu groß wird." Verwirrung verminderst ist mir schleierhaft. Imo (und wie's aussieht) wird so Verwirrung erst geschaffen.
    Was wirklich wichtig wäre, wäre eine vernünftige Benamung -
    Nomen est Omen!
    Wofür ein Form da ist, so soll es auch heissen! (gilt nicht nur für Forms - gilt für alle Klassen gleichermassen, gilt auch für Methoden, Variablen, Properties - gilt einfach für allen Code!)

    **Daniel** schrieb:

    P.S.: Wie kann ich denn ohne meine Form1 Einstellungen einlesen, verarbeiten und dann die dazugehörige Form laden?
    Naja, dassis ein klein bischen advanced - dafür musste das AnwendungsFramework deaktivieren.
    gugge AnwendungsFramework deaktivieren
    Dort das Sample entscheidet nach UserClick auf eine Messagebox, mit welchem Form gestartet wird. (Und ist noch anderer Kram gezeigt - SplashScreen mit Feedback - hier nicht relevant)