The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Изменение размеров Формы

By Christian Ebenegger: C.Ebenegger@FSP.CH

Перевод Руденко Е.В.   janer@newmail.ru    январь  2002 года

Изменение размеров формы и ее компонентов может представлять серьезную проблему и есть несколько путей для ее решения.

Один путь - "геометрический": каждый визуальный контроль имеет четыре координаты, называемые Left, Top, Right и Bottom ,и мы можем контролировать их с помощью свойства  Tcontrol.BoundsRect. Таким образом, при изменении размеров Формы каждый визуальный контроль также может быть изменен пропорционально изменениям Формы с помощью метода TСontrol.SetBounds.

Итак, начав от точки, соответствующей проектным размерам формы, можно представить начальное расположение компонентов формы и ее самой в виде матрицы  Matrix[0, (Form.ControlCount – 1), 0, 3] переменных типа Integer и двух переменных Integer для параметров  Form.ClientWidth и Form.ClientHeight.

Теперь рассмотрим два случая:

  1. Увеличение размеров формы относительно начальной позиции
  2. Уменьшение размеров формы относительно начальной позиции
 В первом случае, каждый раз при изменении размеров формы, мы определяем новые значения параметров Form.ClientWidth и Form.ClientHeight в двух Integer переменных  WW и HH и рассчитываем новые позиции всех компонентов формы из начальных позиций, сохраненных в матрице.

Во втором случае, чтобы устранить эффект "сползания" (т.е. сдвигания всех компонентов в большую кучу), мы не изменяем размеров компонентов, а только добавляем к форме скроллинг.

Наконец, рассмотрим следующие процедуры:

procedure TForm.GetFormInfo;
var
 I : Integer;
 RGN : TRect;
begin
  for I := 0 to (Form.ControlCount –1) do
   begin
    RGN := Form.Controls[I].BoundsRect;
    Matrix[I,0] := RGN.Left;
    Matrix[I,1] := RGN.Top;
    Matrix[I,2] := RGN.Right;
    Matrix[I,3] := RGN.Bottom;
   end;
  PW := Form.Width;
  PH := Form.Height;
end;

procedure TForm.OnResize(Sender: TObject);
var
  L, T, R, B, W, H, WW, HH, I : Integer;
 procedure SetBounds(Control: TControl);
   begin
    Control.SetBounds(L, T, W, H);
   end;
begin
 WW := Form.ClientWidth; //Получение новых размеров Формы
 HH := Form.ClientHeight;

Form.AutoScroll := False;
 if (WW >= PW) and (HH >= PH) then
  begin
   for I := 0 to (Form.ControlCount - 1) do
    begin
     if Form.Controls[I] is TButton then         // Кнопки только перемещаются
      begin
       L := ((Matrix[I,0] * WW) div PW);
       T := ((Matrix[I,1] * HH) div PH);
       W := Form.Controls[I].Width;
       H := Form.Controls[I].Height;
       SetBounds(Form.Controls[I]);
      end
     else
      begin
       L := ((Matrix[I,0] * WW) div PW); // все прочие компоненты изменяют размеры и перемещаются
       T := ((Matrix[I,1] * HH) div PH);
      R := ((Matrix[I,2] * WW) div PW);
      B := ((Matrix[I,3] * HH) div PH);
      W := R - L;
      H := B - T;
      SetBounds(Form.Controls[I]);
      end;
    end;
  end
 else
 begin
   Form.AutoScroll := True;
   Form.HorzScrollBar.Visible := True;
   Form.HorzScrollBar.Range := PW;
   Form.VertScrollBar.Visible := True;
   Form.VertScrollBar.Range := PH;
 end;
end;

 

Для загрузки небольшого примера, щелкните здесь.

Возврат в Tips&Tricks