2017-02-21 5 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; 

Я попробовал это, и это, кажется, делать то, что вы хотите сделать

EDIT:

Вы также можете использовать Align свойство (будьте внимательны на заказ, компонент с ' значение 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: проверить сек tate левой кнопки мыши

Вы можете проверить состояние кнопки или ключа с помощью функции GetAsyncKeyState (vKey) Winapi. Он возвращает состояние кнопки в SmallInt с битом 15 0/1, если кнопка нажата или нет.

GetAsyncKeyState

+0

Нет, при перетаскивании на левой стороне левой и правой несколько раз Groupbox в конце концов исчезает. Здесь что-то странное. – fullerm

+0

@fullerm Добавление 'akRight' в' GroupBox1.Anchors', кажется, отлично работает в Delphi 10.1 Berlin. Если это не сработает для вас, в вашем тестовом случае должно быть что-то еще, что вы не сказали нам. –

+0

Я использую XE и тестировал этот код в пустом проекте. После многократного перемещения вперед и назад по левой стороне Treeview перекрывается в Groupbox. Возможно, в XE есть ошибка. – fullerm

Смежные вопросы