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 soll nicht verschiebbar sein! (https://www.delphipraxis.net/120965-form-soll-nicht-verschiebbar-sein.html)

richard_boderich 19. Sep 2008 17:08


Form soll nicht verschiebbar sein!
 
Hallo Delphianer!

Ich hätte gern ein Form, das nicht verschiebbar ist. Also nicht auf Perfom syscommand, verschieben über die Programmleiste usw. reagiert. Hat jemand dazu eine Idee?

toms 19. Sep 2008 17:11

Re: Form soll nicht verschiebbar sein!
 
Edit: Dieser Code macht die Form verschiebbar aber nicht vergrößerbar. :arrow: Richtige Antwort unten.

Delphi-Quellcode:
private
   procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
end;
Delphi-Quellcode:
implementation

procedure TForm1.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin
  inherited;
  with Msg.MinMaxInfo^ do
  begin
    ptMinTrackSize.X := Self.Width;
    ptMaxTrackSize.X := Self.Width;
    ptMinTrackSize.Y := Self.Height;
    ptMaxTrackSize.Y := Self.Height;
  end;
end;

richard_boderich 19. Sep 2008 17:12

Re: Form soll nicht verschiebbar sein!
 
Au, das ging schnell! :)

Dank dir toms, werd es gleich mal testen.

toms 19. Sep 2008 17:13

Re: Form soll nicht verschiebbar sein!
 
Sorry, das macht die Form nicht vergrößerbar.

So geht's:

Delphi-Quellcode:
  private
    procedure WMWindowPosChanging(var msg: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
  end;


procedure TForm1.WMWindowPosChanging(var msg: TWMWindowPosChanging);
begin
  inherited;
  msg.WindowPos^.flags := msg.WindowPos^.flags or SWP_NOMOVE;
end;

richard_boderich 19. Sep 2008 17:16

Re: Form soll nicht verschiebbar sein!
 
@toms

mmhhh..hat bei mir leider keinen Effekt. Formsyle ist "FSDialog" Systemicons sind alle deaktiviert.

toms 19. Sep 2008 17:20

Re: Form soll nicht verschiebbar sein!
 
Habe meinen 2. Beitrag editiert :-D

richard_boderich 19. Sep 2008 17:30

Re: Form soll nicht verschiebbar sein!
 
Also das ist schon besser. Das Form lässt sich jetzt nicht mehr verschieben, hat jedoch einen sehr unschönen Banding Effekt.

toms 19. Sep 2008 17:32

Re: Form soll nicht verschiebbar sein!
 
Zitat:

Zitat von richard_boderich
Also das ist schon besser. Das Form lässt sich jetzt nicht mehr verschieben, hat jedoch einen sehr unschönen Banding Effekt.

Was meinst du damit?

richard_boderich 19. Sep 2008 17:38

Re: Form soll nicht verschiebbar sein!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mal ein Screenshot angehängt. Die Position des Dialogfensters ändert sich jetzt zwar nicht mehr, jedoch kann ich seinen Rahmen verschieben, solange
ich die linke Maustaste gedrückt halte.

toms 19. Sep 2008 17:50

Re: Form soll nicht verschiebbar sein!
 
Zitat:

Zitat von richard_boderich
Habe mal ein Screenshot angehängt. Die Position des Dialogfensters ändert sich jetzt zwar nicht mehr, jedoch kann ich seinen Rahmen verschieben, solange
ich die linke Maustaste gedrückt halte.

Dieser Rahmen erscheint jedoch nur dann, wenn die Windows Einstellung "Inhalt beim Verschieben eines Fenster anzeigen" deaktiviert ist.

omata 19. Sep 2008 17:52

Re: Form soll nicht verschiebbar sein!
 
Delphi-Quellcode:
Form.BorderStyle := bsNone;

richard_boderich 19. Sep 2008 18:01

Re: Form soll nicht verschiebbar sein!
 
@omata

Stimmt das wäre eine Möglichkeit, sieht aber auch nicht so toll aus.Kann man die SC Message nicht direkt abfangen?

omata 19. Sep 2008 18:10

Re: Form soll nicht verschiebbar sein!
 
Delphi-Quellcode:
  private
    { Private-Deklarationen }
    procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
:
:
procedure TForm.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  DefaultHandler(Msg);
  if Msg.Result = HTCAPTION then
    Msg.Result:=0;
end;

procedure TForm.FormCreate(Sender: TObject);
const
  MnuCommand = SC_MOVE;
var
  SysMenu : HMenu;
begin
  SysMenu := GetSystemMenu(Handle, FALSE) ;
  DeleteMenu(SysMenu, MnuCommand, MF_BYCOMMAND);
end;
und Form.BorderStyle := bsSingle;

richard_boderich 19. Sep 2008 20:29

Re: Form soll nicht verschiebbar sein!
 
@omata

Funktioniert perfekt! :)
Was ich nur nicht ganz verstehe ist, was das Menü damit zu tun hat. Konkret geht es mir um diese beiden Codezeilen. Wäre nett wenn du das noch etwas näher erläutern könntest.

Delphi-Quellcode:
const
  MnuCommand = SC_MOVE;
var
  SysMenu : HMenu;
begin
  SysMenu := GetSystemMenu(Handle, FALSE) ;       <--Holt den Handle auf das Systemmenü? Meine Anwendung hat jedoch kein menü?!
  DeleteMenu(SysMenu, MnuCommand, MF_BYCOMMAND);  <--Verhindert das ein nichtexistentes Menü verschoben werden kann?
