Splitter

We use cookies. Read the Privacy and Cookie Policy

Splitter

Конструирование Splitter

У меня есть форма с расположенными на ней компонентами TreeView и Memo. Значение свойства align обоих компонентов позволяет им занимать всю форму. Я хотел бы расположить между ними движок типа Splitter, пропорционально меняющий их размеры (один шире, другой меньше и наоборот), но к сожалению я обладаю лишь дистрибутивом Delphi2 (Splitter вошел в палитру только в Delphi3). Какой компонент мог бы сымитировать поведение Splitter и как это реализовать?

Предположим, Ваш TreeView расположен в левой, а Memo в правой части формы. Вам нужно сделать следующее:

• Установите свойство Align компонента TreeView на alLeft.

• Вырежьте (Ctrl-X) компонент TMemo из вашей формы.

• Добавьте компонент Panel и присвойте его свойству Align значение alClient.

• Внутри панели разместите другой компонент Panel.

• Установите его ширину, равной 8 пикселам, свойству Align присвойте значение alLeft.

• Скопируйте вырезанный компонент TMemo в панель Panel1 и присвойте свойству Align значение alClient.

Panel2 – движок: теперь вам необходимо добавить процедуры, приведенные ниже. Ваш код будет выглядеть приблизительно так:

type TForm1 = class(tform)

 TreeView1: TTreeview;

 Panel1: TPanel;

 Panel2: TPanel;

 Memo1: TMemo;

 procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

 procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

 procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

private

 Resizing: Boolean;

public

 …

end;

procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 Resizing:=true;

end;

procedure TForm1.Panel2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 Resizing:= false;

end;

procedure TForm1.Panel2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

 if Resizing then begin

  TreeView1.Width:=TreeView1.Width+X;

  // Предохранение от странных ошибок перерисовки при изменении размеров:

  Panel1.Invalidate;

 end;

end;

Код может быть модифицирован для получения горизонтального движка – идея, надеюсь, понятна…