| |
VB.NET - Ein- und UmsteigerProblem mit Formxy.shown | | | Autor: SvenZ | Datum: 09.03.15 12:00 |
| Ich öffne eine Form per Doppelklick auf einen TreeView Eintrag.
Im Formxy.shown event will ich eine Variable setzen.
Jetzt hab ich festgestellt, dass dieses .shown event nicht immer gefeuert wird, obwohl ich die Form vorher mit me.close echt geschlossen habe.
Wie komme ich dem Problem hier nach?
PS: ich setze jetzt meine Variable im visible_changed event, das klappt.
mit freundlichen Grüßen
Sven | |
Re: Problem mit Formxy.shown | | | Autor: Manfred X | Datum: 09.03.15 13:47 |
| Hallo!
Wie "öffnest" Du dieses Formular?
Wenn Du eine neue Instanz erstellst und sie
mit der Show-Methode anzeigst, kannst Du die Variable
im "Load" oder im "Shown"-Event setzen.
Bei einem Dialog-Formular solltest Du vor der Anzeige des Dialogs
die Variable im rufenden Formular per öffentlicher Eigenschaft
des Dialog-Formulars setzen.
Beitrag wurde zuletzt am 09.03.15 um 13:50:35 editiert. | |
Re: Problem mit Formxy.shown | | | Autor: SvenZ | Datum: 09.03.15 14:03 |
| Ich öffne die Form einfach mit Formname.show().
Und ich bin auch sicher, dass das nicht nochmal passiert, solange die Form nicht geschlossen wurde.
Die Variable, die ich dort setzen will, ist schon public.
Auch wenn ich das Problem eigentlich schon gelöst habe (.visiblechanged),
ist doch das eigentliche Problem, warum das .shown Event nicht zuverlässig kommt.
mit freundlichen Grüßen
Sven | |
Re: Problem mit Formxy.shown | | | Autor: Manfred X | Datum: 09.03.15 14:16 |
| Ich vermute, Du verwendest die sog. DefaultInstanz des Formulars.
(Ansprechen per Name). Die wird beim Schließen nicht vernichtet.
Die Nutzung ist in VB.Net zwar möglich, wird aber nicht empfohlen.
Erstelle Deine Instanzen untergeordneter Formulare
immer mit dem Schlüsselwort New.
Damit hast Du die volle Code-Kontrolle über das Erstellen,
Referenzieren und Vernichten von Instanzen.
| |
Re: Problem mit Formxy.shown | | | Autor: SvenZ | Datum: 09.03.15 14:26 |
| OK, das geht dann so (?):
Public Form_sz As New Form 'Form_sz ist der Name der Form
Form_sz.show()
...
Form_sz.close() und wie muss ich die Instanz vernichten?
mit freundlichen Grüßen
Sven | |
Re: Problem mit Formxy.shown | | | Autor: Manfred X | Datum: 09.03.15 14:42 |
| Du mußt bei New den Typnamen der Form angeben, also z.B.
'Instanz von "Form1"-Form unter der Referenz-Variable "MyForm" erstellen
Dim MyForm As New Form1 Die per "MyForm.Show" angezeigte Instanz von Form1 wird beim "MyForm.Close" verworfen,
falls inzwischen keine weitere Referenz im Code gesetzt worden ist.
Alle Ressourcen werden freigegeben.
Die "MyForm"-Variable ist dann zwar nicht Nothing,
die referenzierte Formular-Instanz kann aber nicht mehr angezeigt werden.
Zugriffs-Variable für Instanzen untergeordneter Formulare die mit Show gezeigt werden
(nicht-modal), sind gewöhnlich auf der Modulebene des Owner-Formulars erstellt worden.
Einige weiterführende Links finden sich hier:
http://www.vbarchiv.net/forum/id22_i88720t88707_fehler-konvertierungsfehler-in-typ-integer.html
Beitrag wurde zuletzt am 09.03.15 um 14:58:31 editiert. | |
Re: Problem mit Formxy.shown | | | Autor: SvenZ | Datum: 09.03.15 17:11 |
| sehr aufschlußreich...danke.
Ich muß also vor jedem .show meiner Form (als Instanz) die Instanzvariable neu zuweisen (bei Doppelklick in meinem Treeview). Das bedeutet, es geht nicht public ... (da in privater Sub).
Blöderweise verwende ich in meiner Form aber wiederum Proceduren, in denen ich direkt auf das Formular referenziere, also sowas: Formularname.Textbox1.Text="irgendwas"
Das müsste dann alles auf die Formularinstanz umgeschrieben werden, wo mich wiederum o.g. Deklerationsproblem erschlägt.
Erfordert in meinem Fall massive struktrelle Änderungen, wo ich aber nicht drumrum kommen werden.
mit freundlichen Grüßen
Sven | |
Re: Problem mit Formxy.shown | | | Autor: Manfred X | Datum: 09.03.15 17:24 |
| Was genau ist Dein Problem?
Du kannst durchaus DefaultInstanzen verwenden.
Du mußt vor dem Show dieses Formulars Deine gewünschten Werte
auf die öffentlichen Eigenschaften oder Membervariablen des
untergeordneten Formulars bereits im rufenden Formular zuweisen.
Sei "XForm" das StartFormular und "XSubForm" eine zweite Form ...
Public Class XForm
Dim WithEvents btn1 As New Button With {.Parent = Me, .Text = "Sub1"}
Dim WithEvents btn2 As New Button With {.Parent = Me, .Text = "Sub2", .Top _
= 40}
Private Sub btn1_Click(sender As Object, e As System.EventArgs) Handles _
btn1.Click
XSubForm.Text = "Gerufen von Button 1"
XSubForm.Show()
End Sub
Private Sub btn2_Click(sender As Object, e As System.EventArgs) Handles _
btn2.Click
xSubform.Close()
XSubForm.Text = "Gerufen von Button 2"
XSubForm.Show()
End Sub
End Class
Beitrag wurde zuletzt am 09.03.15 um 17:27:04 editiert. | |
Re: Problem mit Formxy.shown | | | Autor: Kuno60 | Datum: 10.03.15 16:19 |
| Hallo,
das Shown Ereignis wird nur dann nicht ausgelöst, wenn im Load Ereignis ein Fehler aufgetreten ist.
Wenn du das Projekt mit Debugger startest, wird bei einem Fehler im Load Ereignis, das Programm nicht unterbrochen. Fehler werden nur im Ausgabefenster angezeigt. Nachfolgender Code wird nicht ausgeführt und auch das Shown Ereignis wird nicht ausgelöst. Wenn du es ohne Debugger startest, wird das Programm unterbrochen und der Fehler gemeldet.
Die Ursache für einen Fehler kann eine öffentliche Variable sein, die bereits verwurfen wurde.
Beim Öffnen einer Form mit Show oder ShowDialog wird zuerst eine Instanz der Form erstellt, die Sub New durchlaufen, die Steuerelemente erstellt, dann das Load Ereignis aufgerufen und dann das Shown Ereignis.
Wird die Form geschlossen, mit Close oder durch Klick auf das Schließsymbol, so wird die Instanz der Form verworfen, ebenfalls alle Steuerelemente und alle öffentlichen Variablen.
Wird die Form nur ausgeblendet mit Visible=False oder Hide() so bleibt alles erhalten.
Angenommen Form2 beinhaltet diesen Code:
Public Class Form2
Public frm As Form
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Label1.Text = frm.Text
End Sub
End Class Das Label zeigt den Titeltext der übergebenen Form (frm) an.
Wird nun in Form1 der Variable "frm" eine Form zugewiesen, so wird eine Instanz der Form2 erstellt, also Sub New durchlaufen.
Load und Shown werden erst aufgerufen, wenn die Form angezeigt wird.
Beispiel:
Beim Klick auf einen Button in Form1 wird dies aufgerufen:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
Form2.frm = Me
Form2.Show()
End Sub Dies ist völlig korrekt und löst keinen Fehler aus.
Wird nun die Form2 geschlossen und erneut geöffnet tritt ein Fehler auf, da die Variable "frm" in Form2 nun Nothing ist.
Form2.frm = Me
Form2.Show()
Form2.Close()
Form2.Show() 'Hier Fehler im Load-Ereignis! So ist es Richtig:
Form2.frm = Me
Form2.Show()
Form2.Close()
Form2.frm = Me
Form2.Show() Vor dem Öffnen müssen also öffentliche Variablen erneut zugewiesen werden. Gleiches gilt für Zugriffe auf Steuerelemente.
Man kann dies sehr gut Testen, wenn man bei New, Load und Shown Console.WriteLine("...") einfügt. | |
Re: Problem mit Formxy.shown | | | Autor: SvenZ | Datum: 11.03.15 19:40 |
| ich glaube, ich hab die Ursache für das "Urproblem" gefunden.
Ich habe die Form mit .ShowDialog() und nicht wie ursprünglich gesagt mit .Show()
Ich weiß nicht warum, aber nachdem ich das geändert habe, geht auch mein .Shown wieder zuverlässig.
Danke ...
mit freundlichen Grüßen
Sven | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|