Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Instanzenproblem (https://www.delphipraxis.net/208262-instanzenproblem.html)

Delbor 5. Jul 2021 17:56

Delphi-Version: 10.4 Sydney

Instanzenproblem
 
Hi zusammen

Ich habe hier aktuell ein Programm in Arbeit, das mir den Inhalt von PDF-Dateien anzeigt, und zwar alle Seiten eines gewählten PDF-Dokumentes. Nebst der Komponente TPDF gibt es noch eine TPDFView, der eine Seite des Gesamtdokumentes zugewiesen werden kann(muss).
In der bisherigen Umsetzung Create ich für jede Seite ein solches TPDFView. Da die meisten PDF-Dokumente eine bis vielleicht fünf oder sechs Seiten gross sind, ist das in der Regel gerade noch knapp akzeptabel.
Anders sieht das aber aus, wenn ich eines meiner schlauen Bücher, die auf meiner Platte als PDF rumliegen, öffnen will - die haben dann schnell 200 Seiten, und genau soviele PDFViews werden dann createt. Und das dauert...

Daher sollten beim Öffnen eines PDFs nur gerade mal bis zu einer bestimmten Seitenanzahl eine feste Anzahl dieser Dinger createt werden. Um dies vielleicht etwas klarer zu formulieren:
Bei Erzeugung der Views wird dem Ding exakt eine Dokumentseite zugewiesen.
  • Bis zu einer Seitenanzahl 10(?) pro Dokument werden zehn oder entsprechend weniger TPDFView's erzeugt - pro Seite eines. Diese können in der Scrollbox normal gescrollt werden.
  • Enthält das Dokument mehrere Seiten, werden genau diese zehn PDFView's erzeugt.
  • Beim runterscrollen werden die Views, die nach oben aus dem Anzeigebereich verschwinden, geleert, per Index ans Ende der Liste verlegt und erhalten da eine 'neue letzte Seite'
  • Beim hochscrollen das gleiche, nur gerade umgekehrt.

Soweit meine Idee, wie ich es vermeiden kann, unnötig viele Seitenobjekte erzeugen zu müssen. Was mir jetzt noch fehlt, ist der zündende Funke zur Umsetzung.
Klar: die Hoehe des Views ist vorgegeben, wie das Codeschnipsel zeigt :
Delphi-Quellcode:
      FPdfView.PageNumber := i+1;
      FPdfView.Height := Round(FPdfView.PageHeight); // Hier sollten wohl die angegebenen Points
      FPdfView.Width := Round(FPdfView.PageWidth);  // in einer Funktionn in Pixel umgerechnet werden
Somit haben im Clientbereich der Scrollbox(dem Parent) eine bestimmmte Anzahl Views Platz, der Rest wird unsichtbar, geleert und entgegen der Scrollrichtung wieder 'angesetzt'. Genauer: die Views werden einer TObjectlist hinzugefügt und da per Index verschoben.

Meine bisherige Umsetzung, noch mit einem View pro Seite auch bei hohen Seitenzahlen:
Delphi-Quellcode:
procedure TRogersPdfFrame.PdfViewCreate2;
  var i, j : Integer;
begin
  if Pdf1.FileName <> Self.FPdfFileName then  // jetzt gesehen: ob das klug ist??                                       
  DeletePdfListObjects;                       // verunmöglicht direktes Neueinlesen
  if FPdfList.Count = 0 then
  begin
    LBxPdfText.Items.Clear;
    i := 0; j := 1;
    if PDF1.Active then
      PDF1.Active := False;
    Pdf1.FileName := Self.FPdfFileName;
    Pdf1.Active := true;
    while i < j do
    begin
      FPDFView := TPDFView.Create(Self);
      FPdfView.Parent := ScrBViewPdf;
      FPdfView.Name := 'PdfView'+intToStr(i);
      FPdfView.Pdf := Pdf1;
      FPdfView.Active := true;
      j := FPdfView.PageCount;
      FPdfView.PageNumber := i+1;
      FPdfView.Height := Round(FPdfView.PageHeight); // Hier sollten wohl die angegebenen Points
      FPdfView.Width := Round(FPdfView.PageWidth);  // in einer Funktionn in Pixel umgerechnet werden
      HomeOfficerFeMain.EdiPdfHeight.Text := FloatToStr(FPdfView.PageHeight);
      HomeOfficerFeMain.EdiPdfWidth.Text := FloatToStr(FPdfView.PageWidth);
      FPdfView.Top := i * (FPdfView.Height + 8);
      FPdfView.Left := (ScrBViewPdf.ClientWidth - FPdfView.Width) div 2;
      FPdfView.Visible := true;
      FPDFView.OnClick := FOnClick;
      FPdfView.OnMouseUp := Self.FOnMouseUp;
      FPdfView.OnMouseDown := Self.FOnMouseDown;
      FPdfView.OnMouseMove := Self.FOnMouseMove;
      FPdfView.OnPaint := Self.FFPDFViewOnPaint;
      FPdfList.Add(FPdfView);
      LBxPdfText.Items.Add(FPdfView.Name);
      LBxPdfText.Items.Add('FPdfView.PageCount := ' + IntToStr(FPdfView.PageCount));
      LBxPdfText.Items.Add('FPdfList.Count := ' + IntToStr(FPdfList.Count));
      LBxPdfText.Items.Add('FPdfList.Name := ' + FPdfView.Name);
      LBxPdfText.Items.Add('FPdfList.Height := ' + IntToStr(FPdfView.Height));

      LBxPdfText.Items.Add('');
      inc(i);
    end;
  end;
end;
Auch wenns mir jetzt so geht, wies öfters ist, dass mir jetzt beim Niederschreiben die Lösung schon fast in den Schoss gefallen ist: Wie würdet ihr das lösen?

Gruss
Delbor


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz