Una primera aproximación sería crear los botones en sus posiciones e irlos visualizando conforme se necesiten.
Te muestro una clase que crea los botones ordenados con los caption de las mesas correspondientes, en este caso son 5 filas de 5 mesas cada una pero puedes poner las que quieras:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TButtons = class
private
Owner: TWinControl;
nRows: integer;
nCols: integer;
Buttons: array of TButton;
public
constructor Create(AOwner: TWinControl);
destructor Destroy; override;
procedure SetButtons(Rows, Cols: integer);
procedure SetOnClick(OnClick: TNotifyEvent);
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure ButtonClick(Sender: TObject);
private
Buttons: TButtons;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TButtons.Create(AOwner: TWinControl);
begin
inherited Create;
Owner:= AOwner;
end;
destructor TButtons.Destroy;
begin
SetLength(Buttons, 0);
inherited Destroy;
end;
procedure TButtons.SetButtons(Rows, Cols: integer);
var
i, Count: integer;
begin
nRows:= Rows;
nCols:= Cols;
Count:= Rows*Cols;
SetLength(Buttons, Count);
for i:= 0 to Count-1 do
begin
Buttons[i]:= TButton.Create(Owner);
Buttons[i].Caption:= IntToStr((i div Cols + 1)*10 + (i mod Cols) + 1);
Buttons[i].Top:= Buttons[i].Height*(i mod Cols);
Buttons[i].Left:= Buttons[i].Width*(i div Cols);
Buttons[i].Parent:= Owner;
end;
end;
procedure TButtons.SetOnClick(OnClick: TNotifyEvent);
var
i, Count: integer;
begin
Count:= nRows * nCols;
for i:= 0 to Count-1 do
Buttons[i].OnClick:= OnClick;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Buttons:= TButtons.Create(self);
Buttons.SetButtons(5,5);
Buttons.SetOnClick(ButtonClick);
end;
procedure TForm1.ButtonClick(Sender: TObject);
begin
MessageBox(Handle, PCHAR(TButton(Sender).Caption), 'hola', 0);
end;
end.
Saludos.