2012-06-06 7 views
8

Wie verschiebe ich ein randloses Formular? Ich habe versucht, im Internet zu suchen, aber nichts. Danke vielmals.Formular ohne Rahmen bewegen

+0

kann hier sein: http://delphi.about.com/od/windowsshellapi/a/dragnocaption.htm – philnext

+0

Duplizieren von [C++ Builder: Erstellen Sie ein TForm mit Border bsNone, die dennoch beweglich ist und der Größe veränderbar ] (http://stackoverflow.com/questions/7178030/cbuilder-create-a-tform-with-borderstyle-bsnone-that-is-rethe-movable) - dieser Code ist für C++ Builder, aber es ist immer noch der dieselbe VCL! Es sollte trivial sein, zu Delphi zu wechseln. –

Antwort

16

Sie können eine Form unter Verwendung eines beliebigen ziehen Steuerelement enthalten, einschließlich sich selbst.

Mithilfe des folgenden Beispiels können Sie ein Formular verschieben, indem Sie auf seine Zeichenfläche klicken und ziehen. Sie können das gleiche mit einem Panel auf dem Formular tun, indem Sie denselben Code in das MouseDown-Ereignis des Panels einfügen, mit dem Sie Ihre eigene Pseudo-Titelleiste erstellen können.

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
const 
    SC_DRAGMOVE = $F012; 
begin 
    if Button = mbLeft then 
    begin 
    ReleaseCapture; 
    Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0); 
    end; 
end; 
+0

Danke, dieser Code ist besser! –

13

Wenn Sie das Fenster mit der Maus ziehen möchten, können Sie die Nachrichtenbehandlung WM_NCHITTEST überschreiben und HTCAPTION für die Ziehregion zurückgeben. Die unten wird das Fenster innerhalb der oberen 30 Pixel für insance ziehen:

type 
    TForm1 = class(TForm) 
    private 
    protected 
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; 
    end; 

.. 

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); 
var 
    Pt: TPoint; 
begin 
    Pt := ScreenToClient(SmallPointToPoint(Message.Pos)); 
    if Pt.Y < 30 then 
    Message.Result := HTCAPTION 
    else 
    inherited; 
end; 
+4

+1 dies ist der Weg es zu tun –

+0

@ David: In letzter Zeit bin ich etwas skeptisch zu diesem Ansatz, weil Sie im Grunde sagen, das Betriebssystem * das gesamte Formular ist die Beschriftung des Fensters *, die möglicherweise nicht wirklich sei semantisch wahr. (Nun, in Sertacs Code sind vielleicht die ersten 30 Pixel * tatsächlich die Beschriftung, aber im Allgemeinen ist dies möglicherweise nicht wahr.) –

+0

@andreas Haben Sie einen konkreten Grund, dies abzulehnen? Was sind die Schattenseiten? Dies ist der Standardansatz. –