AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Instanzenproblem

Ein Thema von Delbor · begonnen am 5. Jul 2021
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Instanzenproblem

  Alt 5. Jul 2021, 18:56
Delphi-Version: 10.4 Sydney
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 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