@Ingalime
1. если высота фрейма зависит от данных, то да, вычисляйте высоту
2. по расположению создаваемых фреймов друго под другом - самый простой вариант использовать свойство Align у фреймов (устанавить в Top), для этого размещайте создаваемые фреймы на общем контейнере для них (например на VertScrollBox)
условно говоря примерно так:
procedure TForm1.AddFrame(const AParent: TFmxObject; const AData: TFrameData);
var
LFrame: TMyFrame;
begin
LFrame := TMyFrame.Create(Self); // или nil, если в дальнейшем будете сами уничтожать фреймы
LFrame.Parent := AParent;
LFrame.Align := TAlignLayout.Top;
LFrame.Data := AData; // этим кодом предполагается заполнение фрейма данными, при котором фрейм заполнит выводимые компоненты и настроит свою высоту
end;
procedure TForm1.FillFrames;
var
I: Integer;
begin
for I := 0 to Data.Count - 1 do
AddFrame(vsbFrames, Data[I]); // vsbFrames - TVertScrollBox для размещения фреймов, Data - список данных для отображения, каждый элемент - данные для отдельного фрейма
end;