| Betreff | Active Form |
| Von | Lothar Geyer |
| Datum | 02.10.2009 20:08:48 |
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
| Betreff | Re: Active Form |
| Von | "Harald M. Genauck" |
| Datum | 02.10.2009 22:49:05 |
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)
| Betreff | Re: Active Form |
| Von | Lothar Geyer |
| Datum | 03.10.2009 08:02:15 |
Hallo Harald,
zunächst Mal einen erholsamen Feiertag (falls Du das am 3.10. liest) Dir
und allen, die sich sonst noch heute in der NG rumtreiben.
Harald M. Genauck schrieb:
> ...
> 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)?
ich kann mich nicht erinnern, dass die Variante vorgeschlagen wurde.
Aber ich hätte mich trotzdem für den Hook entschieden, weil damit eine
Sache an einer Stelle erledigt wird und nicht an 250 und damit auch
nicht vergessen oder fehlerhaft erledigt werden kann.
Und bis auf das geschilderte Problem läuft ja auch alles Bestens.
Lothar Geyer
No comments:
Post a Comment