![]() |
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.
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:
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.
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 Meine bisherige Umsetzung, noch mit einem View pro Seite auch bei hohen Seitenzahlen:
Delphi-Quellcode:
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?
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; Gruss Delbor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz