Эквивалентно рекомендациям дизайнера в коде - PullRequest
11 голосов
/ 03 августа 2011

Дизайнер форм VCL предлагает розовые рекомендации по выравниванию элементов управления по соответствующим строкам текста: Guidelines in form designer
Но насколько я могу судить, это не работает для ярлыков и флажков. Обновление: Это работает для ярлыков, если вы поместите элементы управления точно , например Ctrl - стрелка . Это работает для флажков - см. Скриншот.

Теперь в некоторых формах я создаю элементы управления в коде, например,

ed := TEdit.Create(Self);
ed.SetBounds(...);
ed.Parent := SomePanel;

и т.д.. Как я могу убедиться, что их текстовые базовые линии выровнены? Я хотел бы иметь это для правок, списков, ярлыков и флажков. Результат должен выглядеть примерно так (без красной линии, конечно :-)): base line aligned

Редактировать: Мой текущий подход - вызвать что-то вроде AlignTop(8, [Edit1, ComboBox1], [CheckBox1, Label1]); с

procedure ControlArray_SetTop(const AControls: array of TControl; ATop: Integer);
var
  i: Integer;
begin
  for i := Low(AControls) to High(AControls) do
    AControls[i].Top := ATop;
end;

procedure AlignTop(ATop: Integer; const AControls: array of TControl; const ALabelLikeControls: array of TControl);
begin
  ControlArray_SetTop(AControls, ATop);
  ControlArray_SetTop(ALabelLikeControls, ATop + 3);
end;

Моя цель - заменить его чем-то более надежным и менее хакерским.

Ответы [ 4 ]

5 голосов
/ 03 августа 2011

Рекомендации реализованы в коде времени разработки, лицензия которого запрещает вам поставлять ваше приложение, поэтому вы можете использовать его только для того, чтобы извлечь из него урок, а затем самостоятельно реализовать его. Посмотри вверх

DesignIntf.TBaseComponentGuidelines
DesignEditors.TComponentGuidelines
VCLEditors.TControlGuidelines

классов (в каталоге "{RADStudio \ version} \ source \ ToolsAPI"). Возможно, это сводится к чему-то простому, как

Label1.Top := (Edit1.Top + Edit1.Height) - Label1.Height + GetMagicConstant;  

, где GetMagicConstant аналогично TControlGuidelines.GetTextBaseline().

2 голосов
/ 03 августа 2011

Я не думаю, что эта логика каким-либо образом раскрыта для вас, чтобы звонить во время выполнения.Я полагаю, что это только время разработки.

Чтобы справиться с этим, я бы создал фиктивную форму в конструкторе, который имел один элемент управления, с которым вы работали.Выровняйте их так, как на скриншотах.Во время выполнения создайте экземпляр этой формы, но не показывайте ее и не считывайте свойство Top для каждого типа элемента управления.Наконец, вы можете определить вертикальное смещение свойства Top для каждого типа элемента управления для каждого другого типа элемента управления.

1 голос
/ 08 августа 2011

Я хотел выровнять метку к ее окну редактирования. стоя на плечах @ я, я использовал это:

  Label1.Top := edit1.Top + _GetTextBaseline(edit1, tlBottom) - _GetTextBaseline(Label1, tlTop);


  // lifted from TControlGuidelines.GetTextBaseline(AControl: TControl; Align: TTextLayout): Integer;
  function _GetTextBaseline(AControl: TControl; Align: TTextLayout): Integer;
  var
    Canvas: TControlCanvas;
    tm: TTextMetric;
    ClientRect: TRect;
    Ascent, Height: Integer;
  begin
    Canvas := TControlCanvas.Create;
    try
      ClientRect := AControl.ClientRect;
      Canvas.Control := AControl;
      Canvas.Font := TControlFriend(AControl).Font;
      GetTextMetrics(Canvas.Handle, tm);
      Ascent := tm.tmAscent + 1;
      Height := tm.tmHeight;
      case Align of
        tlTop: Result := ClientRect.Top + Ascent;
        tlCenter: Result := (ClientRect.Top + (ClientRect.Bottom - Height) div 2) + Ascent;
        tlBottom: Result := (ClientRect.Bottom - Height) + Ascent;
      else
        Result := 0;
      end;
    finally
      Canvas.Free;
    end;
  end;
0 голосов
/ 25 марта 2016

Если вы сделаете два элемента управления одинаковой высоты, выровняйте верхние части и выровняйте текст по вертикали, как правило, базовая линия будет выровнена даже при изменении размера шрифта и шрифтов

...