Auf Integer von Form1 von Form2 zugreifen

  • VB.NET

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

    Auf Integer von Form1 von Form2 zugreifen

    Hallöchen
    ich habe in meiner Form1 einen Integer. "Dim testinteger as Integer = 1".
    Nun möchte ich von Form2 auf diesen zugreifen mit "Form1.testinteger = 2"

    Allerdings bekomme ich den Fehler Fehler "MeinProjekt.Form1.testinteger" ist in diesem Kontext nicht zugreifbar, da es "Private" ist.

    Wie bekomme ich es hin auf diesen zuzugreifen?
    Hoffe jemand kann mir helfen.

    Liebe Grüße
    shocK
    Hey,

    was Du hier hast ist eine Top -> Down Beziehung. Heisst: Form2 wird in Form1 instanziert, somit sollte Form2 in Form1 ein Event auslösen, dass entsprechend behandelt wird.

    Gewöhn es Dir schnell wieder ab, Form1.Variable = irgendwas zu schreiben, das ist absoluter Krampf. Lern es gleich richtig. Nähere Infos hierzu:

    vb-paradise.de/allgemeines/tip…-und-aufruf-von-dialogen/

    Ein Beispiel, wie Du es lösen kannst.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _theInteger As Integer
    3. Private WithEvents _f2 As New Form2
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. If Not _f2 Is Nothing AndAlso Not _f2.IsDisposed Then
    6. _f2.Show()
    7. Else
    8. _f2 = New Form2
    9. _f2.Show()
    10. End If
    11. End Sub
    12. Private Sub _f2_IntegerChanged(sender As Object, e As Integer) Handles _f2.IntegerChanged
    13. _theInteger = e
    14. MessageBox.Show("Der Integer wurde geändert: " & _theInteger.ToString())
    15. End Sub
    16. End Class


    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Event IntegerChanged As EventHandler(Of Integer)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. OnInegerChanged(20)
    5. End Sub
    6. Protected Overridable Sub OnInegerChanged(i As Integer)
    7. RaiseEvent IntegerChanged(Me, i)
    8. End Sub
    9. End Class


    Auch solltest Du Dir angewöhnen, globale Variablen mit Private oder Public zu deklarieren. Als Hausaufgabe überleg Dir mal, welcher Modifizierer Dim entspricht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Weil das dem Grundgedanken der objektorientierten Programmierung widerspricht. Das geht nur in VB, da der Compiler im Hintergrund jeden Aufwand betreibt, um Dir dieses abartige Unding zu ermöglichen. Das geht in keiner anderen .NET-Sprache und ist mitunter ein Grund dafür, dass VB immer noch als "minderwertige Sprache" angesehen wird. Diese alten Relikte sollten endlich in Vergessenheit geraten. Probier das mal in C#, Du wirst scheitern. Also, tu Dir selber einen grossen Gefallen und mach es richtig und lies vor allem den Link, den ich Dir gegeben habe, Rod erklärt alles nötige dazu...
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    shocK schrieb:

    WARUM soll ich es denn so nicht machen, wenn es funktioniert?
    Solch Code:

    VB.NET-Quellcode

    1. Form1.testInteger=99
    zeigt, dass der Unterschied von Objekt und Klasse nicht verstanden ist.
    Und diese Wissenslücke ist das eigliche Manko, mit dem man iwann auf unüberwindbare Probleme stößt.

    (naja - sind schon überwindbar, aber durch eigene Recherchen schafft das keiner, der sich an diesen Unfug gewöhnt hat)


    gugge VeryBasics
    Mach Dir eine Public Property MyInteger() As Integer in die Form2.
    Mit der Instanz frm2 kannst Du dann direkt drauf zugreifen: frm2.MyInteger = 5.
    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!

    shocK schrieb:

    Wie jetzt?
    Lesen, verstehen, umsetzen.

    VB.NET-Quellcode

    1. Form2.MyInteger = 2
    2. ' und
    3. Dim frm2 As New Form2
    4. frm2.MyInteger = 2
    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!
    Du musst den Unterschied zwischen Objekt und Klasse verstehen lernen. (wie @ErfinderDesRades: bereits sagte).

    Form1 wie sie einem neuen Projekt rechts zu sehen ist, ist eine Klasse. Auf die Eigenschaften einer Klasse kann man NICHT zugreifen solange kein Objekt daraus erstellt wurde (Ausnahme sind zB. statische Member tun hier jedoch nichts zur Sache).
    Der Visual Basic Compiler lässt aber leider bei Windows Formen das genau zu, da es irgendwie im Hintergrund möglich gemacht wird.

    Ein Objekt erstellt man mit dem Schlüsselwort "New".

    VB.NET-Quellcode

    1. Dim MeinFormObjekt as New Form1
    2. Messagebox.show(MeinFormObjekt.Name)


    Jetzt kann ich auf die Eigenschaften von Form1 zugreifen. Jedoch nicht über die Klasse (Form1) sondern über das erstellte Objekt (MeinFormObjekt).

    Zusammendfassend:

    VB.NET-Quellcode

    1. Messagebox.Show(Form1.Name) 'FALSCH
    2. Dim MeinFormObjekt as New Form1
    3. Messagebox.show(MeinFormObjekt.Name) 'RICHTIG


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    naja - jetzt ist aber die in post#1 angefragte Kommunikations-Richtung nicht mehr berücksichtigt (RFG hat damit angefangen, die einfach annersrum anzunehmen).
    Der TE will ja von frm2 aus eine manipulation am bereits vorher bestehenden frm1 vornehmen, und da hilft ihm frm2.TestInteger = 99 herzlich weniglich.

    Also wieder gugge post#2 - Bottom-Up-Kommunikation - Event - VeryBasics