2017-02-21 3 views
1

왼쪽에는 TTreeview, 오른쪽에는 TGroupbox가있는 폼이 있습니다. 오른쪽 가장자리를 드래그하여 양식의 크기를 조정하면 Groupbox를 적절히 늘리거나 줄이기를 원합니다. 양식을 왼쪽으로 드래그하면 Treeview의 크기가 조정됩니다. 아래 코드를 시도하고 오른쪽 크기 조정을 잘 작동합니다. 그러나 왼쪽 크기 조정은 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 메시지를 가로 챌 대신

사용자가 크기를 조정하는 창으로 전송 할 수 있습니다. 이 메시지를 처리하면 응용 프로그램에서 끌기 사각형의 크기와 위치를 모니터링하고 필요한 경우 크기 나 위치를 변경할 수 있습니다.

이 값은 정확하게 창의 가장자리가 크기 조정되는 것을 나타냅니다. 이를 사용하여 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

왼쪽의 창의 크기를 조정할 때 그룹 상자 오른쪽에 고정하는 것을 잊어 버린 것 같습니다.

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; 

EDIT 2 : s를 확인하십시오. 마우스의 왼쪽 버튼의 날짜

Winapi의 GetAsyncKeyState (vKey) 기능을 사용하여 버튼 또는 키의 상태를 확인할 수 있습니다. 단추를 눌렀다면 비트 15 0/1로 SmallInt의 단추 상태를 반환합니다.

GetAsyncKeyState

+0

아니요, 왼쪽 및 오른쪽으로 여러 번 끌면 그룹 상자가 결국 사라집니다. 이상한 일이 여기에 있습니다. – fullerm

+0

@fullerm'GroupBox1.Anchors'에'akRight'를 추가하면 Delphi 10.1 Berlin에서 잘 작동하는 것 같습니다. 그것이 당신을 위해 작동하지 않는다면, 테스트 케이스에 당신이 우리에게 말하지 않은 다른 것이 있어야합니다. –

+0

XE를 사용하고 있으며 빈 프로젝트에서이 코드를 테스트했습니다. 왼쪽을 많이 앞뒤로 드래그하면 트리 뷰가 그룹 상자 위로 겹칩니다. 아마 XE에 버그가있을 수 있습니다. – fullerm

관련 문제