Form ausblenden

Hallo,

ich hab ein MDI Formular und etliche Child Fenster!
Im MDI Formaular habe ich folgendes Szenario.

Im Form_Load Ereignis:
Es werden alle Child Fenster geladen, via Load …
zum Schluss werden alle Child Fenster ausgeblendet und nur 1 ChildFenster eingeblendet. In einer Combobox kann man nun irgendein Child Fenster auswählen! Dabei wird das aktive Fenster ausgeblendet und das entsprechende Fenster laut Combobox eingeblendet!

Im Form_Resize Ereignis:
Wenn sich dort die Grösse ändert (nicht minimiert wird) So rufe ich jeweils im Form_Resize Ereignis das Form_Resize Ereignis in allen ChildFenstern auf, welche ich als Public declariert habe!

In den Child Fenster und dort in dem Form_Resize Ereignis, Stelle ich die Grösse des Child Fenster’s auf die Grösse des MDI Formulares ein. Danach werden alle Steuerelemente die sich auf der Form befinden, in ihrer Grösse angepasst! Soweit functioniert das auch!

Ich kann die Grösse des MDI Formulares ändern und die Child Fenster sowie die darauf sich befindenten Steuerelemente ändern entsprechend ihre Grösse.

Nun habe ich aber folgenden unschönen Effekt. Wenn ich nun das progg starte, so werden kurzzeitig alle ChildFenster eingeblendet und man sieht wie die Steuerelemente angeordnet werden :frowning: Da teilweise an die ca. 400 Steuerelemente auf einer Form sind, dauert dies einige Sekunden :frowning:

Ein Me.Hide und später Me.Show im MDI Formular bringt nicht die gewünschten Erfolge.

Meine Frage ist nun. Kennt jemand ein Weg, wie ich während des ladens des MDI Formulares das Formular ausblenden kann, so das ich die Anordnung der Steuerelemente nicht sehe?

MfG Alex

Hallo, Alex.

Bevor Du Dir Gedanken über das Ausblenden der Formulare machst, solltest Du auf alle Fälle sicher sein, daß das Resize-Ereignis nicht rekursiv ist.

Viele Grüße
Carsten

Hallo Carsten,

ja darueber habe ich mir Gedanken gemacht und das Ereignis wird nur 2 mal ausgelöst mehr nicht :wink:

MfG

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Alex.

In den Eigenschaften der FORM Visible False auswählen.
Nun entweder einen TImer einbauen oder ganz ans ende der Form LOAD
Form1.Visible=True

mfg joe

Hallo Joe,

danke für den Hinweis. Aber das tut es auch nicht, da durch die Anordnung der Steuerelemente(Was sich in einer Klasse befindet), dann automatisch die Form angezeigt wird :frowning:

im Modul lade ich das MDI Formular, via Load … und danach erst Show
Auch habe ich probiert ein Flag zu setzen was mir das laden anzeigt und dann in der MDI Form me.hide und me.show verwendet, aber auch das brachte nichts. Die Formen werden immer aktualisiert :frowning:
Ich weiss echt nicht wo mein Fehler liegt :frowning:

Anbei poste ich mal ein wenig Code, damit es erkenntlich wird

'Sub Main
Sub Main()
 Call InitCommonControls
 RegPfad = "Software\" & App.ProductName
 Dateiformat(0) = "Datei"
 Dateiformat(1) = "MPEG"
 Dateiformat(2) = "WMA"
 Dateiformat(3) = "MONKEY"
 Dateiformat(4) = "FLAC"
 Dateiformat(5) = "WAV"
 Dateiformat(6) = "OGG"
 Dateiformat(7) = "MPP"
 Dateiformat(8) = "AAC"
 Dateiformat(9) = "MP4"
 Logo.Show
End Sub

'in der Form Logo
Option Explicit

Private Sub Form\_Load()
 Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
End Sub

Private Sub Timer1\_Timer()
 Load Start
 Start.Show
End Sub

'Form Start, welches das MDI Formular ist
Private Sub MDIForm\_Activate()
 Call SetScreen(Me)
End Sub

Private Sub MDIForm\_Initialize()
 If IsThemeActive Then Call ActivateWindowTheme(Me.hwnd)
End Sub

