Active Form

02/10/2009 - 20:08 von Lothar Geyer | Report spam
Ich hatte ein Problem, das ich inzwischen gelöst habe - aber nicht ganz
dahinter gestiegen bin, warum.

Den folgenden Kode, um das zuletzt aktivierte MDIchild zu erhalten,
bekam ich vor langer Zeit dankenswerter Weise hier in der NG:

' Nachricht weiterleiten
CallWndProc = CallNextHookEx(WH_CALLWNDPROC, _
lProcessCode, lSentByCurrentThread, udtCWP)

' AUSWERTUNG
If udtCWP.Message = WM_CHILDACTIVATE And udtCWP.wParam = WA_INACTIVE Then
Dim Frm As Form
For Each Frm In Forms
If Frm.hWnd = udtCWP.hWnd Then
Exit For
End If
Next Frm
If Not Frm Is Nothing Then
Form merken
..

Nun hat sich bei einem MDIchild gezeigt, dass das nicht funktioniert.
Ich schildere mal die "Auswirkungen".

Ich öffne drei Forms A, B und C (sind alles MDIchilds). In der obigen
Routine merke ich mir die Form, aber nicht wenn es sich um B handelt. So
kann ich in B immer auf die "letzte" Form zugreifen.

Bei einer Form (nehmen wir C) funktioniert es nun nicht. Wenn ich die
Form über das Menü starte, funktioniert es. Wenn ich aber C über einen
CommandButton in A starte mit dem Setzen einer Property wie

Set newForm = frmForm
Set newForm.StartProp = ParaProp

dann geht es nicht. Es liegt offenbar daran, dass in der
Property-Routine ein Recordset angelegt und die Daten in eine Combobox
geladen werden. Dabei wird eine Checkbox abgefragt und bei dem "Zugriff"
auf die Checkbox kommt eine WM_CHILDACTIVATE, die dazu führt, dass in
der obigen Routine Frm Nothing bleibt.

Ich habe das nun so gelöst, dass ich als letzten Befehl in der
Property-Routine ein Me.ZOrder eingefügt habe.

Warum aber löst die Anfrage
If chkAbgelaufene.Value = vbUnchecked Then
eine Meldung aus?

Lothar Geyer
 

Lesen sie die antworten

#1 Harald M. Genauck
02/10/2009 - 22:49 | Warnen spam
Hallo Lothar,

Ich hatte ein Problem, das ich inzwischen gelöst habe - aber nicht
ganz dahinter gestiegen bin, warum.

Den folgenden Kode, um das zuletzt aktivierte MDIchild zu erhalten,
bekam ich vor langer Zeit dankenswerter Weise hier in der NG:

' Nachricht weiterleiten
CallWndProc = CallNextHookEx(WH_CALLWNDPROC, _
lProcessCode, lSentByCurrentThread, udtCWP)

' AUSWERTUNG
If udtCWP.Message = WM_CHILDACTIVATE And udtCWP.wParam =
WA_INACTIVE Then
Dim Frm As Form
For Each Frm In Forms
If Frm.hWnd = udtCWP.hWnd Then
Exit For
End If
Next Frm
If Not Frm Is Nothing Then
Form merken
..



Ich weiß zwar nicht (mehr), worum es genau ging (ich erinnere mich
leider nur flüchtig an einen solchen Thread). Aber einen solchen Hook
zur Nachverfolgung des zuletzt aktivierten MDI-Childs halte ich für
arg übertrieben. Zumindest die bloße Nachverfolgung sollte doch
erheblich einfacher möglich sein:

Im MDI-Parent-Form (MDIParent1):

Public Sub Activated(Form As Form)
Debug.Print Form.Caption

' oder hier Form (oder irgendeine ID)
' in einer (lokalen) Variablen speichern
End Sub


In den MDI-Child-Forms:

Private Sub Form_Activate()
MDIForm1.Activated Me
End Sub


Oder gibt es einen Grund, der gegen diese einfachste Variante spricht
(falls sie schon vorgeschlagen worden ist)?


Viele Grüße

Harald M. Genauck

"ABOUT Visual Basic" - http://www.aboutvb.de (Hrsg. + Redaktion)
"VISUAL STUDIO one" - http://www.visualstudio1.de (Chefredakteur)

Ähnliche fragen