Конструирование 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;
|
Код может быть модифицирован для получения горизонтального движка - идея,
надеюсь, понятна...
|