AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Firemonkey Form Constraints

Ein Thema von Scurra · begonnen am 30. Apr 2015 · letzter Beitrag vom 5. Mai 2015
Antwort Antwort
Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#1

Firemonkey Form Constraints

  Alt 30. Apr 2015, 09:50
Hallo zusammen,

ich habe vor ein paar Wochen mein erstes kleines Programm mit Firemonkey geschrieben. Nun möchte ich verhindern, dass mein Formular unter eine bestimmte Größe verkleinert werden kann. Bei VCL gibt es dazu entweder die Property Constraints, mit der man die minimale Höhe und Breite festlegen kann oder man verwendet das OnCanResize-Event, um das Verändern der Größe zu verbieten, wenn man eine zu kleine Höhe oder Breite hat bzw. man setzt dort die neue Größe auf die minimal gewünschte Größe, falls die minimale Größe unterschritten wird.

In Firemonkey gibt es leider weder die Constraints für Formulare noch das OnCanResize-Event. Stattdessen habe ich im Internet ein paar andere Lösungen gesehen, die aber immer Nebeneffekte besitzen. Beispielsweise kann man das OnMouseUp-Event auslösen, wenn man die Größe mit der Maus zur Minimalgröße gezogen hat.
Eine andere Lösung, die ich im Moment verwende, ist, im OnResize-Event die Größe auf die Minimalgröße zu setzen, wenn die Minimalgröße unterschritten wird. Das führt jedoch natürlich zu einem flakerndem Formular, da die Größe zwei mal direkt hintereinander verändert wird, einmal durch die Maus und einmal durch das OnResize-Event selbst.

Hat jemand eine Idee, wie man das Problem mit möglichst geringem Aufwand beheben kann?

Anbei schicke ich noch ein Minimalbeispiel von meinem Problem.

Ich verwende im Moment Delphi XE8 Professional.

Gibt es evtl. noch ein Event, das vor dem OnResize-Event aufgerufen wird? Dann könnte ich dort versuchen, aus der Mausposition zu bestimmen, ob die Größe nach dem Resize-Event zu klein ist und dort schon reagieren, in dem ich die Größe auf die Minimalgröße setze.

Edit: Mir ist gerade aufgefallen, dass ich mich im Titel Vertippt habe: Es sollte natürlich "Form" und nicht "From" heißen.
Angehängte Dateien
Dateityp: zip ResizeDemo.zip (68,8 KB, 6x aufgerufen)

Geändert von mkinzler ( 6. Mai 2015 um 05:13 Uhr) Grund: Threadtitel korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Firemonkey From Constraints

  Alt 1. Mai 2015, 15:58
Vielleicht kann man ja auch einen mix aus den beiden Ansätzen machen: Release der Maus, wenn einer der Minimalwerte (Breite oder Höhe) unterschritten ist und dann für diesen Wert - in einem Extra Thread - den Minimalwert setzen.

Im ResizeEvent kann man nach ReleaseCapture die angepassten Werte nicht setzen, da das Formular automatisch wieder auf die Ausgangsgröße zurückspringt, die es hatte, bevor man mit der Maus anfing, die Größe zu verändern. Selbst wenn man sich die Werte merkt und innerhalb des ResizeEvents nach ReleaseCapture setzt, geht es nicht. Daher kann man hier auf einen Task zugrückgreifen, der dann quasi in einem anderen Thread die Synchronisation mit dem Formular macht.

Kleiner Nachteil ist, dass der Anwender noch einmal mit der Maus ansetzen muss - wenn er eine Grenze unterschritten hat, z.B. die Breite - um dann den anderen Wert verändern zu können (z.B. dann die Höhe).

Jedenfalls flackert nichts mehr.

Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts,

  System.Threading ; // <------- wird hier wegen Task benötigt.

type
  TForm1 = class(TForm)
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure DoConstraints (NewWidth, NewHeight: Integer);
  end;

const
  MIN_WIDTH = 300;
  MIN_HEIGHT = 250;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.DoConstraints (NewWidth, NewHeight: Integer);
begin
  setbounds (left, top, NewWidth, NewHeight);
end;

procedure TForm1.FormResize(Sender: TObject);
var
  T: ITask;
  w, h: Integer;
begin
  if (width < MIN_WIDTH) or (height < Min_Height) then begin
    if width < Min_Width then w := Min_Width else w := Width;
    if height < Min_Height then h := Min_Height else h := Height;

    ReleaseCapture;
    T := TTask.Create(procedure ()
      begin
        TThread.Synchronize(
        nil,
        procedure
        begin
          Self.DoConstraints (w, h);
        end);
      end);
    T.Start;
  end;
end;

