- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一组现有的 TControl 设计一个新的 VCL 组件。控件放置在 TPanels 上,一些对齐到左侧位置,一个对齐到右侧位置,最后一个对齐到客户区。每个面板都有自定义组件作为其父级。
我需要在面板之间放置分离器,以便用户能够调整内部组件的大小。
问题是,我根本无法弄清楚在运行时创建分离器时应用于定位的逻辑。
我访问了相当多的论坛,每个论坛都指向不同的解决方案,但没有一个起作用。
尝试:
1 - 创建拆分器时,使用应放置在旁边的组件的属性“lef”t 和“width”,作为其“left”属性。
2 - 使用 left 属性指定它应该在的位置。
还有一些我不记得了。
我错过了什么?
在下面的代码中,分离器被创建在它应该在的地方。就在相应的面板之后,它们的 left 属性对应于我最后尝试过的东西(它的位置)。
constructor TDBIDBGridFilterBar.Create(AOwner: TComponent);
begin
inherited;
Self.Width := 490;
Self.Height := 23;
Self.Constraints.MinWidth := 285;
if fComboColunasWidth = 0 then
fComboColunasWidth := 118;
fBackGroundPanel := TPanel.Create(Self);
fBackGroundPanel.Parent := Self;
fBackGroundPanel.ShowCaption := false;
fBackGroundPanel.BevelOuter := bvNone;
fBackGroundPanel.Align := alClient;
fButtonsPanel := TPanel.Create(Self);
fButtonsPanel.Parent := fBackGroundPanel;
fButtonsPanel.ShowCaption := false;
fButtonsPanel.BevelOuter := bvNone;
fButtonsPanel.Width := 73;
fButtonsPanel.Align := alLeft;
fBtnMarcaTodos := TButton.Create(Self);
fBtnMarcaTodos.Parent := fButtonsPanel;
fBtnMarcaTodos.Width := 23;
fBtnMarcaTodos.Height := 23;
fBtnMarcaTodos.Left := 0;
fBtnMarcaTodos.Hint := 'Marcar todos';
fBtnMarcaTodos.ShowHint := true;
fBtnDesmarcaTodos := TButton.Create(Self);
fBtnDesmarcaTodos.Parent := fButtonsPanel;
fBtnDesmarcaTodos.Width := 23;
fBtnDesmarcaTodos.Height := 23;
fBtnDesmarcaTodos.Left := 23;
fBtnDesmarcaTodos.Hint := 'Desarcar todos';
fBtnDesmarcaTodos.ShowHint := true;
fBtnInveteSelecao := TButton.Create(Self);
fBtnInveteSelecao.Parent := fButtonsPanel;
fBtnInveteSelecao.Width := 23;
fBtnInveteSelecao.Height := 23;
fBtnInveteSelecao.Left := 46;
fBtnInveteSelecao.Hint := 'Inverter seleção';
fBtnInveteSelecao.ShowHint := true;
fLabelPanel := TPanel.Create(Self);
fLabelPanel.Parent := fBackGroundPanel;
fLabelPanel.Width := 33;
fLabelPanel.Align := alLeft;
fLabelPanel.ShowCaption := false;
fLabelPanel.BevelOuter := bvNone;
fLabel := TLabel.Create(Self);
fLabel.Parent := fLabelPanel;
fLabel.Top := 4;
fLabel.Left := 4;
fLabel.Caption := 'Filtro:';
fLabel.Width := 28;
fComboColunasPan := TPanel.Create(Self);
fComboColunasPan.Parent := fBackGroundPanel;
fComboColunasPan.ShowCaption := false;
fComboColunasPan.BevelOuter := bvNone;
fComboColunasPan.width := fComboColunasWidth;
fComboColunasPan.Align := alLeft;
fComboColunas := TDBIComboBox.Create(Self);
fComboColunas.Parent := fComboColunasPan;
fComboColunas.Text := '';
fComboColunas.OnEnter := PopulaComboColunas;
fComboColunas.OnChange := ComboChange;
fComboColunas.Style := csOwnerDrawFixed;
fComboColunas.Align := alClient;
fComboColunas.Hint := 'Colunas';
fComboColunas.ShowHint := true;
fSplitterColunas := TSplitter.Create(Self);
fSplitterColunas.Parent := fBackGroundPanel;
fSplitterColunas.Align := alLeft;
fSplitterColunas.Left := 1;
fComboOperadorPan := TPanel.Create(Self);
fComboOperadorPan.Parent := fBackGroundPanel;
fComboOperadorPan.ShowCaption := false;
fComboOperadorPan.BevelOuter := bvNone;
fComboOperadorPan.width := fComboColunasWidth;
fComboOperadorPan.Align := alLeft;
fComboOperador := TDBIComboBox.Create(Self);
fComboOperador.Parent := fComboOperadorPan;
// fComboOperador.Items.Add(cItensComboFiltro);
fComboOperador.Style := csOwnerDrawFixed;
fComboOperador.Align := alClient;
fComboOperador.Hint := 'Comparação';
fComboOperador.ShowHint := true;
fComboOperador.Text := ' = ';
fSplitterOperador := TSplitter.Create(Self);
fSplitterOperador.Parent := fBackGroundPanel;
fSplitterOperador.Align := alLeft;
fSplitterOperador.Left := 2;
fBtnAdcFiltroPan := TPanel.Create(Self);
fBtnAdcFiltroPan.Parent := fBackGroundPanel;
fBtnAdcFiltroPan.ShowCaption := false;
fBtnAdcFiltroPan.BevelOuter := bvNone;
fBtnAdcFiltroPan.width := 23;
fBtnAdcFiltroPan.Align := alRight;
fBtnAdcFiltro := TButton.Create(Self);
fBtnAdcFiltro.Parent := fBtnAdcFiltroPan;
fBtnAdcFiltro.Height := 23;
fBtnAdcFiltro.Width := 23;
fBtnAdcFiltro.Caption := '+';
fBtnAdcFiltro.Hint := 'Adicionar filtro...';
fBtnAdcFiltro.ShowHint := true;
fBtnAdcFiltro.OnClick := btnNewFilterClick;
fClientPanel := TPanel.Create(Self);
fClientPanel.Parent := fBackGroundPanel;
fClientPanel.ShowCaption := false;
fClientPanel.BevelOuter := bvNone;
fClientPanel.Align := AlClient;
fMaskEdit := TDBIMaskEdit.Create(Self);
fMaskEdit.Parent := fClientPanel;
fMaskEdit.Font.Size := 9;
fMaskEdit.Align := alTop;
end;
最佳答案
当您按从左到右的顺序将面板添加到背景面板时,在设置 Alignment
属性之前设置所添加面板的 Left
属性就足够了,设置为足够大的值,因此它超出了已放置在背景面板上的组件的 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;
产生此设计:
L1 .. L5 为 alLeft
对齐,C 为 alClient
对齐,R1 .. R2 为 alRight
对齐。
关于delphi - 如何在 TCustomControl 组件上正确创建 TSplitter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44077083/
有人可以解释一下哪个控件更适合创建自定义组件吗? twin control 和 tcustomcontrol 有什么区别? 先感谢您 最佳答案 Can someone please explain m
我正在编写一个基于 TCustomControl 的网格控件,这样我就可以自己处理所有结构、绘画和导航。我似乎无法弄清楚的是: 在我的构造函数中,我将 ControlStyle 设置为: Contro
我的 TCustomControl 后代使用线程,这涉及使用 InvalidateRect 进行无效化。我遇到这样的情况:当线程正在工作时关闭程序时,我不会停止 Destroy 中的线程,因为即使在进
很长一段时间,我在我的应用程序中使用了 TCustomPanel 类的后代,称为 MyContainer。我可以说是其他视觉控件的典型容器。一切都很好。有一天,我意识到我根本不使用面板功能,因此我可以
我有一个图形 TCustomControl 后代组件,其上有一个 TScrollBar。问题是,当我按箭头键移动光标时,整个 Canvas 都被绘制为背景颜色,包括滚动条的区域,然后滚动条被重新绘制,
如何创建一个行为类似于 Tpanel 的 TCustomControl?例如 MyCustomComponent,我可以将组件放入标签、图像等中。 最佳答案 诀窍是 TCustomPanel 中的这段
我创建了一个在 Canvas 上具有油漆覆盖的组件,我想设置最小宽度和高度的限制。当宽度或高度小于限制时,滚动条应该出现在侧面,就像滚动框一样,也可以滚动。 我选择 TCustomControl 是因
我创建了一个继承自TCustomControl的自定义控件,并发布了TControl的属性Align。但是,当我在 C++Builder 项目中使用此自定义控件时,它引发了异常 Project Lau
我创建了一个基于 TGraphicControl 的控件,该控件是透明的且大部分是空的。它实际上在线条艺术中实现了一个简单的符号。即TLFMagicControl = class(TGraphicCo
我正在使用一组现有的 TControl 设计一个新的 VCL 组件。控件放置在 TPanels 上,一些对齐到左侧位置,一个对齐到右侧位置,最后一个对齐到客户区。每个面板都有自定义组件作为其父级。 我
在 Delphi 5 中这曾经有效。我有一个源自 TCustomControl 的组件,并且我实现了 cmmouseleave 消息: procedure CMMouseLeave(var Messa
当我们创建一个组件作为自定义控件并将该控件放在面板上时,该控件始终显示在表单上而不是包含的控件上。如何在创建中设置自定义控件的父级,以便当按钮放在面板上时,按钮的父级就是面板? TGlassButto
如何创建 OnClick 事件?我需要有关 TCustomControl 的帮助。 最佳答案 OnClick 事件已在 TCustomControl 中定义。您所要做的就是让它可见。添加行 publi
我在 Delphi 2007 中让 TCustomControl 与透明度一起工作时遇到问题。我目前已将问题简化为下面的代码。问题是最初创建表单时,控件以相反的顺序绘制,它们被添加到表单中。当窗体被调
我创建了一个继承自 TCustomControl 的 Delphi 组件。该组件可以像从 TWinControl 继承一样获得焦点,但我需要在其获得焦点时“突出显示”,并在失去焦点时更改一些属性。正如
我是一名优秀的程序员,十分优秀!