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 darf nicht verschoben werden (https://www.delphipraxis.net/80939-form-darf-nicht-verschoben-werden.html)

Martin K 17. Nov 2006 18:07


Form darf nicht verschoben werden
 
Hi,

hätte nicht gedacht, dass ich mal vor so einem Problem stehen würde :wall:

Also folgendes:
Ein Form darf nicht verschoben werden!
Aber wie ist das zu machen?

- WindowState = wsMaximized, aber man kann ja ganz leicht das Fenster wieder verkleinern und dann verschieben.
- WindowState = wsMaximized und dann biMaximize aus den BorderIcons rausnehmen -> geht auch nicht, weil sich Fester dann doch wieder verschieben lässt
- in OnResize WindowState auf wsMaximized zu setzen klappt leider auch nicht
- BorderStyle = bsNone, wäre möglich, Fenster soll aber normale Titelleiste haben
- leider keine Prozedur wie OnMove gefunden, bei der man Left und Top wieder zurücksetzen könnte

Das Form ist generell im maximierten Zustand und soll dies auch bleiben.
Dass man die Größe nicht ändern kann, lässt sich ja einfach per Constraints festlegen, aber leider nicht Left und Top.
Richtig wäre eigentlich, biMaximize aus den BorderIcons rauszunehmen, aber wie gesagt: dann kann man das Fenster trotzdem verschieben.

Wenn jemand eine Idee hat, bitte posten.
Danke!

Muetze1 17. Nov 2006 18:17

Re: Form darf nicht verschoben werden
 
WM_WINDOWPOSCHANGING ist die Antwort.

Delphi-Quellcode:
unit Unit12;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    Procedure WMWindowPosChanging(Var Message: TWMWindowPosChanging); Message WM_WINDOWPOSCHANGING;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
  With Message Do
  Begin
    WindowPos.x := 0;     // Left
    WindowPos.y := 0;     // Top
    WindowPos.cx := 1280; // Width
    WindowPos.cy := 1024; // Height

    Result := 0; // handled
  End;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Left := 0; // nur dazu da, die Form einmalig in den Verschiebungsprozess zu bekommen
end;

end.

Martin K 17. Nov 2006 18:29

Re: Form darf nicht verschoben werden
 
Danke, genau das isses :thumb:
Allerdings ist Left und Top bei wsMaximized -4, weil ja die Ränder des Forms abgeschnitten werden.
Reicht aber, das so zu machen:
Delphi-Quellcode:
  with Message do
  begin
    WindowPos.X := Left;
    WindowPos.Y := Top;

    Result := 0;
  end;
Denn wenn im OI WindowState auf wsMaximized steht wird das Form beim Programmstart ja automatisch maximiert und Left/Top auf -4 gesetzt, somit muss Left und Top nur noch beibehalten werden.

Reinhard Kern 18. Nov 2006 01:47

Re: Form darf nicht verschoben werden
 
Zitat:

Zitat von Martin K
Hi,

hätte nicht gedacht, dass ich mal vor so einem Problem stehen würde :wall:

Also folgendes:
Ein Form darf nicht verschoben werden!
Aber wie ist das zu machen?

- WindowState = wsMaximized, aber man kann ja ganz leicht das Fenster wieder verkleinern und dann verschieben.
- WindowState = wsMaximized und dann biMaximize aus den BorderIcons rausnehmen -> geht auch nicht, weil sich Fester dann doch wieder verschieben lässt
- in OnResize WindowState auf wsMaximized zu setzen klappt leider auch nicht
- BorderStyle = bsNone, wäre möglich, Fenster soll aber normale Titelleiste haben
- leider keine Prozedur wie OnMove gefunden, bei der man Left und Top wieder zurücksetzen könnte

Das Form ist generell im maximierten Zustand und soll dies auch bleiben.
Dass man die Größe nicht ändern kann, lässt sich ja einfach per Constraints festlegen, aber leider nicht Left und Top.
Richtig wäre eigentlich, biMaximize aus den BorderIcons rauszunehmen, aber wie gesagt: dann kann man das Fenster trotzdem verschieben.

Wenn jemand eine Idee hat, bitte posten.
Danke!

Hallo,

ich hatte sowas mal auf Basis von WM_MOVE. Der Benutzer kann dann zwar das Window wegschieben, aber auf die Msg WM_MOVE werden die alten Werte wieder gesetzt und das Window schnappt wie von einem Gummi gezogen zurück an die gewünschte Position. Da der Computer viel sturer ist, gibt der Benutzer bald auf.

Gruss Reinhard

Christian Seehase 18. Nov 2006 04:18

Re: Form darf nicht verschoben werden
 
Moin Martin,

Zitat:

Zitat von Martin K
Allerdings ist Left und Top bei wsMaximized -4, weil ja die Ränder des Forms abgeschnitten werden.

aber auch nur dann, wenn die Bordersize = 2 ist (siehe MSDN-Library durchsuchenGetSystemMetrics)

Martin K 18. Nov 2006 13:26

Re: Form darf nicht verschoben werden
 
@Reinhard Kern:
Danke, aber habe es schon mit WM_WINDOWPOSCHANGING gelöst.

@Christian Seehase:
Das ist schon klar, dass sich so absolute Werte wie -4 ändern können, je nach Theme oder was auch immer.
Deswegen verwende ich ja auch einfach den unrsprünglichen Wert von Left und Top, der ist nicht absult sondern eben der Wert, den Left und Top bei wsMaximized haben und den man wahrscheinlich auch über GetSystemMetrics erhalten würde.

Daniel G 18. Nov 2006 13:34

Re: Form darf nicht verschoben werden
 
Zitat:

Zitat von Reinhard Kern
Da der Computer viel sturer ist, gibt der Benutzer bald auf.

:lol:


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