Советы по Delphi

         

Конструирование 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;

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



Содержание раздела