Form Load zwei mal ausführen

Da Hacker

Erfahrenes Mitglied
Hi Tutorials.de-Community,

ich häng grad ein bissel mit einem theoretischen Verständnisproblem bei einem Projekt rum. :)
Also folgendes:
Ich hab zwei Forms. Einmal "Preloader" und einmal "Haupt". Im Preloader wird die Größe des Formulars "Haupt" abgefragt(logischerweise[was ich bisher aber nicht gewusst habe] tritt dadurch das Ereignis "Form_Load" auf). Diesen Missstand hab ich durch Boolean-Variablen gelöst.
Doch nun, wird der Preloader geschlossen, die Boolean-Variable wird umgestellt und das Formular "Haupt" wird geladen. Hier sollte dann also NOCHMAL das Ereignis "Form_Load" auftreten. Komischerweise tut es das aber nicht(obwohl man das auch verstehen kann). Dies habe ich durch Messageboxen festgestellt. Allerdings brauche ich die Funktion, da sie am Anfang Daten anzeigt, die ich nicht erst nach dem Klick eines Buttons anzeigen will/darf. ;)

Wie kann ich das ändern?

Sitz hier etwas ratlos vor VB 6 und kann mir keine Lösung einfallen lassen. :confused: Ich kenn euch und weiß, dass ihr mir eine Lösung anbieten werdet.
Ich schätze auch mal, dass ihr dafür keinen Code braucht, weil es ja eigentlich nur VB-Theorie ist. Wenn doch, wird er nachgeliefert.

[Offtopic] So, ich zock jetzt mal mit meinem Cousin "Age of Empires II" über LAN - einfach Kult, das Game :D [/Offtopic]

Danke im Voraus:
Adam

Keywords:
Formular laden, Prozedur zwei Mal aufrufen
 
Das klingt irgendwie nach einem unsauberen Programmierstiel....
Aber zu deinem Problem: Warscheinlich entlädst du die Form nicht wieder, du machst also kein "Unload Haupt", bevor die Form ein zweites Mal angezeigt werden soll. Kann das sein?
Du kannst übrigens auch einfacher als mit Messageboxen herausfinden, ob ein bestimmtes Ereignis eintritt oder nicht: nämlich mit Breakpoints! Schau mal hier: Debugging in VB
 
Hi Shakie,

danke für deine Antwort. An sich wäre das ja schon mal kein schlechter Ansatz. Allerdings hab ich erst durch das Debuggen herausgefunden, dass das Hauptformular aufgerufen wird! ;)

Ich poste am besten mal etwas Code:
Visual Basic:
Private Sub Einstellungen_Erstellen()
Debug.Print "Preloader-Einstellungen_Erstellen"
On Error GoTo Ordnerfehler
MkDir App.Path & "\Daten" 'Ordner erstellen
Ordnerfehler: 'Fehler beim Ordner erstellen - Ordner wahrscheinlich vorhanden
On Error GoTo Einstellungenfehler
ErsterAufruf = True 'Boolean-Variable auf True setzen
Hintergrundfarbe = &H808080
SchriftFarbe = vbBlack
RandFarbe = vbWhite
HintergrundFarbeButtons = &H8000000F
SchriftFarbeButtons = vbBlack
HauptLeft = (Screen.Width / 2) - (Haupt.Width / 2) 'Hier wird das Formular "Haupt"
HauptTop = (Screen.Height / 2) - (Haupt.Height / 2) 'aufgerufen
Haupt.Hide
SerUserial = "nicht definiert"
Sprache = deutsch
TextBoxHintergrund = vbYellow
Test1 = "Test1"
Test2 = "Test2"
Test3 = "Test3"
Test4 = "Test4"
Test5 = "Test5"
AnzahlReservierungen = 0
ErsterAufruf = False 'Boolean-Variable wieder auf false setzen
Reset
KanalOutputEinstellungen = FreeFile
Open PfadEinstellungen For Output As KanalOutputEinstellungen
Write #KanalOutputEinstellungen, Hintergrundfarbe, SchriftFarbe, RandFarbe, HintergrundFarbeButtons, SchriftFarbeButtons, HauptLeft, HauptTop, SerUserial, Sprache, TextBoxHintergrund, Test1, Test2, Test3, Test4, Test5, AnzahlReservierungen
Close KanalOutputEinstellungen
LblEinstellungengeladen.Caption = "- Einstellungen erstellt!"
LblEinstellungengeladen.Visible = True
Exit Sub
Einstellungenfehler:
MsgBox "Achtung! Es ist ein Fehler beim Erstellen der Einstellungen aufgetreten. Kontaktieren Sie bitte unsere Firma und teilen Sie uns diesen Fehler mit. Danke und Entschuldigung!" & vbNewLine & vbNewLine & "Fehlerbeschreibung: " & Err.Description & " - Fehlernummer: " & Err.Number, vbCritical + vbOKOnly, "Fehler beim Erstellen der Einstellungen!"
End Sub

