AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Verhindern, das über eine Form "drüber-resized" wird
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von S.Langhammer · begonnen am 13. Mai 2014 · letzter Beitrag vom 14. Mai 2014
Antwort Antwort
S.Langhammer

Registriert seit: 28. Mai 2013
23 Beiträge
 
Delphi XE3 Enterprise
 
#1

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

  Alt 13. Mai 2014, 15:24
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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.994 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 13. Mai 2014, 16:08
Schon mal mit OnCanResize probiert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#3

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

  Alt 13. Mai 2014, 16:14
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;
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#4

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

  Alt 13. Mai 2014, 16:16
eventuell ist das auch interessant für Dich
Arbeiten mit appbars
  Mit Zitat antworten Zitat
S.Langhammer

Registriert seit: 28. Mai 2013
23 Beiträge
 
Delphi XE3 Enterprise
 
#5

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

  Alt 14. Mai 2014, 08:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.994 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 14. Mai 2014, 09:25
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
S.Langhammer

Registriert seit: 28. Mai 2013
23 Beiträge
 
Delphi XE3 Enterprise
 
#7

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

  Alt 14. Mai 2014, 14:12
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!)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.994 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 14. Mai 2014, 14:25
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
S.Langhammer

Registriert seit: 28. Mai 2013
23 Beiträge
 
Delphi XE3 Enterprise
 
#9

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

  Alt 14. Mai 2014, 14:29
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:18 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