を使用し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
クリックしたときにグリッドから a を削除することです (これが、上記のコードでオンクリック ハンドラーをグリッド パネルのハンドラーに設定した理由です)。
そのクリックハンドラーでこれを行います。これはほとんど機能します:
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()
と、グリッド内のパネルの順序が変更されます (1 番目と 2 番目の場所が入れ替わります)。
これを回避するには、列の idex をパネルのタグ プロパティに追加し、それを UpdateControlColumn() に渡します。これは機能しますが、パネルが削除されると、より高いタグ番号は無効になります - パネルは列を移動しました。
OnClick
では、ハンドラー 内からパネルが入っている列を取得するにはどうすればよいでしょうか?
私はDelphi 10.1 Berlinを使用しています-それが違いを生む場合。
これをテストするために、新しいプロジェクトを開始し、 を追加しTGridPanel
、1 行と 5 つの等幅の列を持つように設定しました。6 つTButton
のコントロールを追加OnClick
し、次のコードを使用してそれぞれのハンドラーを作成しました。
AddPanelToGrid('One'); // changing the string for each button.
いくつかのボタンをクリックしてパネルを追加し、パネルをクリックして削除します。