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