So, das passiert also beim ersten Aufruf des Programms im Formular "Preloader". Eine Variable weiß nun, dass der Preloader das Formular aufgerufen hat und teilt das dann dem Hauptformular mit. Das sieht man hier:

Visual Basic:
Private Sub Form_Load()
Dim i As Integer
LblUhrzeit.Caption = Time
LblDatum.Caption = Date
If Demomode = True Then
Me.Caption = Replace(Me.Caption, "Alpha", "Demo")
Me.Caption = Replace(Me.Caption, "Beta", "Demo")
Me.Caption = Replace(Me.Caption, "Final", "Demo")
End If
ComboTische.Clear
i = 1
For i = i To TischAnzahl
    ComboTische.AddItem "Tisch " & i
Next i
MsgBox "Reservierungenvorhanden? - " & Reservierungenvorhanden & vbNewLine & _
"Erster Aufruf? - " & ErsterAufruf & vbNewLine & _
"Demomode? - " & Demomode, vbInformation, "Juhu" 'Msgbox für Testzwecke
If Reservierungenvorhanden = True And ErsterAufruf = False Then 'DAS IST WICHTIG
Call Lade_Reservierungen
End If
Call Farbenaktualisieren
End Sub

So, jetzt ist es also so, dass ich das Programm starte, im Preloader erscheint die Meldung mit dem Titel "Juhu". Das ist auch alles soweit richtig. Doch dann kommt nach einer Benutzereingabe im Preloader der Code "Haupt.Show" zum Einsatz. Doch leider kommt hier dann keine "Juhu"-Meldung mehr Und genau das möchte ich verhindern.

Wenn ich das jetzt so mache, wie du es mir geraten hast - nämlich, dass ich das Hauptformular wieder entlade, dann beendet das mein ganzes Programm! So würde ich es nämlich dann in mein "Form_Load"-Ereignis des Hauptformulars einfügen:
Visual Basic:
If ErsterAufruf = True Then
Unload Haupt
End If

So Chef, nun versteh das mal! :) ;)
Wieso ist das so?

Danke:
Adam
 
Ersetzte mal in Zeile 15 von "Einstellungen_Erstellen" das "Haupt.Hide" durch "Unload Haupt".
Wenn du nämlich ein Unload einer Form in Form_Load aufrufst und danach aber noch auf die Form zugreifen willst, dann kommt normalerweise ein Fehler ("Fehler 364: Objekt wurde entladen"). Warscheinlich wird dein Programm deshalb beendet. Kommt denn vor dem Beenden eine Fehlermeldung? (Entferne zum Testen am besten alle "On Error Resume Next" Anweisungen, falls du welche drin hast.)
Mir ist aber nicht ganz klar, was die Variablen "HauptLeft" und "HauptTop" speichern sollen und warum sie das überhaupt Speichern sollen, was sie speichern.
Geschickter wäre es meines Erachtens nach, die beiden Variablen erst in Form_Load von der Form "Haupt" mit Werten zu füllen und nicht schon vorher.
Auch ist mir noch nicht ganz klar, wann zu welchem Zeitpunkt welche Form geladen wird. Könntest du das bitte nochmal erklären?
 
Herzlichen Glückwunsch, Shakie! :D

Vielen Dank, du hast mir sehr viel weitergeholfen. Jetzt läuft das. Problem war halt, dass ich beim "Query_Unload"-Ereignis noch ein "Unload me" und ein "End" drinnen hatte. Das beendet logischerweise das komplette Programm. Aber ein Glück gibt es Variablen - Boolean-Variablen! :D

