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 Verhindern das Fenster verschoben wird (https://www.delphipraxis.net/111797-verhindern-das-fenster-verschoben-wird.html)

Andreas L. 9. Apr 2008 16:03


Verhindern das Fenster verschoben wird
 
Hallo,
ich möchte verhindern das, dass Fenster seine Position verändert. Ein Ereignis wie OnMove gibts nicht und mit einem Timer ist es wohl doch sehr unschön. Das Fenster bekommt als Parent eine Scrollbox und soll da drin (wie in der RAD von Delphi) nicht verschoben werden können. Der Rahmen muss aber sichtbar bleiben, also kann ich nicht einfach Borderstyle auf bsNone stellen.

Irgendwelche Ideen?

EDIT: Das Form.Enabled auf False bringt zwar den gewünschten Effekt (kein verschieben, keine Funktion von Minimieren,etc) aber ich kann dann logischerweise keine Controls mehr drauf verschieben (ich verwende dazu TControlSizer).

Fussball-Robby 9. Apr 2008 16:10

Re: Verhindern das Fenster verschoben wird
 
Nach ca. 13,7 Sekunden Suche: klick

Andreas L. 9. Apr 2008 16:41

Re: Verhindern das Fenster verschoben wird
 
Ich wollte dasjetzt testen und hab fix eine neue Komponente erzeugt.
Delphi-Quellcode:
unit FormEditor;

interface

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

type
  TEditableForm = class(TCustomForm)
  private
    //
  public
    procedure WMNChittest(var msg:TWMNChittest); Message WM_NChittest;
  end;

  TFormEditor = class(TScrollBox)
  private
    FWindow: TEditableForm;
  protected
    { Protected-Deklarationen }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('CapSystems', [TFormEditor]);
end;

{ TEditableForm }
procedure TEditableForm.WMNChittest(var msg: TWMNChittest);
begin
  DefaultHandler(Msg);
  if Msg.result = HTCAPTION then
    Msg.result := HTCLIENT;
end;

{ TFormEditor }
constructor TFormEditor.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if not (csDesigning in ComponentState) then
  begin
    FWindow := TEditableForm.Create(Self);
    with FWindow do
    begin
      Parent := Self;
      Visible := True;
    end;
  end;
end;

destructor TFormEditor.Destroy;
begin
  if not (csDesigning in ComponentState) then
    FWindow.Free;
  inherited Destroy;
end;

end.
Leider bekomme ich zur Laufzeit folgende Fehler:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EResNotFound mit der Meldung 'Ressource TEditableForm wurde nicht gefunden' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
An was könnte das liegen?

Andreas L. 9. Apr 2008 16:54

Re: Verhindern das Fenster verschoben wird
 
OK, man muss anstatt Create einfach CreateNew verwenden. Warum das so ist verstehe ich aber nicht ganz.

Macci 9. Apr 2008 18:46

Re: Verhindern das Fenster verschoben wird
 
Hallo,

nein, du musst ganz einfach nur die Message WM_MOVING abfangen. Ist wirklich ein Kinderspiel. Bei Google wirst du sofort fündig.

Edit: Ach was solls, hier die Lösung.

Delphi-Quellcode:
unit Unit1;

interface

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

type TWMMoving = record
    Msg: Cardinal;
    fwSide: Cardinal;
    lpRect: PRect;
    Result: Integer;
  end;


type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure OnMoving(var Msg: TWMMoving); message WM_MOVING;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.OnMoving(var Msg: TWMMoving);
begin
inherited;
Msg.lpRect^ := BoundsRect; // Neue Position ist die aktuelle Position
Msg.Result := 1;

end;



end.

Spiderpig_GER_15 12. Aug 2008 14:24

Re: Verhindern das Fenster verschoben wird
 
genau das hab ich auhc gebraucht, danke Macci :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf