我正在使用 TGridPanel
来保存一些面板。在设计时,我将网格面板设置为 1 行 5 列。
我可以使用此代码向网格添加一个面板,效果很好:
procedure TForm6.AddPanelToGrid(const ACaption: string);
var
pnl: TPanel;
begin
pnl := TPanel.Create(gpOne);
pnl.Caption := ACaption;
pnl.Parent := gpOne;
pnl.Name := 'pnlName' + ACaption;
pnl.OnClick := gpOne.OnClick;
pnl.ParentBackground := false;
pnl.ParentColor := false;
pnl.Color := clLime;
pnl.Font.Size := 14;
gpOne.ControlCollection.AddControl(pnl);
pnl.Height := pnl.Width;
end;
我想要做的是当我点击它时从网格中删除TPanel
(这就是为什么我在上面的代码中将点击处理程序设置为网格面板的处理程序)。
在该点击处理程序中,我执行此操作,几乎有效:
procedure TForm6.gpOneClick(Sender: TObject);
begin
if not (sender is TPanel) then exit;
gpOne.ControlCollection.RemoveControl(Sender as TPanel);
(Sender as TPanel).Free;
gpOne.UpdateControlsColumn( 0 ); <<<-------
gpOne.UpdateControlsRow(0);
gpOne.Refresh();
end;
使用 UpdateControlColumn()
参数会导致网格中面板的顺序发生变化 - 第一个和第二个交换位置。
我可以通过将列 idex 添加到面板的标记属性中来解决此问题,然后将其传递给 UpdateControlColumn()。这样就可以工作了,但是一旦删除了面板,较高的标签编号就不再有效 - 面板已移动列。
那么,如何从 OnClick
处理程序中获取面板所在的列?
我正在使用 Delphi 10.1 Berlin - 如果这有什么区别的话。
为了测试这一点,我启动了一个新项目,添加了一个 TGridPanel
,将其设置为具有 1 行和 5 个等宽的列。我添加了 6 个 TButton
控件,并使用以下代码为每个控件创建了一个 OnClick
处理程序:
AddPanelToGrid('One'); // changing the string for each button.
单击几个按钮添加一些面板,然后单击面板将其删除。
最佳答案
TCustomGridPanel 有一对有用的函数,CellIndexToCell()
和 CellToCellIndex
,但它们不是公共(public)的,因此不能从 TGridPanel 直接访问。
为了使它们可用,请重新声明 TGridPanel
,如下所示:
type
TGridPanel = class(Vcl.ExtCtrls.TGridPanel) // add this
end; // -"-
TForm27 = class(TForm)
Button1: TButton;
gpOne: TGridPanel;
...
end;
然后为 row 和 col 添加 r
和 c
变量,添加对 CellIndexToCell()
的调用并使用 c
作为 UpdateControlsColumn
的参数:
procedure TForm27.gpOneClick(Sender: TObject);
var
r, c: integer;
begin
if not (sender is TPanel) then exit;
gpOne.CellIndexToCell(gpOne.ControlCollection.IndexOf(Sender as TPanel), c, r); // add this
gpOne.ControlCollection.RemoveControl(Sender as TPanel);
(Sender as TPanel).Free;
gpOne.UpdateControlsColumn( c ); // <<<-------
gpOne.UpdateControlsRow(0);
gpOne.Refresh();
end;
并遵循 Remy Lebeau 关于释放面板的建议。 (我刚刚注意到他的评论)。
<小时/>如果您还没有了解过,您可能还想了解一下 TFlowPanel
及其 FlowStyle
属性。如果您使用多行,TflowPanel
删除后重新排序更容易预测,但这当然取决于您的需要。
关于delphi - 获取 TGridPanel 中单击的控件的列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38977196/