end;
Vielen Dank schonmal an dich und an alle anderen für ihre Antworten.

rollstuhlfahrer 19. Sep 2008 20:50

Re: Form soll nicht verschiebbar sein!
 
HI,

mit den beiden Anweisungen wird das System-Menü ausgelesen. Das ist nicht etwa dein Menü wenn du es auf die Form ziehst und dann unterhalb der Titelleiste auftaucht, sondern das Menü, dass z.B. auftaucht, wenn du einen Rechtsklick auf das AnwendungsIcon in der Titelleiste machst. Dort taucht dann allerlei auf, wie auch die Option Verschieben. Da diese Option deaktiviert sein soll (du willst ja die Form nicht verschiebbar machen) wird sie aus dem Menü herausgenommen (DeleteMenu).

Bernhard

richard_boderich 19. Sep 2008 21:10

Re: Form soll nicht verschiebbar sein!
 
THX for the Info :)

Schwedenbitter 2. Nov 2009 13:46

Re: Form soll nicht verschiebbar sein!
 
Hallo,

ich muss das Thema leider wieder aufwärmen:

Ich habe mittels
Delphi-Quellcode:
Procedure TDiktate.WMWindowPosChanging(Var Msg: TWMWindowPosMsg);
   // Message WM_WindowPosChanging;
Begin
   Inherited;
   Msg.WindowPos^.flags:=Msg.WindowPos^.flags Or SWP_NoMove;
End;
die Form unverschiebbar gemacht. Im ObjektInspektor habe ich Position:=poScreenCenter gesetzt. Leider funktioniert das nun nicht mehr. Das Fenster wird ausnahmslos dort angezeigt, wo ich es erstellt habe bzw. bei 0,0 (=links oben). Vermutlich liegt es daran, dass die Position erst später angepasst und dann WMWindowsPosChanging schon ausgeführt wird.

Wie erreiche ich es, dass das Fenster wieder poScreenCenter und unverschiebbar wird?

Es gleich in der Mitte zu positionieren scheidet aus, weil die Benutzer ja unterschiedliche Auflösungen haben könnten.

Gruß, Alex

turboPASCAL 2. Nov 2009 14:12

Re: Form soll nicht verschiebbar sein!
 
Bau dir eine Variable ein die nach dem anzeigen des Fensters
das verschieben deakviert.

Delphi-Quellcode:
Procedure ...WMWindowPosChanging(Var Msg: TWMWindowPosMsg);
   // Message WM_WindowPosChanging;
Begin
   Inherited;
   if not selfmove then Msg.WindowPos^.flags:=Msg.WindowPos^.flags Or SWP_NoMove
    else selfmove := false;
End;

procedure ...FormShow(Sender: TObject);
begin
  selfmove := ture;
end;

Schwedenbitter 2. Nov 2009 15:24

Re: Form soll nicht verschiebbar sein!
 
Zitat:

Zitat von turboPASCAL
Bau dir eine Variable ein die nach dem anzeigen des Fensters
das verschieben deakviert.

Genau das hatte ich auch schon probiert. Ich hatte die Variable aber vom MainForm "gesteuert". Das klappte - warum auch immer - nicht. So wie von Dir vorgeschlagen von OnShow aus geht es jetzt. 1000 Dank!

Gruß, Alex

himitsu 2. Nov 2009 16:42

Re: Form soll nicht verschiebbar sein!
 
Das es so nicht geht, liegt wohl daran, daß die Form mehrfach verschoben wird und dann auch noch X und Y getrennt.

Und der Code hatte so nur eine Verschiebung zugelassen.

turboPASCAL 2. Nov 2009 16:54

Re: Form soll nicht verschiebbar sein!
 
Jo, also ist dass das Problem der OOP mit ihren Gettern und Settern die
jeden "Schnurtz" einzeln ausführen.

Setz man nun FormX.Left := 100 & FormX.Top := 120 wird erst
das Fenster erst auf die X-Position verschoben, das ruft nun WM_WindowPosChanging
auf und danach wird das Fenster erst auf die Y-Position verschoben welches auch wieder
WM_WindowPosChanging aufruft bzw. auslöst.
Da diese aber nun "sagt" SWP_NoMove wird nun mal nix verschoben. ;)

Matz4000 23. Jan 2011 16:21

AW: Form soll nicht verschiebbar sein!
 
Hab ne viel einfachere Lösung als die Algorithmen :

Delphi-Quellcode:
Form1.borderstyle:=bssingle;
Damit gibts einfach keine "VerschieberPfeile" mehr, die auftreten wenn sich der Zeiger am Rand der Form befindet.

Dann kann man noch im Objektinspektor bei Bordericons biMaximize auf false schalten, und alles ist gut ;)

rollstuhlfahrer 23. Jan 2011 17:41

AW: Form soll nicht verschiebbar sein!
 
EINSPRUCH: Ich verwende sehr häufig den BorderStyle = bsSingle. Dadurch ändern die Forms ihre Größe nicht mehr (gewünscht). Aber sie sind weiterhin frei auf dem Bildschirm platzierbar. Wenn du auf die Titelleiste klickst und dann die gedrückte Maus umherbewegst, wirst du sehen, dass sich das Fenster (oder nur der Rahmen, je nach Einstellung) mitbewegt.

Bernhard


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