Seltsam ist an der unterschiedlichen Breite garnichts.
Bis zum 3. Control wird keine Scrollbar benötigt, ab dem 4. aber schon, damit ändern sich automatisch ein paar Werte, die bei der Breitenberechnung berücksichtigt werden.
Einfachste Methode zur Lösung: Scrollbar immer anzeigen, auch wenn sie nicht benötigt wird, dann ändert sich der Wert von Scrollbox1.ClientWidth auch nicht und bei der Berechnung kommt immer der gleiche Wert raus.
Oder eventuell:
Delphi-Quellcode:
procedure TRSPdfFrame.PdfViewCreate;
var
i : integer;
iCount : Integer;
iLeft : Integer;
iHeight : Integer;
iTop : Integer;
iWidth : Integer;
begin
if FPdfList.Count = 0 then
begin
iCount := 5; // Statt 0 bis 4 - 1 bis 5, damit kann man später besser weiterrechnen.
iLeft := (ScrollBox1.ClientWidth - iWidth) div 2;
iHeight := 120;
iTop := iHeight + 8;
iWidth := Scrollbox1.ClientWidth - 40;
for i := 1 to iCount do
begin
FPDFView := TPdfView.Create(Self);
FPdfView.Parent := Scrollbox1;
FPdfView.Name := Format('PdfView%d',[i]);
FPdfView.Color := clyellow;
FPdfView.Height := iHeigth;
FPdfView.Top := i * iTop;
FPdfView.Width := iWidth;
FPdfView.Left := iLeft;
FPdfList.Add(FPdfView);
end;
ScrollBox1.VertScrollBar.Range := iCount * iHeight;
end
else
Showmessage('Die Seiten sind bereits vorhanden');
end;
Und wenn man die hier im Quelltext zugewiesenen "Konstanten" als Parameter in den Aufruf von Create "verschiebt", kann man, ohne die Methode nochmal anfassen zu müssen, die Zahl der FPdfView in der Scrollbox variieren, deren Breite, Höhe und ggfls. deren "Oberkante" (Top) verändern ... Dies könnte man aber auch als Attribute der Klasse TRSPdfFrame realisieren.