![]() |
Verhindern, das über eine Form "drüber-resized" wird
Moin!
Wie ich ![]() Das Verschieben habe ich dank ![]() Ich hab schon ein wenig rumgegoogled und bin auf die Windows-Nachricht ![]() Da ich nicht nach der Größenänderung, sondern währentdessen reagieren will scheint mir OnResize auch nicht ganz angebracht. Hat jemand nen tip für mich? |
AW: Verhindern, das über eine Form "drüber-resized" wird
Schon mal mit
![]() |
AW: Verhindern, das über eine Form "drüber-resized" wird
Das Ereignis "OnCanResize" sollte dafür angebracht sein.
Ansonsten kann man folgendermaßen eine Windows-Nachricht abfangen:
Code:
TForm1 = class(TForm)
// ... procedure WMSizing(var Message: TMessage); message WM_SIZING; // ... end; |
AW: Verhindern, das über eine Form "drüber-resized" wird
|
AW: Verhindern, das über eine Form "drüber-resized" wird
Die Appbars habe ich probiert. Dabei entstünde leider das Problem, das ja auch andere Anwendungrn nicht mehr über die Mainform kämen.
Im Falle der TMessage krieg ich auf die Schnelle nicht ganz rausgefitzt, wie ich den lParam sauber zu nem TRect bzw Pointer auf ein TRect umgewandelt bekomme. Also fuhrwerke ich jetzt im OnCanResize herum. Bislang habe ich das hier:
Delphi-Quellcode:
Die Definition der workArea liegt nur zu Demozwecken in der Funktion. Wenn ich das Ok für das Gesammtverhalten der Oberfläche bekomme will ich die workArea auslagern.
var
workArea : TRect; I: Integer; begin Resize := True; if (FormMain.WindowState = wsMaximized) and (Self.Monitor = FormMain.Monitor) then begin workArea := Screen.WorkAreaRect; workArea.Top := workArea.Top + FormMain.Height - 8; workArea.Left := 0; if Screen.MonitorCount >1 then begin workArea.Width := 0; for I := 0 to screen.MonitorCount -1 do workArea.Width := workArea.Width + Screen.Monitors[I].Width; end; Resize := (Mouse.CursorPos.Y >= workArea.Top) or (Self.WindowState = wsMaximized); end; Wenn ich jetzt versuche über die Mainform drünber zu resizen wird die Form stattdessen darübergeschoben. Auch kein erwünschtes Verhalten. Auch noch problematisch (zumindest aus meiner Sicht) ist, dass wenn man nun auf einem sekundären Monitor unter Windows 7 die Form an die Oberkante zu resizen, kein automatisches Resize über die gesammte Monitorhöhe erfolgt. Ich kann mir nicht vorstellen, dass das beim Endanwender besonders gut ankommt. Wenn ich's noch zusätzlich damit versuche:
Delphi-Quellcode:
Flackert das ganze nur und wird trotzdem weiter gezogen.
if Mouse.CursorPos.Y <= workArea.Top then
Self.Top := workArea.Top; |
AW: Verhindern, das über eine Form "drüber-resized" wird
So sollte es gehen (Die Message-Struktur für WM_SIZING entspricht der für WM_MOVING):
Delphi-Quellcode:
...
protected procedure WMMoving(var Message: TWMMoving); message WM_MOVING; procedure WMSizing(var Message: TWMMoving); message WM_SIZING; ... { Das Form soll oben einen Rand von 100 lassen. } procedure TForm300.WMMoving(var Message: TWMMoving); var DY: Integer; begin DY := 100 - Message.DragRect.Top; if DY > 0 then begin Message.DragRect.Top := 100; Message.DragRect.Bottom := Message.DragRect.Bottom + DY; end; inherited; end; procedure TForm300.WMSizing(var Message: TWMMoving); begin if Message.DragRect.Top < 100 then begin Message.DragRect.Top := 100; end; inherited; end; |
AW: Verhindern, das über eine Form "drüber-resized" wird
Scheinbar leider nicht. Hab's durchdebugt. Das heißt ich habs versucht.
Es springt leider nicht in die Funktion WMSizing rein. Keine Ahnung warum nicht. Ich rate mal in's Blaue, dass Prozeduren, die mit der Direktive message versehen sind, dann feuern sollten, wenn die dahinterstehende Message von windows an die Form gesendet wird. (Habs nicht nachgelesen aber so kann ich mir das grad erklähren.) Das würde dann ja auch bedeuten, dass die Form an der Stelle nicht mitschneidet, dass sie gerade resized wird. Das man TWMMoving verwenden kann um die Sizing-Message abzubilden ist mir erst gar nicht in den Sinn gekommen, obwohl's eigentlich logisch ist. Der einzige Unterschied zwischen den beiden Windowsmessages ist der Hex-Wert, der sie bezeichnet. (Gott drück ich mich heute wieder kaputt aus!) |
AW: Verhindern, das über eine Form "drüber-resized" wird
Zitat:
|
AW: Verhindern, das über eine Form "drüber-resized" wird
Strange. Ich schau mir das morgen nochmal genauer an. Hab bis zum Feierabend auch noch andere Aufgaben auf dme Tisch.
Mich wunderts ehrlich gesagt, warum meine Form nicht auf die message reagiert hat. Aber danke schonmal. Ich kann mir denken, dasses genau macht, was ich brauche, wenns dann läuft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz