如何在 TCustomControl 组件上正确创建 TSplitter?

Leo*_*uno 2 delphi components

我\xc2\xb4m 使用一组现有的TControl 设计一个新的VCL 组件。\n控件放置在TPanels 上,一些对齐到左侧位置,一个对齐到右侧位置,最后一个对齐到客户区。这些面板中的每一个都有自定义组件作为其\xc2\xb4 的父级。

\n\n

我需要在面板之间放置分离器,以便用户能够调整内部组件的大小。

\n\n

问题是,我根本无法\xc2\xb4t 弄清楚在运行时创建时应用于分离器定位的逻辑。

\n\n

我访问了很多论坛,每个论坛都指向不同的解决方案,但没有一个起作用。

\n\n

试着:

\n\n

1 - 创建拆分器时,使用应放置在旁边的组件的属性“lef”t 和“width”,作为其“left”属性。

\n\n

2 - 使用 left 属性指定它应该在的位置。

\n\n

还有一些我不记得了。

\n\n

我缺少什么?

\n\n

在下面的代码中,分离器被创建在它应该在的位置。\n就在相应的面板之后,它们的 left 属性对应于我\xc2\xb4ve尝试的最后一个东西(它\xc2\xb4s位置)。

\n\n
constructor TDBIDBGridFilterBar.Create(AOwner: TComponent);\nbegin\n  inherited;\n  Self.Width := 490;\n  Self.Height := 23;\n  Self.Constraints.MinWidth := 285;\n\n  if fComboColunasWidth = 0 then\n    fComboColunasWidth := 118;\n\n  fBackGroundPanel := TPanel.Create(Self);\n  fBackGroundPanel.Parent := Self;\n  fBackGroundPanel.ShowCaption := false;\n  fBackGroundPanel.BevelOuter := bvNone;\n  fBackGroundPanel.Align := alClient;\n\n  fButtonsPanel := TPanel.Create(Self);\n  fButtonsPanel.Parent := fBackGroundPanel;\n  fButtonsPanel.ShowCaption := false;\n  fButtonsPanel.BevelOuter := bvNone;\n  fButtonsPanel.Width := 73;\n  fButtonsPanel.Align := alLeft;\n\n  fBtnMarcaTodos := TButton.Create(Self);\n  fBtnMarcaTodos.Parent := fButtonsPanel;\n  fBtnMarcaTodos.Width := 23;\n  fBtnMarcaTodos.Height := 23;\n  fBtnMarcaTodos.Left := 0;\n  fBtnMarcaTodos.Hint := \'Marcar todos\';\n  fBtnMarcaTodos.ShowHint := true;\n\n  fBtnDesmarcaTodos := TButton.Create(Self);\n  fBtnDesmarcaTodos.Parent := fButtonsPanel;\n  fBtnDesmarcaTodos.Width := 23;\n  fBtnDesmarcaTodos.Height := 23;\n  fBtnDesmarcaTodos.Left := 23;\n  fBtnDesmarcaTodos.Hint := \'Desarcar todos\';\n  fBtnDesmarcaTodos.ShowHint := true;\n\n  fBtnInveteSelecao := TButton.Create(Self);\n  fBtnInveteSelecao.Parent := fButtonsPanel;\n  fBtnInveteSelecao.Width := 23;\n  fBtnInveteSelecao.Height := 23;\n  fBtnInveteSelecao.Left := 46;\n  fBtnInveteSelecao.Hint := \'Inverter sele\xc3\xa7\xc3\xa3o\';\n  fBtnInveteSelecao.ShowHint := true;\n\n  fLabelPanel := TPanel.Create(Self);\n  fLabelPanel.Parent := fBackGroundPanel;\n  fLabelPanel.Width := 33;\n  fLabelPanel.Align := alLeft;\n  fLabelPanel.ShowCaption := false;\n  fLabelPanel.BevelOuter := bvNone;\n\n  fLabel := TLabel.Create(Self);\n  fLabel.Parent := fLabelPanel;\n  fLabel.Top := 4;\n  fLabel.Left := 4;\n  fLabel.Caption := \'Filtro:\';\n  fLabel.Width := 28;\n\n  fComboColunasPan := TPanel.Create(Self);\n  fComboColunasPan.Parent := fBackGroundPanel;\n  fComboColunasPan.ShowCaption := false;\n  fComboColunasPan.BevelOuter := bvNone;\n  fComboColunasPan.width := fComboColunasWidth;\n  fComboColunasPan.Align := alLeft;\n\n  fComboColunas := TDBIComboBox.Create(Self);\n  fComboColunas.Parent := fComboColunasPan;\n  fComboColunas.Text := \'\';\n  fComboColunas.OnEnter := PopulaComboColunas;\n  fComboColunas.OnChange := ComboChange;\n  fComboColunas.Style := csOwnerDrawFixed;\n  fComboColunas.Align := alClient;\n  fComboColunas.Hint := \'Colunas\';\n  fComboColunas.ShowHint := true;\n\n  fSplitterColunas := TSplitter.Create(Self);\n  fSplitterColunas.Parent := fBackGroundPanel;\n  fSplitterColunas.Align := alLeft;\n  fSplitterColunas.Left := 1;\n\n  fComboOperadorPan := TPanel.Create(Self);\n  fComboOperadorPan.Parent := fBackGroundPanel;\n  fComboOperadorPan.ShowCaption := false;\n  fComboOperadorPan.BevelOuter := bvNone;\n  fComboOperadorPan.width := fComboColunasWidth;\n  fComboOperadorPan.Align := alLeft;\n\n  fComboOperador := TDBIComboBox.Create(Self);\n  fComboOperador.Parent := fComboOperadorPan;\n // fComboOperador.Items.Add(cItensComboFiltro);\n  fComboOperador.Style := csOwnerDrawFixed;\n  fComboOperador.Align := alClient;\n  fComboOperador.Hint := \'Compara\xc3\xa7\xc3\xa3o\';\n  fComboOperador.ShowHint := true;\n  fComboOperador.Text := \'  =  \';\n\n  fSplitterOperador := TSplitter.Create(Self);\n  fSplitterOperador.Parent := fBackGroundPanel;\n  fSplitterOperador.Align := alLeft;\n  fSplitterOperador.Left := 2;\n\n  fBtnAdcFiltroPan := TPanel.Create(Self);\n  fBtnAdcFiltroPan.Parent := fBackGroundPanel;\n  fBtnAdcFiltroPan.ShowCaption := false;\n  fBtnAdcFiltroPan.BevelOuter := bvNone;\n  fBtnAdcFiltroPan.width := 23;\n  fBtnAdcFiltroPan.Align := alRight;\n\n  fBtnAdcFiltro := TButton.Create(Self);\n  fBtnAdcFiltro.Parent := fBtnAdcFiltroPan;\n  fBtnAdcFiltro.Height := 23;\n  fBtnAdcFiltro.Width := 23;\n  fBtnAdcFiltro.Caption := \'+\';\n  fBtnAdcFiltro.Hint := \'Adicionar filtro...\';\n  fBtnAdcFiltro.ShowHint := true;\n  fBtnAdcFiltro.OnClick := btnNewFilterClick;\n\n  fClientPanel := TPanel.Create(Self);\n  fClientPanel.Parent := fBackGroundPanel;\n  fClientPanel.ShowCaption := false;\n  fClientPanel.BevelOuter := bvNone;\n  fClientPanel.Align := AlClient;\n\n  fMaskEdit := TDBIMaskEdit.Create(Self);\n  fMaskEdit.Parent := fClientPanel;\n  fMaskEdit.Font.Size := 9;\n  fMaskEdit.Align := alTop;\nend;\n
Run Code Online (Sandbox Code Playgroud)\n