Private Sub MDIForm\_Load()
 Dim Maus As New WaitCursor
 Call Maus 'Maus wird auf sanduhr gestelllt
 me.Hide ' Zu testzwecken -\> Form unsichtbar!
 Unload Logo 'Logo wird entladen
 Minimiert = False 'Flag für TNA wird gesetzt
 Call GetRegistryData 'Registrierungsdaten werden ausgelesen
 Call GetPos 'Position des Fenster wird ermittelt -\> Anpassung Kommt später
 Call WriteRecent 'RecentFiles werden im Menu eingetragen
 'Bis hier ist alles ausgeblendet!
 Load Haupt 'MDI Child Haupt wird geladen
 'Hier ist nun das MDI Formular sichtbar!
 Load Einstellungen
 Load Musik
 Load Program
 Load Video
 Load Adressen
 RegData = "Firsttime"
 Call WertLesen(HKEY\_CURRENT\_USER, RegPfad & "\Allgemein", RegData, 2)
 If CByte(RegData) = 1 Then
 Call SetValue(RegPfad, "Firsttime", 3, zBYTE)
 Set Maus = Nothing
 MsgBox "Sie haben " & App.ProductName & " zum ersten mal gestartet!" & vbNewLine & "Stellen Sie nun " & App.ProductName & " nach ihren Wünschen ein.", vbInformation
 Call mnusetup\_Click
 Else
 Combo1.ListIndex = 0
 End If
End Sub

Private Sub MDIForm\_Resize()
 On Error Resume Next
 If Me.WindowState = 1 Then
 Minimiert = True
 Exit Sub
 End If
 If Minimiert Then
 Minimiert = Not (Minimiert)
 Exit Sub
 End If
 Me.Frame1.Width = Me.ScaleWidth - Me.Frame1.Left - 10
 Me.ProgressBar1.Width = Frame1.Width - ProgressBar1.Left - 50
 Call Haupt.Form\_Resize
 Call Einstellungen.Form\_Resize
 Call Musik.Form\_Resize
 Call Program.Form\_Resize
 Call Video.Form\_Resize
 Call Adressen.Form\_Resize
 On Error GoTo 0
End Sub

Private Sub MDIForm\_Unload(Cancel As Integer)
 If InTray Then
 Shell\_NotifyIcon NIM\_DELETE, nid
 End If
 If AllgemeinData And &H10 Then
 Call SetValue(RegPfad & "\Allgemein\Window", "Left", Me.Left, zDWORD)
 Call SetValue(RegPfad & "\Allgemein\Window", "Top", Me.Top, zDWORD)
 Call SetValue(RegPfad & "\Allgemein\Window", "Width", Me.Width, zDWORD)
 Call SetValue(RegPfad & "\Allgemein\Window", "Height", Me.Height, zDWORD)
 End If
End Sub

'hier mal fix ein Auzug aus der Haupt.frm 
'Jedes andere Formular ist genauso aufgebaut!

Option Explicit

Private oResize As clsResize

Private Sub Form\_Activate()
 Call SetScreen(Me) 'Es wird nur das Menu angepasst im MDI Formular
End Sub

Private Sub Form\_Load()
With Image1
 .Left = (Me.ScaleWidth / 2) - (.Width / 2)
End With
Set oResize = New clsResize
oResize.oform = Haupt
oResize.Initialize
End Sub

Public Sub Form\_Resize()
On Error Resume Next
 Me.Top = 0: Me.Left = 0: Me.Height = Start.ScaleHeight: Me.Width = Start.ScaleWidth
 oResize.DoResize
 On Error GoTo 0
End Sub

'nun noch fix die Klassen
'Klasse ClsForm
Option Explicit

Private mvar\_Top As Long
Private mvar\_Left As Long
Private mvar\_Width As Long
Private mvar\_Height As Long

Public Property Let Top(ByVal vData As Long)
 mvar\_Top = vData
End Property

Public Property Get Top() As Long
 Top = mvar\_Top
End Property

Public Property Let Left(ByVal vData As Long)
 mvar\_Left = vData
End Property

Public Property Get Left() As Long
 Left = mvar\_Left
End Property

Public Property Let Width(ByVal vData As Long)
 mvar\_Width = vData
End Property

Public Property Get Width() As Long
 Width = mvar\_Width
End Property

Public Property Let Height(ByVal vData As Long)
 mvar\_Height = vData
End Property

Public Property Get Height() As Long
 Height = mvar\_Height
