Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verhindern, das über eine Form "drüber-resized" wird (https://www.delphipraxis.net/180347-verhindern-das-ueber-eine-form-drueber-resized-wird.html)

S.Langhammer 13. Mai 2014 15:24

Verhindern, das über eine Form "drüber-resized" wird
 
Moin!

Wie ich hier schonmal erwähnt habe arbeite ich an einer Anwendung, deren Mainform nur aus einem Toolbar besteht. Nun will ich verhindern, dass andere Forms der Anwendung die Mainform irgendwie verdecken, wenn sie selbst nicht maximiert sind.

Das Verschieben habe ich dank dem hier gelöst bekommen. Nun kann man allerdings immernoch die Forms über die Mainform hinweg resizen.

Ich hab schon ein wenig rumgegoogled und bin auf die Windows-Nachricht WM_SIZING gestoßen. Die scheint mir dafür wie geschaffen zu sein, nur kennt Delphi die wohl nicht oder macht sie nur nicht direkt zugänglich.

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?

Uwe Raabe 13. Mai 2014 16:08

AW: Verhindern, das über eine Form "drüber-resized" wird
 
Schon mal mit OnCanResize probiert?

SMO 13. Mai 2014 16:14

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;

EarlyBird 13. Mai 2014 16:16

AW: Verhindern, das über eine Form "drüber-resized" wird
 
eventuell ist das auch interessant für Dich
Arbeiten mit appbars

S.Langhammer 14. Mai 2014 08:23

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:
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;
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.

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:
    if Mouse.CursorPos.Y <= workArea.Top then
      Self.Top := workArea.Top;
Flackert das ganze nur und wird trotzdem weiter gezogen.

Uwe Raabe 14. Mai 2014 09:25

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;

S.Langhammer 14. Mai 2014 14:12

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!)

Uwe Raabe 14. Mai 2014 14:25

AW: Verhindern, das über eine Form "drüber-resized" wird
 
Zitat:

Zitat von S.Langhammer (Beitrag 1258898)
Scheinbar leider nicht. Hab's durchdebugt. Das heißt ich habs versucht.

Genau das habe ich aber auch: Neues VCL-Projekt, die beiden Message-Methoden in das Form, Run und ich konnte das Form nicht mehr oberhalb der 100 Pixel von oben verschieben oder vergrößern.

S.Langhammer 14. Mai 2014 14:29

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 04:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz