![]() |
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? |
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; |
Re: Form soll nicht verschiebbar sein!
Au, das ging schnell! :)
Dank dir toms, werd es gleich mal testen. |
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; |
Re: Form soll nicht verschiebbar sein!
@toms
mmhhh..hat bei mir leider keinen Effekt. Formsyle ist "FSDialog" Systemicons sind alle deaktiviert. |
Re: Form soll nicht verschiebbar sein!
Habe meinen 2. Beitrag editiert :-D
|
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.
|
Re: Form soll nicht verschiebbar sein!
Zitat:
|
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. |
Re: Form soll nicht verschiebbar sein!
Zitat:
|
Re: Form soll nicht verschiebbar sein!
Delphi-Quellcode:
Form.BorderStyle := bsNone;
|
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? |
Re: Form soll nicht verschiebbar sein!
Delphi-Quellcode:
und Form.BorderStyle := bsSingle;
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; |
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:
Vielen Dank schonmal an dich und an alle anderen für ihre Antworten.
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; |
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 |
Re: Form soll nicht verschiebbar sein!
THX for the Info :)
|
Re: Form soll nicht verschiebbar sein!
Hallo,
ich muss das Thema leider wieder aufwärmen: Ich habe mittels
Delphi-Quellcode:
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.
Procedure TDiktate.WMWindowPosChanging(Var Msg: TWMWindowPosMsg);
// Message WM_WindowPosChanging; Begin Inherited; Msg.WindowPos^.flags:=Msg.WindowPos^.flags Or SWP_NoMove; End; 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 |
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; |
Re: Form soll nicht verschiebbar sein!
Zitat:
Gruß, Alex |
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. |
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. ;) |
AW: Form soll nicht verschiebbar sein!
Hab ne viel einfachere Lösung als die Algorithmen :
Delphi-Quellcode:
Damit gibts einfach keine "VerschieberPfeile" mehr, die auftreten wenn sich der Zeiger am Rand der Form befindet.
Form1.borderstyle:=bssingle;
Dann kann man noch im Objektinspektor bei Bordericons biMaximize auf false schalten, und alles ist gut ;) |
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