End Property

'Klasse ColControls
Option Explicit

Private mCol As Collection

Public Function Add(ByVal lTop As Long, ByVal lLeft As Long, ByVal lWidth As Long, ByVal lHeight As Long, ByVal sName As String, ByVal iFontSize As Single) As clsControl
On Local Error GoTo 0
Dim objNewMember As clsControl
 Set objNewMember = New clsControl
 With objNewMember
 .Top = lTop
 .Left = lLeft
 .Height = lHeight
 .Width = lWidth
 .Tag = mCol.Count + 1
 .Name = sName
 .Fontsize = iFontSize
 End With
 mCol.Add objNewMember, sName
 Set Add = objNewMember
 Set objNewMember = Nothing
End Function

Public Function AddLine(ByVal lX1 As Long, ByVal lX2 As Long, ByVal lY1 As Long, ByVal lY2 As Long, sName As String) As clsControl
On Local Error GoTo 0
Dim objNewMember As clsControl
 Set objNewMember = New clsControl
 With objNewMember
 .X1 = lX1
 .X2 = lX2
 .Y1 = lY1
 .Y2 = lY2
 .ResizeOption = 0
 .Tag = mCol.Count + 1
 .Name = sName
 End With
 mCol.Add objNewMember, sName
 Set AddLine = objNewMember
 Set objNewMember = Nothing
End Function

Public Property Get Item(ByVal ItemName As String) As clsControl
 On Error Resume Next
 Set Item = mCol(ItemName)
 On Error GoTo 0
End Property

Public Property Get Count() As Long
 Count = mCol.Count
End Property

Private Sub Class\_Initialize()
 Set mCol = New Collection
End Sub

Private Sub Class\_Terminate()
 Set mCol = Nothing
End Sub

'Klasse ClsResize
Option Explicit

Private oControls As col\_Controls
Private oForm\_First As clsForm
Private oForm\_Now As Form
Private mvar\_ScaleMinMax As Single

Private Sub Class\_Initialize()
 Set oControls = New col\_Controls
 Set oForm\_First = New clsForm
End Sub

Private Sub Class\_Terminate()
 Set oControls = Nothing
 Set oForm\_First = Nothing
 Set oForm\_Now = Nothing
End Sub

Public Property Let oform(ByRef vData As Variant)
 Set oForm\_Now = vData
End Property

Public Sub Initialize()
 Dim oControl As Control
 Dim mCol\_SSTAB As Collection
 Dim sControlName As String
 Dim iFontSize As Single
 Dim lTag As Long
 With oForm\_First
 .Height = oForm\_Now.Height
 .Width = oForm\_Now.Width
 .Top = oForm\_Now.Top
 .Left = oForm\_Now.Left
 End With
 Set mCol\_SSTAB = New Collection
 For Each oControl In oForm\_Now.Controls
 On Error Resume Next
 If oControl.Left 1 + ScaleMinMax / 100 Or sngFaktor\_Height 1 + ScaleMinMax / 100 Then
 For Each oControl In oForm\_Now.Controls
 If oControl.Left 

So, ich hoffe nun ist es ein wenig verstaendlicher und jemand weiss wie ich mein Vorhaben realsieren kann.

MfG Alex


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Hi,

mir ist im Moment nicht ganz klar, warum die ganzen Childs
geladen sind, wenn sie eh nicht sichtbar sind…?

LG

ALex

Hallo Alex,

das hat folgende Bewandnis. Sie werden geladen. Dabei wird die Klasse Initialisiert, was für den späteren Resize von nöten ist. Desweiteren werden die Fenster anhand der Registry eingestellt und diverse Daten geladen(Damit spätzer der Zugriff auf das Fenster schneller ist, da die Routinen nicht mehr abgearbeitet werden muessen!). Vieles habe ich nicht gepostet, da es sonst den Rahmen sprengen würde :confused:

Würde ich diese beim Start nicht laden, so würde dann beim MDIForm_Resize und dort beim Aufruf der Resize Methode des Child Fenster ein Laufzeitfehler auftreten, da die Form nicht Initialisiert wurde. Ok den Fehler könnte man via On Error Resume next weglutschen, aber dann geht das Resize nicht mehr, weil eben die Standardwerte fehlen, die bei der Initialisierung gespeichert werden :frowning:

MfG Alex