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/)
-   -   FormResize-Method und Border (https://www.delphipraxis.net/200989-formresize-method-und-border.html)

philipp.hofmann 13. Jun 2019 18:44

FormResize-Method und Border
 
Hi,

gibt es eine Chance in der FormResize-Methode (FMX) festzustellen, ob der User noch am Border am resizen ist oder nicht?
Wenn das FormResize ein einmalige Ereignis ist, wie Maximized->Normal oder Bildschirm-Wechsel funktioniert bei mir alles tadellos, aber wenn der User selbst am Rand der Anwendung (im Status Normal) die Größe ändert, will ich einen Part des Codes nur durchlaufen, wenn er damit fertig ist.

Grüße, Philipp

EWeiss 13. Jun 2019 20:44

AW: FormResize-Method und Border
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1434591)
Hi,

gibt es eine Chance in der FormResize-Methode (FMX) festzustellen, ob der User noch am Border am resizen ist oder nicht?
Wenn das FormResize ein einmalige Ereignis ist, wie Maximized->Normal oder Bildschirm-Wechsel funktioniert bei mir alles tadellos, aber wenn der User selbst am Rand der Anwendung (im Status Normal) die Größe ändert, will ich einen Part des Codes nur durchlaufen, wenn er damit fertig ist.

Grüße, Philipp

Form <> Form ?
Ist das verhalten bei einer FMX Form denn anders?

Wenn gleich dann kannst du das etwa so prüfen..
Rechter Border..

Delphi-Quellcode:
  if Msg = WM_NCHITTEST then
  begin
    P.X := LoWord(lP);
    P.Y := HiWord(lP);

    GetClientRect(WinHandle, rc);
    xF := rc.Right;
   
    BORDER := GetSystemMetrics(32); // = SM_CXFRAME
    // Rechte Seite
    if (P.X >= xF - 8) then
    begin
      if (P.X >= xF - BORDER) then
        HITTEST := HTRIGHT;
    end;
  end;

Wenn HITTEST = HTRIGHT dann befindest du dich über den rechten Border wenn nicht führe deine Funktion aus.
Aber ob das ausreicht für dein bestreben mag dahin gestellt sein denn eigentlich werden anschließend die Anchors enumeriert.
Und danach müsstest du handeln.
Bei normalen Forms wirst du WM_NCHITTEST wohl überschreiben müssen..

Delphi-Quellcode:
procedure WMNCHitTest(var AMessage: TWMNCHitTest); message WM_NCHITTEST;


Nachtrag..
Für P.X, P.Y verwende besser

Delphi-Quellcode:
    P.X := GET_X_LPARAM(lP);
    P.Y := GET_Y_LPARAM(lP);
ansonsten kann es passieren das du bei Multimonitoren die Falsche Position bekommst.
https://docs.microsoft.com/en-us/win...clbuttondblclk

gruss

peterbelow 14. Jun 2019 08:33

AW: FormResize-Method und Border
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1434591)
Hi,

gibt es eine Chance in der FormResize-Methode (FMX) festzustellen, ob der User noch am Border am resizen ist oder nicht?
Wenn das FormResize ein einmalige Ereignis ist, wie Maximized->Normal oder Bildschirm-Wechsel funktioniert bei mir alles tadellos, aber wenn der User selbst am Rand der Anwendung (im Status Normal) die Größe ändert, will ich einen Part des Codes nur durchlaufen, wenn er damit fertig ist.

Grüße, Philipp

Für Windows gäbe es da die WM_ENTERSIZEMOVE und WM_EXITSIZEMOVE messages, oder man könnte einfach prüfen, ob der Mausknopf noch gedrückt ist, aber ich kann Dir leider nicht sagen, ob es ein Äquivalent für FMX gibt, das auch auf anderen Geräten funktionieren würde.

philipp.hofmann 14. Jun 2019 10:46

AW: FormResize-Method und Border
 
Danke, zweiteres hört sich einfacher an, v.a. finde ich damit wirklich das Event, dass er losgelassen hat und dann kann ich wieder mit meiner Verarbeitung einsteigen.

Neutral General 14. Jun 2019 10:48

AW: FormResize-Method und Border
 
Nur als Hinweis: Alles was bisher gesagt wurde, funktioniert nicht für Android/iOS/MacOS falls deine Anwendung auf einem dieser Betriebssysteme laufen soll :!:

philipp.hofmann 14. Jun 2019 12:11

AW: FormResize-Method und Border
 
Android/iOS: Da droht weniger die Gefahr, dass der User selbst am Border die Größe zieht, oder?
MacOS/Linux: Ja, ist mir klar, dass dies gerade ein Windows-Only-Workaround ist.
Ich habe auch eine allgemein gültige Lösung, dass ich den kritischen Part im FormResize nicht öfter als alle 300ms durchführe, aber dieser Workaround gefällt mir bisher nur so halb.

EWeiss 14. Jun 2019 15:02

AW: FormResize-Method und Border
 
Keine Ahnung was ihr hier von euch gebt aber unter Windows wird beim Klick\Move auf den Rahmen HITTEST\WM_NCHITTEST WM_NCLBUTTONDOWN ausgelöst. (Aber ich bin ja doof nicht wahr? )
OK FireMonkey interessiert mich nicht weiter falle da immer wieder drauf rein.
Bin raus. :)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 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