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 Form am Bildschirmrand andocken Problem (https://www.delphipraxis.net/68489-form-am-bildschirmrand-andocken-problem.html)

Mazel 30. Apr 2006 14:53


Form am Bildschirmrand andocken Problem
 
Hallo,

ich möchte meine Form am Bildschirmrand andocken. Dazu habe ich versucht es über WM_WINDOWPOSCHANGING hinzubekommen wie es bei Fenster an Bildschirmrand / Taskleiste andocken lassen beschrieben ist. Wenn ich das aber tue greift die Constraints Eigenschaft der Form leider nicht mehr. Ich möchte aber eine Minimalgröße haben. Gibt es eine andere Möglichkeit das Problem zu lösen?

Gruß
Mazel

Sko 30. Apr 2006 15:07

Re: Form am Bildschirmrand andocken Problem
 
Hi,

zum Andocken an den Bildschirmrand reicht es eigentlich im OI "ScreenSnap" auf true zu stellen. Ich weiß aber nicht obs das bei Delphi 6 auch gibt.

turboPASCAL 30. Apr 2006 16:21

Re: Form am Bildschirmrand andocken Problem
 
Zitat:

Zitat von Sko
Hi,

zum Andocken an den Bildschirmrand reicht es eigentlich im OI "ScreenSnap" auf true zu stellen. Ich weiß aber nicht obs das bei Delphi 6 auch gibt.

Nein gibt es nicht.
Kann man aber nachholen per Komponente... siehe JVCL ( JvFormMagnet )

Mazel 30. Apr 2006 16:54

Re: Form am Bildschirmrand andocken Problem
 
Hi,

Es geht also nur über eine Komponente? Kann mir jemand einen Link anbieten, der zu dieser Komponente führt?

Edit:
Ich habe es gelöst. Ich brauchte lediglich inherited am Ende der Prozedur einfügen.

Gruß
Mazel

turboPASCAL 30. Apr 2006 18:57

Re: Form am Bildschirmrand andocken Problem
 
Zitat:

Es geht also nur über eine Komponente?
Nein, ist aber einfacher. ;)

Die Komponente ist hier mit dabei: http://homepages.borland.com/jedi/jvcl/


Ein Formsnap to Screen ohne Komponente geht so:

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TMovingSide = wmsz_Left..wmsz_BottomRight;
  TMovingSides = set of TMovingSide;

  TWMMoving = record
    Msg: Cardinal;
    Side: TMovingSides;
    Rect: PRect;
    Result: Longint;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FDockable: boolean;
    FSnapArea: integer;
    DispLeft, DispTop, DispRight, DispBottom: Integer;
    procedure WMEnterSizeMove(var Message: TMessage); message WM_ENTERSIZEMOVE;
    procedure WMMoving(var Message: TWMMoving); message WM_MOVING;
  public
    { Public-Deklarationen }
    property Dockable: boolean read FDockable write FDockable;
    property SnapArea: integer read FSnapArea write FSnapArea;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SnapArea := 30;
  Dockable := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
end;

procedure TForm1.WMEnterSizeMove(var Message: TMessage);
begin
  if not Dockable then exit;
  DispLeft:=0;
  DispTop:=0;
  DispRight:=0;
  DispBottom:=0;
end;

procedure TForm1.WMMoving(var Message: TWMMoving);
var
  OfsX, OfsY: Integer;
  r: TRect;
begin
  if not Dockable then exit;
  SystemParametersInfo( SPI_GETWORKAREA, 0, @r, 0 );
  with Message.Rect^ do begin

    if Abs(DispLeft + Left - r.Left) < SnapArea then begin
      OfsX:=r.Left-Left;
      DispLeft:=DispLeft + Left-r.Left;
    end else begin
      OfsX:=DispLeft;
      DispLeft:=0;
    end;

    if Abs(DispRight+Right-r.Right)<SnapArea then begin
      OfsX:=r.Right-Right;
      DispRight:=DispRight+Right-r.Right;
    end else begin
      OfsX:=OfsX+DispRight;
      DispRight:=0;
    end;

    if Abs(DispTop+Top-r.Top)<SnapArea then begin
      OfsY:=r.Top-Top;
      DispTop:=DispTop+Top-r.Top;
    end else begin
      OfsY:=DispTop;
      DispTop:=0;
    end;

    if Abs(DispBottom+Bottom-r.Bottom)<SnapArea then begin
      OfsY:=r.Bottom-Bottom;
      DispBottom:=DispBottom+Bottom-r.Bottom;
    end else begin
      OfsY:=OfsY+DispBottom;
      DispBottom:=0;
    end;

  end;
  OffsetRect(Message.Rect^,OfsX,OfsY);
end;

end.
:stupid:

Mazel 30. Apr 2006 21:56

Re: Form am Bildschirmrand andocken Problem
 
Danke,

aber ich hatte so eine halbe Stunde später schon die Lösung mit inherited, das habe ich ans Ende der Procedure von WMWINDOWPOSCHANGING gesetzt und schon habe ich meine Minimalgröße wieder.

Danke trotzdem für die Mühe.

Gruß
Mazel


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