Announcement

Collapse
No announcement yet.

Form aus einem anderen Form laden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Form aus einem anderen Form laden

    Hallo,
    ich schreibe gerade an einer VB.Net Anwendung für den PocketPC und möchte dabei das wenn ich auf den Button in einem Form drücke, dann ein neues Form dargestellt wird und das ich davon auch wieder zurück kann.
    Das Hauptform ist Main.vb

    <PRE>
    Imports System.IO
    Imports System
    Imports System.Exception

    Public Class Main
    Inherits System.Windows.Forms.Form
    Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox
    Friend WithEvents Label1 As System.Windows.Forms.Label

    Const FILENAME = "auftrag.txt" ' Konstante Dateiname

    #Region " Windows Form Designer generated code "
    ...
    #End Region

    Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' ##################### Datei zum testen erstellen und mit Daten füllen
    Dim sr As StreamWriter
    sr = New StreamWriter("\" & FILENAME)
    sr.WriteLine("789")
    sr.WriteLine("456")
    sr.WriteLine("123")
    sr.Close()
    ' ######################
    Call readNr() ' Aufruf zum lesen der Datei
    End Sub

    ' Auslesen der Datei auftrag.txt
    Private Sub readNr()
    Try
    Dim FiStr As FileStream = New FileStream("\" & FILENAME, FileMode.Open)
    Dim StrRe As StreamReader = New StreamReader(FiStr)
    Dim i As Integer
    Dim iCount As Integer
    ComboBox1.Items.Clear()

    Do Until StrRe.Peek() = -1
    ComboBox1.Items.Insert(0, StrRe.ReadLine)
    i += 1
    Loop
    StrRe.Close()
    Catch except As Exception
    MsgBox(except.ToString)
    End Try
    End Sub

    ' Programm beenden
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Me.Close()
    End Sub

    ' Anzeigen des Forms für die Dateneingabe
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
    Dim myForm1 As Form1
    myForm1.Show()
    Catch except As Exception
    MsgBox(except.ToString)
    End Try
    End Sub
    End Class
    </PRE>

    und das Form1 hat den Code

    <PRE>
    Imports System.IO
    Imports System

    Public Class Form1
    Inherits System.Windows.Forms.Form
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

    Const FILENAME = "daten.txt" ' Konstante Dateiname

    #Region " Vom Windows Form-Designer generierter Code "
    ...
    #End Region

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Prüfung ob Datei schon vorhanden ist
    ' Andernfalls neu erstellen
    myForm1 = Me
    Dim sr As StreamWriter
    ' Nachschauen ob die Datei schon vorhanden ist, wenn ja neu erstellen
    If System.IO.File.Exists("\" & FILENAME) = False Then
    sr = New StreamWriter("\" & FILENAME)
    sr.Close()
    End If
    TextBox1.Focus()
    End Sub

    ' Auf 'Return'- Zeichen in der Eingabe reagieren
    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    ' Wenn 'Return' betätig wird
    If Asc(e.KeyChar) = 13 Then
    Call writeFile() ' Aufruf writeFile() - Daten in Datei schreiben
    End If
    End Sub

    ' Datei öffnen und eingescannte Daten in diese schreiben
    Private Sub writeFile()
    ' String formatieren ( Tag + Zeit + ID ) und in Datei schreiben
    Dim FiStr As FileStream = New FileStream("\" & FILENAME, FileMode.Append)
    Dim StrWr As StreamWriter = New StreamWriter(FiStr)
    StrWr.WriteLine(Format(Now(), "d. MMM yyyy") & "|" & Format(Now(), "HH:mm:ss") & "|" & TextBox1.Text)
    StrWr.Close()
    TextBox1.Text = ""
    TextBox1.Focus()
    Call readFile() ' Aufruf readFile - aktualisieren der ListBox
    End Sub

    ' Auslesen der Datei und füllen der ListBox
    Private Sub readFile()
    Try
    Dim FiStr As FileStream = New FileStream("\" & FILENAME, FileMode.Open)
    Dim StrRe As StreamReader = New StreamReader(FiStr)
    Dim i As Integer
    Dim iCount As Integer
    ListBox1.Items.Clear()

    Do Until StrRe.Peek() = -1
    ListBox1.Items.Insert(0, StrRe.ReadLine)
    i += 1
    Loop
    StrRe.Close()
    TextBox1.Focus()
    Catch except As Exception
    End Try
    End Sub

    ' Anwendung schließen
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.Close()
    End Sub

    ' Löschen des Inhalts der Datei
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim FiStr As FileStream = New FileStream("\" & FILENAME, FileMode.Truncate)
    Dim StrWr As StreamWriter = New StreamWriter(FiStr)
    StrWr.Close()
    ListBox1.Items.Clear()
    End Sub
    End Class
    </PRE>

    aber ich bekomme immer eine Exception und kein Form.

    Gruß cos

  • #2
    Hi Rene,

    das geht am besten mit Polymorphie:

    Zunächst ein Interface erzeugen, also einfach eine klasse hinzufügen und wie folgt codieren:
    <PRE>
    Public Interface IMyInterfaceName
    Sub Ikey(optional vValue AS Object)
    End Interface
    </PRE>

    Dann in Form1 den Aufruf von Form2 ungefähr so gestalten:
    <PRE>
    Dim f as new Form2
    f.Init(ME)
    f.visible=True
    </PRE>
    Im Deklarationsbereich von Form1 muss das Interface implementiert werden, und zwar so:
    <PRE>
    Implements IMyInterfaceName
    </PRE>
    Im Deklarationsbereich der Form2 eine Variable vom Typ des Interfaces bilden:
    <PRE>
    Private MyContainer AS IMyInterfaceName
    </PRE>
    In Form2 eine öffentliche Sub erzeugen:
    <PRE>
    Public Sub INIT(Optional ByVal Container As IMyInterfaceName= Nothing)
    Try
    Cursor.Current = Cursors.WaitCursor

    If Not Container Is Nothing Then
    MyContainer = Container
    End If

    Cursor.Current = Cursors.Default
    Catch ex As Exception
    Messagebox.Show(ex.Message)
    End Try
    End Sub
    </PRE>
    Im Closing-Event von Form2:
    <PRE>
    If Not MyContainer Is Nothing Then
    MyContainer.Ikey()
    MyContainer = Nothing
    End If
    </PRE>

    Das schöne an der Polymorphie ist, dass Du mehrere Formulare mit dem gleichen Interface ausstatten kannst und immer zum richtigen Formular zurückkommst.

    Wenn Du das einmal gemacht hast, wirst Du keinen anderen Mechanismus mehr benutzen.

    Liebe grüße
    Ronn

    Comment

    Working...
    X