Tom*_*erg 5

当您按从左到右的顺序将面板添加到背景面板时,Left在设置属性之前将添加的面板的属性设置Alignment为足够大的值就足够了,因此它超出了Left已放置在背景上的组件的属性控制板。您设置的值甚至可以大于背景面板的宽度。

当您以从右到左的顺序 ( Alignment = alRight;) 添加面板或其他组件时,您可以将该Left属性保留为 0。

上述情况适用于放置在背景面板上的任何组件,也包括分离器。使用拆分器时,您可能还希望将相邻组件Constraints.MinWidth属性设置为 10 之类的值,以防止组件宽度意外减小到零,从而变得不可见。一旦发生这种情况,就无法使用分离器再次使其可见。

例如,这段代码:

procedure TForm1.Panel1Click(Sender: TObject);
var
  i: integer;
begin
  i := 1;
  repeat
    with TPanel.Create(self) do
    begin
      Parent := Panel1;
      Left := 510;
      Align := alLeft;
      Width := 40;
      Constraints.MinWidth := 10;
      Caption := 'L'+IntToStr(i);
    end;
    if (i = 3) or (i = 5) then
    with TSplitter.Create(self) do
    begin
      Parent := Panel1;
      Left := 510;
      Width := 10;
      Align := alLeft;
    end;
    inc(i);
  until i > 5;
  with TPanel.Create(self) do
  begin
    Parent := Panel1;
    Width := 40;
    Align := alRight;
    Caption := 'R1';
  end;
  with TPanel.Create(self) do
  begin
    Parent := Panel1;
    Width := 40;
    Align := alRight;
    Caption := 'R2';
  end;
  with TPanel.Create(self) do
  begin
    Parent := Panel1;
    Left := 510;
    Align := alClient;
    Caption := 'C';
  end;
end;
Run Code Online (Sandbox Code Playgroud)

产生这个设计:

在此输入图像描述

L1 .. L5alLeft对齐,CalClient对齐,R1 .. R2alRight对齐。