我正在使用 aTGridPanel
来容纳一些面板。在设计时,我将网格面板设置为 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;
使用参数 forUpdateControlColumn()
会导致网格中面板的顺序发生变化 - 第一个和第二个交换位置。
我可以通过将列索引添加到面板的标记属性来解决这个问题,然后将其传递给 UpdateControlColumn()。这样就可以了,但是一旦面板被移除,更高的标签号就不再有效 - 面板已经移动了列。
那么,如何从OnClick
处理程序中获取面板所在的列?
我正在使用 Delphi 10.1 Berlin - 如果这有什么不同的话。
为了测试这一点,我开始了一个新项目,添加了一个TGridPanel
,将其设置为 1 行和 5 个等宽的列。我添加了 6 个控件并使用以下代码为每个TButton
控件创建了一个处理程序:OnClick
AddPanelToGrid('One'); // changing the string for each button.
单击几个按钮以添加一些面板,然后单击面板将其删除。