我\xc2\xb4m 使用一组现有的TControl 设计一个新的VCL 组件。\n控件放置在TPanels 上,一些对齐到左侧位置,一个对齐到右侧位置,最后一个对齐到客户区。这些面板中的每一个都有自定义组件作为其\xc2\xb4 的父级。
\n\n我需要在面板之间放置分离器,以便用户能够调整内部组件的大小。
\n\n问题是,我根本无法\xc2\xb4t 弄清楚在运行时创建时应用于分离器定位的逻辑。
\n\n我访问了很多论坛,每个论坛都指向不同的解决方案,但没有一个起作用。
\n\n试着:
\n\n1 - 创建拆分器时,使用应放置在旁边的组件的属性“lef”t 和“width”,作为其“left”属性。
\n\n2 - 使用 left 属性指定它应该在的位置。
\n\n还有一些我不记得了。
\n\n我缺少什么?
\n\n在下面的代码中,分离器被创建在它应该在的位置。\n就在相应的面板之后,它们的 left 属性对应于我\xc2\xb4ve尝试的最后一个东西(它\xc2\xb4s位置)。
\n\nconstructor 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;\nRun Code Online (Sandbox Code Playgroud)\n
当您按从左到右的顺序将面板添加到背景面板时,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对齐。