Rubrik: Oberfläche · Fenster | VB-Versionen: VB4, VB5, VB6 | 17.01.08 |
Vorsicht bei Verwendung der Form.Move Methode! Reagiert die Anwendung nach Aufruf der Form.Move Methode nicht mehr oder stürzt einfach ab, schafft dieser Tipp für Abhilfe. | ||
Autor: Dieter Otter | Bewertung: | Views: 11.165 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Hatten Sie dieses Problem auch schon einmal?
Sie laden aus einer Hauptform eine zweite Form, die modal angezeigt werden soll. Die Form soll hierbei via Form.Move-Aufruf an einer bestimmte Bildschirmposition angezeigt werden. In
einem konkreten Fall sollte im Form_Load Ereignis die Größe und letzte Bildschirmposition des Fensters wiederhergestellt werden. Hierzu wurden die Werte (Left,Top,Width,Height) beim Schließen
der Form in einer INI-Datei gespeichert und beim Laden der Form wieder ausgelesen:
Private Sub Form_Load() ' gespeicherte Fenstergröße und Position auslesen Dim sTemp As String sTemp = GetSetting("MyApp", "FormPos", Me.Name, "") If Len(sTemp) > 0 Then Dim sData() As String ' sData enthält die Werte "Left", "Top", "Width" und "Height" sData = Split(sTemp, ",") ' Fenster positionieren und Größe wiederherstellen Me.Move Val(sData(0)), Val(sData(1)), Val(sData(2)), Val(sData(3)) End If End Sub
Private Sub Form_QueryUnload(Cancel As Integer) ' Position und Größe speichern Dim sTemp As String sTemp = CStr(Me.Left) & "," & CStr(Me.Top) & "," & _ CStr(Me.Width) & "," & CStr(Me.Height) SaveSetting "MyApp", "FormPos", Me.Name, sTemp End Sub
Doch was passiert? Die Anwendung bleibt einfach hängen und kann nur noch über den Taskmanager abgebrochen werden! Das Ganze tritt aber nicht auf jedem System auf! Nach langer Ursachenforschung stellt sich heraus, dass das Problem mit dem Aufruf der Form.Move-Methode zusammenhängt. Wird diese Codezeile auskommentiert, läuft die Anwendung korrekt und die zweite Form wird angezeigt - allerdings natürlich nicht an der gewünschten Bildschirmposition.
Warum die Form.Move-Methode die Anwendung zum "Stillstand" zwingt, ist mir ein Rätsel!
Bebobachtet hatte ich dieses Verhalten vorzugsweise auf Vista-Betriebssystemen!
Das Problem kann allerdings umgangen werden, wenn man alternativ die MoveWindow API-Funktion verwenden. Hierbei ist einzig zu beachten, dass die Angabe der Position und Größe des Fensters in "Pixel" erfolgen muss.
Option Explicit ' benötigte API-Deklarationen Public Declare Function MoveWindow Lib "user32" ( _ ByVal hwnd As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal bRepaint As Long) As Long
Aufruf der Funktion:
Private Sub Form_Load() ' gespeicherte Fenstergröße und Position auslesen Dim sTemp As String sTemp = GetSetting("MyApp", "FormPos", Me.Name, "") If Len(sTemp) > 0 Then Dim sData() As String ' sData enthält die Werte "Left", "Top", "Width" und "Height" sData = Split(sTemp, ",") ' Fenster positionieren und Größe wiederherstellen MoveWindow Me.hWnd, Val(sData(0)) / Screen.TwipsPerPixelX, _ Val(sData(1)) / Screen.TwipsPerPixelY, _ Val(sData(2)) / Screen.TwipsPerPixelX, _ Val(sData(3)) / Screen.TwipsPerPiXelY, True End If End Sub