Nun zu deinen Fragen:
Shakie hat gesagt.:
Mir ist aber nicht ganz klar, was die Variablen "HauptLeft" und "HauptTop" speichern sollen und warum sie das überhaupt Speichern sollen, was sie speichern.
Die zwei Variablen speichern die Left- und Topwerte des Hauptformulars. In der aktuellen Prozedur, werden die Einstellungen erstellt, die die Position des Hauptformulars beim Beenden speichern und am Anfang auch wieder laden. Um es einfach auszudrücken: Das Programm merkt sich die Position des Hauptformulars. ;) Und am Anfang möchte ich da keine NULL-Werte haben, sondern zumindest die Zentrierung(Bildschirmbreite / 2 minus die Hälfte der Formular-Breite).

Shakie hat gesagt.:
Geschickter wäre es meines Erachtens nach, die beiden Variablen erst in Form_Load von der Form "Haupt" mit Werten zu füllen und nicht schon vorher.
Und was mach ich, wenn die Einstellungs-Datei mit den Variablen schon vorher erstellt wird? Siehe oben. :)

Shakie hat gesagt.:
Auch ist mir noch nicht ganz klar, wann zu welchem Zeitpunkt welche Form geladen wird. Könntest du das bitte nochmal erklären?

Aber immer doch... ...Am Anfang erscheint das Formular "Preloader", in dem sind alle Funktionen verankert, die man am Anfang braucht. Also praktisch das Laden und eventuelle Erstellen der Einstellungen, Laden der Reservierungen(Es handelt sich um ein Reservierungsprogramm), Prüfen der Seriennummer und so weiter. Ist die Seriennummer vorhanden bzw. gibt der User die richtige Seriennummer ein, erscheint das Formular "Haupt", das das Hauptprogramm darstellt. Dieses prüft am Anfang mit Variablen, ob der Preloader Reservierungen gefunden hat und ob das Formular durch den Preloader aufgerufen wurde(was nur beim Erstellen der Einstellungs-Datei passiert). Wurden Reservierungen gefunden und wurde das Hauptformular NICHT durch den Preloader aufgerufen, werden hier die Reservierungen geladen und anschließend in Listboxen angezeigt. Zusätzlich gibt es noch einige Gimmicks, die ich noch verfeinern werde. Das Grundgerüst steht und das Programm kann eigentlich verkauft werden.

Habe noch einige Probleme mit dem Befehl "ReDim Preserve" im Zusammenhang mit ZWEIDIMENSIONALEN Arrays :confused: :( . Die Suchmaschinen haben auch nichts erbracht. Ich gehe einfach mal davon aus, dass Restaurants nicht mehr als drei Reservierungen pro Tag haben(dazu zählen ja auch Wochenenden und so). Wenn hier jemand was hätte, wäre ich auch glücklich - muss aber nicht sein! :)

Vielen Dank nochmal, Shakie!

Ciao:
Adam *Themaalserledigtmarkier*
 
Zum Thema Arrays gibt es hier einen Thread, in dem viel erklärt wird: http://www.tutorials.de/forum/visual-basic/219493-dynamische-array-deklaration.html
Allerdings werden keine zweidimensionalen Arrays besprochen.

Mit dem Einstellen der Top- und Leftwerte der Form würde ich das so machen:
Code:
Private Sub Form_Load()      <--- Form "Haupt"
If HauptLeft = 0 And HauptTop = 0 Then
HauptLeft = (Screen.Width - Me.Width) / 2
HauptTop = (Screen.Height - Me.Height) / 2
End If

Me.Left = HauptLeft
Me.Top = HauptTop
End Sub
Nun ist es nicht mehr schlimm, wenn beim ersten Programmstart nach dem Laden der beiden Werte die Variablen Null sind.
(Beachte: Die Eigenschaft "StartUpPosition" der Form muss auf "0 - Manuell" stehen, sonst kann man in Form_Load den Left- und Topwert nicht verändern.)

Da Hacker hat gesagt.:
Und was mach ich, wenn die Einstellungs-Datei mit den Variablen schon vorher erstellt wird?
Die Datei, in denen die Einstellungen gespeichert werden, kann doch auch erst erstellt werden, bevor das Programm beendet wird. Aber so wie ich das verstanden habe erstellst du die Datei ja bereits bevor die Hauptform angezeigt wird. Das erscheint mir sowieso etwas unlogisch.
 
Zuletzt bearbeitet:
Zurück