Woher hast du den das GridPanelLayout nicht auf einen Panel liegen darf ?
Ich mache es so das ich die Row/Col Grössen im Code manuell neu anlege, auf den Designer verlasse ich nicht mehr.
Das ist zwar mehr Arbeit, aber da weiss ich wenigstens was passiert und kann einigermassen debuggen.
Siehe unten ist ein Beispiel, auch ein Experiment von vielen, aber das funktioniert im Moment ganz gut ohne Probleme.
Delphi-Quellcode:
procedure TS4ImageViewKeyfield.Keyfield_Panel(iCols, iRows : Integer);
var
I: Integer;
btNew: TSpeedButton;
begin
if FGridPanelLayout.ColumnCollection.Count > 0 then
begin
Keyfield_Clear;
FGridPanelLayout.ControlCollection.Clear;
FGridPanelLayout.ColumnCollection.Clear;
FGridPanelLayout.RowCollection.Clear;
end;
//##
//## Create the Row and Column structures
//##
FGridPanelLayout.RowCollection.BeginUpdate;
try
if GIS4_DeviceInfo.IsTablet then
FGridPanelLayout.Height := iRows * 60 * 2
else
FGridPanelLayout.Height := iRows * 60;
for I := 0 to iRows-1 do
FGridPanelLayout.RowCollection.Add;
finally
FGridPanelLayout.RowCollection.EndUpdate;
end;
FGridPanelLayout.ColumnCollection.BeginUpdate;
try
for I := 0 to iCols-1 do
FGridPanelLayout.ColumnCollection.Add;
finally
FGridPanelLayout.ColumnCollection.EndUpdate;
end;
// Buttons
for I := 0 to (iCols*iRows)-1 do
begin
btNew := TSpeedButton.Create( FGridPanelLayout );
btNew.Parent := FGridPanelLayout;
btNew.Align := TAlignLayout.Client;
btNew.Margins.Left := 15;
btNew.Margins.Right := 15;
btNew.Margins.Top := 15;
btNew.OnApplyStyleLookup := EvOnApplyStyleLookup;
btNew.OnClick := EvOnClick;
btNew.Visible := False; // Initially all OFF, only enabled when Setup'd
btNew.Text := ''; //Format('Butti %d', [I+1]);
end;
end;
Rollo