Einzelnen Beitrag anzeigen

Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Mehrere Hundert Images (Seitenminiaturen)

  Alt 11. Nov 2016, 19:04
Ich habe einen Ergebnislister, der ähnlich wie Adobe pdf Reader Seitenminiaturen anzeigt. Im Beispiel habe ich 316 Seiten, was 316 Images mit Bitmaps 210 x 279 (183 kB) bedeutet.
Das Problem ist, daß nach 188 Images Schluß ist und das Onklick nur bis Seite 94 funktioniert.

Ist das ein Speicherproblem und /oder kann eine Scrollbox nicht ca. 100.000 Pixel hoch sein?

Erzeugen tue ich folgendermaßen:
Delphi-Quellcode:
procedure TViewerForm.FormCreate(Sender: TObject);
var
  I, ATop: integer;
  AImage: TImage;
  ALabel: TLabel;
begin
  FFileName := TStrUtils.ExcludeQuotes(ParamStr(1));

  FViewer := TViewer.Create(FFileName);
  FPlot.CanvasStyle := csDefault;
  SetBounds(50, 50, Min(FPlot.CanvasWidth(210 + 10) + ScrollBox.Left, Screen.WorkAreaWidth - 100),
    Min(FPlot.CanvasHeight(297), Screen.WorkAreaHeight - 100));
  FStretch := FPlot.ppMM / FViewer.ppMM;
  FZoom := 100 * FStretch;
  PaintBox.Width := Round(FStretch * FViewer.Width);
  PaintBox.Height := Round(FStretch * FViewer.Height);

  ThumbPanel.Height := FViewer.Count * (297 + 20 + 30) + 20; // zzgl. je Rand oben/unten;
  ATop := 20;
  for I := 0 to FViewer.Count - 1 do
  begin
    AImage := TImage.Create(ThumbPanel);
    AImage.Name := Format('Image%d', [I]);
    AImage.Parent := ThumbPanel;
    AImage.Tag := I;
    AImage.Left := 10;
    AImage.Width := 210;
    AImage.Height := 297;
    AImage.Top := ATop;
    FViewer.LoadThumbFromFile(I);
    AImage.Picture.Assign(FViewer.Thumb);
    AImage.Cursor := crHandPoint;
    AImage.OnClick := LabelClick;

    ALabel := TLabel.Create(ThumbPanel);
    ALabel.Name := Format('Label%d', [I]);
    ALabel.Parent := ThumbPanel;
    ALabel.Tag := I;
    ALabel.Font.Name := 'Segoe UI';
    ALabel.Font.Size := 8;
    ALabel.Font.Color := clBlack;
    ALabel.Font.Style := [fsUnderline];
    ALabel.Caption := IntToStr(I + 1);
    ALabel.Top := AImage.Top + AImage.Height + 10;
    ALabel.Left := 10 + (AImage.Width - ALabel.Width) div 2;
    ALabel.Cursor := crHandPoint;
    ALabel.OnClick := LabelClick;

    Inc(ATop, 297 + 20 + 30);
  end;
end;
  Mit Zitat antworten Zitat