none
zweite Form im Programm eingefügt, in dieser nun alle Variablen unbekannt RRS feed

  • Frage

  • habe über den Designer eine zweite Form hizugefügt und habe nun das Problem das in dieser gesamtziehung und ausgangszähler unbekannt sind bzw. ich weiß  nicht wie ich von der zweiten Form (vorhersage) aus zugreifen kann

    arbeite mit win prof 64 bit auf AMD Athlon64 X2 6000+ Plattform

    Public Class Lotto

        Dim con As New OleDb.OleDbConnection
        Dim cmd As New OleDb.OleDbCommand
        Dim reader As OleDb.OleDbDataReader
        Dim ziehungsnummer As New ArrayList
        Public gesamtziehung(2500) As Ziehung
        Public ausgangszähler As Integer


        Public Class Ziehung
            Public ziehungszähler As Integer
            Public datum As String
            Public jahr As Integer
            Public woche As Integer
            Public ziehungstag As String
            Public zahl_1 As Integer
            Public zahl_2 As Integer
            Public zahl_3 As Integer
            Public zahl_4 As Integer
            Public zahl_5 As Integer
            Public zahl_6 As Integer
            Public zusatzzahl As Integer
        End Class

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            con.ConnectionString = _
                               "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                               "Data Source=C:\users\bernd\übungen\Bernd_lotto1.mdb"
            cmd.Connection = con
        End Sub


        Private Sub füllen()

            Dim con As New OleDb.OleDbConnection
            Dim cmd As New OleDb.OleDbCommand
            Dim reader As OleDb.OleDbDataReader
            Dim anzahl As Integer
            anzahl = 0

     

            con.ConnectionString = _
               "Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=C:\users\bernd\übungen\Bernd_lotto1.mdb"
            cmd.Connection = con
            cmd.CommandText = "select * from Lotto_Zahlen_gesamt order by Ziehungszähler"
            con.Open()
            reader = cmd.ExecuteReader()
            anzahl = 0
            Try

                Do While reader.Read()
                    Dim einzelziehung As New Ziehung
                    einzelziehung.ziehungszähler = Convert.ToInt32(reader("Ziehungszähler"))
                    einzelziehung.datum = Convert.ToString(reader("Datum"))
                    einzelziehung.jahr = Convert.ToInt32(reader("Jahr"))
                    einzelziehung.woche = Convert.ToInt32(reader("Woche"))
                    einzelziehung.ziehungstag = reader("Ziehungstag")
                    einzelziehung.zahl_1 = Convert.ToInt32(reader("Zahl_1"))
                    einzelziehung.zahl_2 = Convert.ToInt32(reader("Zahl_2"))
                    einzelziehung.zahl_3 = Convert.ToInt32(reader("Zahl_3"))
                    einzelziehung.zahl_4 = Convert.ToInt32(reader("Zahl_4"))
                    einzelziehung.zahl_5 = Convert.ToInt32(reader("Zahl_5"))
                    einzelziehung.zahl_6 = Convert.ToInt32(reader("Zahl_6"))
                    einzelziehung.zusatzzahl = Convert.ToInt32(reader("Zusatzzahl"))
                    gesamtziehung(anzahl) = einzelziehung
                    anzahl = anzahl + 1

                Loop

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

            reader.Close()
            con.Close()

            MsgBox(" der Test" & gesamtziehung(100).ziehungszähler)
            ausgangszähler = anzahl
        End Sub
     .
     .
     .
       Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

            Vorhersage.Show()
        End Sub
    End Class

    Montag, 22. März 2010 16:17

Antworten

  • Hallo,

    Gesamtziehung und ausgangszähler sind Mitglieder von Form1 und stehen nicht global im Projekt zur Verfügung, sondern beziehen sich immer auf die Instanz von Form1. Mit den Geisterinstanzen von VB arbeitend, müsstest Du in Form2 schreiben:

    Wert = Form1.ausgangszähler

     


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert loewe_62 Montag, 22. März 2010 20:13
    Montag, 22. März 2010 17:02

Alle Antworten

  • Hallo,

    Gesamtziehung und ausgangszähler sind Mitglieder von Form1 und stehen nicht global im Projekt zur Verfügung, sondern beziehen sich immer auf die Instanz von Form1. Mit den Geisterinstanzen von VB arbeitend, müsstest Du in Form2 schreiben:

    Wert = Form1.ausgangszähler

     


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert loewe_62 Montag, 22. März 2010 20:13
    Montag, 22. März 2010 17:02
  • Hallo loewe_62,

    wenn du deine Werte aus einer Form allgemeingültig verwenden möchtest, muss du die Deklaration als Public innerhalb eines Moduls machen:

    Module Modul1
    Public ziehungszähler As Integer
            Public datum As String
            Public jahr As Integer
            Public woche As Integer
            Public ziehungstag As String
            Public zahl_1 As Integer
            Public zahl_2 As Integer
            Public zahl_3 As Integer
            Public zahl_4 As Integer
            Public zahl_5 As Integer
            Public zahl_6 As Integer
            Public zusatzzahl As Integer
    End Module

    Das geht auch.

    Viel Erfolg

     


    Liebe Grüße Stefan
    Montag, 22. März 2010 19:30
  • Hallo Torsten

    danke für den einfachen Tip - funtioniert- aber es ergeben sich zwei neue Fragen wie kann ich Variable global deklarieren und wie verhält sich das mit den Geisterinstanzen :-)

    Bernd

    Montag, 22. März 2010 20:12
  • Hallo Bernd,

    globale Variablen sollte man nach Möglichkeit vermeiden, weil sie eine viel zu große Manipulationsgefahr darstellen. Der Wert kann "irrtümlich" geändert werden an einer Stelle des Programms, wo Du eine Änderung nicht vorgesehen hast und somit auch nicht erwartest.

    Neben der von Stefan angesprochenen Möglichkeit, Module zu verwenden, wovon ich persönlich nur abraten kann, da sie einen Rückfall zu prozeduralen Programmierparadigmen geradezu provozieren, kannst Du Deine Variablen als Shared deklarieren. Damit sind sie nicht an eine Instanz gebunden:

    Public Class1
       Public Shared Foo As Integer
    End Class

    Damit hast Du die gleiche Zugriffsmöglichkeit, wie bei einem Modul, bist aber gezwungen diesen Verweis immer voll qualifiziert anzugeben:

    Dim x As Integer = Class1.Foo

    Hier weißt Du aber immer welches "Foo" Du gerade bearbeitest, da "Class1" bzw. der Name der Klasse in der "Foo" deklariert ist, immer vorangestellt werden muss. Bei einem Modul wäre dies optional.

    Die andere Option wäre die Übergabe der benötigten Parameter an das aufzurufende Formular, wenn es ohnehin nur eine "Einbahnstraße" sein sollte, also das Form nur Daten darstellen soll.

    Mit "Geisterinstanzen" meine ich eben jene Formular Instanzen, die VB im Hintergrund automatisch erzeugt. Jedes Formular existiert als Instanz. Dabei müsstest Du explizit sagen:

    Dim x As New Form1()

    Damit erstellst Du eine neue Instanz von Form1. Diesen Vorgang nimmt VB Dir jetzt aber ab. Sobald Du die Anweisung "Form1...."angibst, erstellt VB eine neue Formularinstanz, die unter diesem Namen abgefragt werden kann, sofern sie noch nicht erstellt wurde. Dieses Verhalten kann verwirrend sein auch wenn es erstmal unheimlich praktisch erscheint.

     


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Montag, 22. März 2010 20:40