end.
Muss allerdings anmerken, dass ich kein großer Threading-Experte bin. Vielleicht kann einer, der das ist, hier ein paar hilfreiche Anmerkungen machen, ob man das anders machen muss oder besser lösen kann. Da das hier ja nur zu grundsätzlichen Demonstration ist, habe ich auf Try ... Except Konstrukte verzichtet.

Wenn man hier eine abschließende Lösung gefunden hat, würde es sich natürlich noch anbieten, eine Extra Prozedur dafür anzulegen, die man dann im ResizeEvent nur noch aufrufen braucht und somit wiederverwendbar in anderen Projekten einsetzen kann.

Geändert von Harry Stahl ( 1. Mai 2015 um 16:04 Uhr)
  Mit Zitat antworten Zitat
Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Firemonkey From Constraints

  Alt 4. Mai 2015, 06:12
Danke für deinen Vorschlag. Mit Threads habe ich bisher noch nie gearbeitet Dein Code-Beispiel funktioniert aber genau so, wie ich es erwartet habe. Wie du schon gesagt hast, hat diese Implementierung den Nachteil, dass man neu mit der Maus ansetzen muss, sobald man die Minimalgröße in irgendeiner Weise beim Verkleinern unterschreitet.

Warum gibt es das CanResize-Event eigentlich nicht in Firemonkey? Wird dazu zwingend eine Funktionalität benötigt, die nur für Windows verfügbar ist?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Firemonkey From Constraints

  Alt 5. Mai 2015, 20:12
Warum gibt es das CanResize-Event eigentlich nicht in Firemonkey? Wird dazu zwingend eine Funktionalität benötigt, die nur für Windows verfügbar ist?
Ich würde mal sagen, das ist eines (von weiteren Dingen), die man noch nachrüsten kann und sollte. Ich habe mir mal die VCL-Lösung angesehen, das könnte man auch in FireMonkey implementieren, sollte dabei auch für den MAC gehen. Für die mobile Plattform hätte das nach erster Einschätzung wohl eher weniger Relevanz.

Wenn es eine Funktionalität sein sollte, die für Dich wichtig ist, bzw. oft benötigt wird, könntest Du ja mal einen Vorschlag zur Erweiterung bei Quality Central machen. Manche Dingen brauchen zwar länger (z.B. jetzt erst in XE8 die TImageList und Grafiken für die Buttons) und andere fehlen immer noch (Hints)), aber man soll ja die Hoffnung nicht aufgeben...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.111 Beiträge
 
Delphi 12 Athens
 
#5

AW: Firemonkey From Constraints

  Alt 5. Mai 2015, 20:49
Hints braucht man in Touchumgebungen doch nicht und da dort die meiste Arbeit rein geht, hat auf soeinen Pillepalle keiner Lust.
Und da dort (auf'm Handy) eh alles Vollbild ist, wozu braucht man da Constraints?

Die FMX-TForm ist halt keine Form, sondern eine Komponente, welche auf den "Canvas" der jeweiligen Platform-Form draufgemalt wird.
Diese "Komponente" bekommt erst nach Änderung der Formgröße ihre neue Größe mitgeteilt und hier müsste Emba bei allen nötigen Platformen (Windows, MacOS ... Linux spart man sich ja) das Changing-Event ala OnCanResize ebenfalls im Parent implementieren und an die FMX-Form weitergeben.

Leider bietet TPlatformWin.HandleMessage keinen Event ala OnMessage an, wie in der VCL, sonst könnte man sich da ganz billig reinhängen.
Bei den Windows-Forms sollte man zwar an WM_WINDOWPOSCHANGING rankommen können, aber ich weiß auch nicht, wie man sich da bei der FMX-Form an die Messagebeandlung ranhängen kann.
Vielleicht hilft der TMessageManager, den ich im Code an paar Stellen sah? Oder jemand sucht mal nach der Parent-Form, welche FMX im Windows als Zeichenfläche benutzt.


Wenn jemand dort was macht, dann dauert das aber garantiert noch mindestens bis XE10. (also warten würde ich nicht drauf)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Mai 2015 um 21:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Firemonkey From Constraints

  Alt 5. Mai 2015, 22:16
@himitsu:

Klar, auf mobilen Anwendungen braucht man keine Hints. Aber unter Windows und MAC ist es eine hilfreiche Sache.

Bei den Constraints sehe ich momentan nur EMBA, die das hier sauber im Framework implementieren könnten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.111 Beiträge
 
Delphi 12 Athens
 
#7

AW: Firemonkey Form Constraints

  Alt 5. Mai 2015, 23:06
Pssst, das war natürlich ein Seitenhieb auf eine bestimmte Firma.

Drum haben auch schon mehrere versucht sich Hints selber zu basteln.
(Meine, aus dem FireMonkey 1 laufen leider so nicht mehr, da Emba mehrmals genügend im FMX umgebaut hat)


Und dann werd' ich jetzt mal 'nen Mod bitten die Überschrift zu reparieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:07 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