Собственно, тебе надо 2 вещи:
1. Создать массив ссылок на кнопки
2. Сделать процку, кторая их разместит по вертикали или горизонтали с учетом видимости.
Кстати, альтернативный вариант. Делать кнопки не невидимыми, а запрещенными (св-во Enabled). Тогда не придется их двигать.
А теперь к коду. Заполнение масива расчитано на то, что кнопки лежат на самой форме и являются TButton.
Код:
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FButtonList : TList;
procedure ReArrangeButtons(ASpace : Integer);
public
{ Public declarations }
end;
...
procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
begin
FButtonList := TList.Create;
For I := 0 To Self.ComponentCount-1 Do
If Self.Components[i] Is TButton Then
FButtonList.Add(Self.Components[i]);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FButtonList.Free;
end;
procedure TForm1.ReArrangeButtons(ASpace: Integer);
var
I : Integer;
ALeft : Integer;
begin
ALeft := ASpace; // Place of 1st button
For I := 0 To FButtonList.Count-1 Do
If TButton(FButtonList[i]).Visible Then
Begin
TButton(FButtonList[i]).Left := ALeft; // Place button
ALeft := ALeft + TButton(FButtonList[i]).Width + ASpace; // Calc left of next button
End;
end;