Benutzer mit den meisten Antworten
zweite Form im Programm eingefügt, in dieser nun alle Variablen unbekannt

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 ClassPrivate 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 = 0con.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
TryDo 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 + 1Loop
Catch ex As Exception
MsgBox(ex.Message)
End Tryreader.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.ClickVorhersage.Show()
End Sub
End Class
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
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
-
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- Bearbeitet Robert Breitenhofer Donnerstag, 25. März 2010 12:22 Code formatierung
-
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