Delphi 5: Как приостановить макеты якоря? - PullRequest
4 голосов
/ 26 февраля 2009

Есть ли способ временно приостановить все привязанные элементы управления в форме или изменить их размеры? i.e.:

procedure ScaleFormBy(AForm: TForm; n, d: Integer);
begin
    AForm.SuspendAnchors();
    try
       AForm.ScaleBy(n, d);
    finally
       AForm.ResumeAnchors();
    end;
end;

Мне нужно сделать это, потому что я звоню

AForm.ScaleBy(m, d);

Который неправильно обрабатывает привязанные элементы управления. (он отталкивает левый + правый или верхний + нижний закрепленный элемент управления с края формы.

Примечание: Я хочу отключить привязки, а не выравнивание.

Ответы [ 2 ]

6 голосов
/ 26 февраля 2009

SuspendAnchors звучат как базовый метод, но я не думаю, что это часть базового языка Delphi :) Вот код, который делает трюк:


var aAnchorStorage: Array of TAnchors;
procedure AnchorsDisable(AForm: TForm);
var
  iCounter: integer;
begin
  SetLength(aAnchorStorage, AForm.ControlCount);
  for iCounter := 0 to AForm.ControlCount - 1 do begin
    aAnchorStorage[iCounter] := AForm.Controls[iCounter].Anchors;
    AForm.Controls[iCounter].Anchors := [];
  end;
end;

procedure AnchorsEnable(AForm: TForm);
var
  iCounter: integer;
begin
  SetLength(aAnchorStorage, AForm.ControlCount);
  for iCounter := 0 to AForm.ControlCount - 1 do
    AForm.Controls[iCounter].Anchors := aAnchorStorage[iCounter];
end;

procedure TForm1.btnAnchorsDisableClick(Sender: TObject);
begin
  AnchorsDisable(Self);
end;

procedure TForm1.btnAnchorsEnableClick(Sender: TObject);
begin
  AnchorsEnable(Self);
end;

Наслаждайтесь

4 голосов
/ 26 февраля 2009

У парня была хорошая идея, но он не обрабатывал дочерний контроль (т. Е. TPanel, TPageControl и т. Д.)

Вот вариант, который использует рекурсию. Кроме того, обратите внимание, что я фактически не отключаю якоря - оказалось, что ScaleBy также не работает без якорей.

Теперь вы можете масштабировать форму, используя:

procedure ScaleFormBy(AForm: TForm; M, D: Integer);
var
   StoredAnchors: TAnchorsArray;
begin
   StoredAnchors := DisableAnchors(AForm);
   try
       AForm.ScaleBy(M, D);
   finally
       EnableAnchors(AForm, StoredAnchors);
   end;
end;

С функциями поддержки библиотеки:

TAnchorsArray = array of TAnchors;

function DisableAnchors(ParentControl: TWinControl): TAnchorsArray;
var
   StartingIndex: Integer;
begin
   StartingIndex := 0;
   DisableAnchors_Core(ParentControl, Result, StartingIndex);
end;

procedure EnableAnchors(ParentControl: TWinControl; aAnchorStorage: TAnchorsArray);
var
   StartingIndex: Integer;
begin
   StartingIndex := 0;
   EnableAnchors_Core(ParentControl, aAnchorStorage, StartingIndex);
end;

procedure DisableAnchors_Core(ParentControl: TWinControl; var aAnchorStorage: TAnchorsArray; var StartingIndex: Integer);
var
   iCounter: integer;
   ChildControl: TControl;
begin
   if (StartingIndex+ParentControl.ControlCount+1) > (Length(aAnchorStorage)) then
      SetLength(aAnchorStorage, StartingIndex+ParentControl.ControlCount+1);

   for iCounter := 0 to ParentControl.ControlCount - 1 do
   begin
      ChildControl := ParentControl.Controls[iCounter];
      aAnchorStorage[StartingIndex] := ChildControl.Anchors;

      if ([akLeft, akRight ] * ChildControl.Anchors) = [akLeft, akRight] then
         ChildControl.Anchors := ChildControl.Anchors - [akRight];

      if ([akTop, akBottom] * ChildControl.Anchors) = [akTop, akBottom] then
         ChildControl.Anchors := ChildControl.Anchors - [akBottom];

      Inc(StartingIndex);
   end;

   //Add children
   for iCounter := 0 to ParentControl.ControlCount - 1 do
   begin
      ChildControl := ParentControl.Controls[iCounter];
      if ChildControl is TWinControl then
         DisableAnchors_Core(TWinControl(ChildControl), aAnchorStorage, StartingIndex);
   end;
end;

procedure EnableAnchors_Core(ParentControl: TWinControl; aAnchorStorage: TAnchorsArray; var StartingIndex: Integer);
var
   iCounter: integer;
   ChildControl: TControl;
begin
   for iCounter := 0 to ParentControl.ControlCount - 1 do
   begin
      ChildControl := ParentControl.Controls[iCounter];
      ChildControl.Anchors := aAnchorStorage[StartingIndex];

      Inc(StartingIndex);
   end;

   //Restore children
   for iCounter := 0 to ParentControl.ControlCount - 1 do
   begin
      ChildControl := ParentControl.Controls[iCounter];
      if ChildControl is TWinControl then
         EnableAnchors_Core(TWinControl(ChildControl), aAnchorStorage, StartingIndex);
   end;
end;


end;
...