2017-02-21 69 views
1

我有一個窗體,左邊是一個TTreeview,右邊是一個TGroupbox。當通過拖動右邊緣調整窗體大小時,我希望Groupbox相應地增大或縮小。當窗體被拖動到左邊時,我想讓Treeview調整大小。我試了下面的代碼,正確調整工作正常。但是,調整大小會導致樹視圖變得比應該變長。什麼是實現這個目標的正確方法?基於拖拽區域動態調整控件大小

procedure TForm1.FormResize(Sender: TObject); 
var 
    p: TPoint; 
begin 
    P:= ScreenToClient(Mouse.CursorPos); 
    if(P.X<0) then begin 
    Treeview1.Anchors:= [akLeft,akTop,akRight,akBottom]; 
    Groupbox1.Anchors:= [akTop,akBottom]; 
    end 
    else begin 
    Treeview1.Anchors:= [akLeft,akTop,akBottom]; 
    Groupbox1.Anchors:= [akLeft,akTop,akRight,akBottom]; 
    end; 
end; 

回答

2

比處理OnResize事件相反,可以改爲攔截WM_SIZING消息,而不是

發送到該用戶是在調整大小的窗口。 通過處理此消息,應用程序可以監視拖動矩形的大小和位置,並在需要時更改其大小或位置。

它的wParam值告訴你窗口的哪個邊緣被調整大小。你可以用它來相應地調整Anchors,如:

type 
    TForm1 = class(TForm) 
    TreeView1: TTreeView; 
    GroupBox1: TGroupBox; 
    private 
    { Private declarations } 
    procedure WMSizing(var Message: TMessage); message WM_SIZING; 
    public 
    { Public declarations } 
    end; 

... 

procedure TForm1.WMSizing(var Message: TMessage); 
var 
    TreeViewAnchors: TAnchors; 
    GroupBoxAnchors: TAnchors; 
begin 
    inherited; 

    TreeViewAnchors := [akTop, akBottom]; 
    GroupBoxAnchors := [akTop, akBottom]; 

    case Message.WParam of 
    WMSZ_LEFT, WMSZ_BOTTOMLEFT, WMSZ_TOPLEFT: begin 
     TreeViewAnchors := TreeViewAnchors + [akLeft, akRight]; 
     GroupBoxAnchors := GroupBoxAnchors + [akRight]; 
    end; 
    WMSZ_RIGHT, WMSZ_BOTTOMRIGHT, WMSZ_TOPRIGHT: begin 
     TreeViewAnchors := TreeViewAnchors + [akLeft]; 
     GroupBoxAnchors := GroupBoxAnchors + [akLeft, akRight]; 
    end; 
    end; 

    TreeView1.Anchors := TreeViewAnchors; 
    GroupBox1.Anchors := GroupBoxAnchors; 
end; 
2

我想你忘了在左邊的窗口調整大小時將Groupbox錨定到正確的位置。

procedure TForm1.FormResize(Sender: TObject); 
var 
    p: TPoint; 
begin 
    if GetAsyncKeyState(VK_LBUTTON) and $8000 <> 0 then exit; 
    P:= ScreenToClient(Mouse.CursorPos); 
    if(P.X<0) then begin 
    Treeview1.Anchors:= [akLeft, akTop, akRight, akBottom]; 
    Groupbox1.Anchors:= [akTop, akRight, akBottom]; 
    end 
    else begin 
    Treeview1.Anchors:= [akLeft, akTop, akBottom]; 
    Groupbox1.Anchors:= [akLeft, akTop, akRight, akBottom]; 
    end; 
end; 

我試了一下,似乎做你想做的事

編輯:

您還可以使用對齊財產(注意順序上,成分與' alClient'值):

procedure TForm1.FormResize(Sender: TObject); 
var 
    p: TPoint; 
begin 
    if GetAsyncKeyState(VK_LBUTTON) and $8000 <> 0 then exit; 
    P:= ScreenToClient(Mouse.CursorPos); 
    if(P.X<0) then begin   
    Groupbox1.Align:= alRight; 
    Treeview1.Align:= alClient; 
    end 
    else begin 
    Treeview1.Align:= alLeft; 
    Groupbox1.Align:= alClient; 
    end; 
end; 

編輯2:檢查s鼠標左鍵的狀態

您可以使用Winapi函數GetAsyncKeyState(vKey)檢查按鈕或按鍵的狀態。 如果按鈕被按下或沒有按下,則返回SmallInt中按鈕的狀態,位15 0/1。

GetAsyncKeyState

+0

沒有,當你在左邊拖動到左側和右側幾次GROUPBOX最終消失。這裏有一些奇怪的事情發生。 – fullerm

+0

@fullerm將'akRight'添加到'GroupBox1.Anchors'似乎在德爾福10.1柏林工作正常。如果它不適合你,你的測試用例中肯定還有別的東西沒有告訴我們。 –

+0

我正在使用XE並在一個空白項目中測試了這段代碼。在左側來回拖動之後,Treeview重疊到Groupbox上。也許XE有一個錯誤。 – fullerm