![]() |
Delphi-Version: XE8
2 PDFium-Frames synchronisieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen
Von ![]() Trotzdem sticht mich der Hafer, und so will ich das um eine Sidebar erweitern, die eine Übersicht über die in der PDF-Darei vorhandenen Seiten bietet. Halt etwa so, wie es in den gängigen PDF-Programmen der Fall ist. Das klappt soweit - nur sollte ein Klick auf eine der Seiten in der Sidebar nun auch die entsprechende Seite im Hauptfenster anzeigen. Das klappt schon fast. Bis halt auf die Tatsache, dass dabei die Originalgrössen des PDFs berücksichtigt werden. Das führt dazu, das ein Klich auf Seite1 zwar auch diese zurückgibt, aber erst ein Klick auf Seite 4 in der Sidebar meldet eine andere Seite. Ein klassisches ScreenToClient/ClientToScreen-Problem halt. Nur - um diese Methoden einsetzen zu können, bräuchte ich die Originalabmessungen der PDF-Seiten. Und wie ich die kriege, hab ich bislang nicht herausgefunden. Meine bisherigen Versuche:
Delphi-Quellcode:
Die ersten 4 Zeilen laden das PDF in je einen Frame. Allerdings - in beiden Frames werden die PDFs übergross dargestellt, also nicht an die verfügbare Seitenbreite(Clientbereich) angepasst. Erst über den Button in der Werkzeugleiste kriege ich es hin, dass beide PDFs sich an den jeweiligen Clientbereich anpassen (siehe Anhang).
procedure TSynpdfMain.BtnFileOpenClick(Sender: TObject);
var PIndex : integer; PageHandle : THandle; PDFPage : TPDFPage; begin if Opendialog1.Execute then begin Self.PDFiumFrame1.LoadFromFile(Opendialog1.FileName); Self.PDFiumFrame1.ZoomMode := zmPageWidth; //zmCustom; HPDFPage; Self.PDFiumFrame2.LoadFromFile(Opendialog1.FileName); Self.PDFiumFrame2.ZoomMode := zmPageWidth; // <-- for PIndex := 0 to PDFiumFrame2.PageCount -1 do begin PDFPage := PDFiumFrame2.PageCount[PDFiumFrame2.PageIndex]; PageHandle := PDFiumFrame2.PageCount[PIndex]; // Memo1.Lines.Add('PDFiumFrame2.Pages[PageIndex]).PageWidth))' +IntToStr(PDFiumFrame2.PageCount[PIndex]).h)); Memo1.Lines.Add('PDFiumFrame2.Pages[PageIndex]).PageWidth))' +IntToStr(PDFPage.PageWidth)); Memo1.Lines.Add('PDFiumFrame2.Pages[PageIndex]).PageHeight))' +IntToStr(PDFPage.PageHeight)); end; // Self.PDFiumFrame2 end; Button3Click(Sender); //mnFitWidthClick(Sender); := Self.PDFiumFrame1. end; Innerhalb der Schleife wird ein Kompilierungsversuch schon bei der ersten Zeile abgebrochen. Die Fehlermeldung: Arraytyp erfforderlich. Die selbe Fehlermeldung steht gleich darunter für Zeile 2. Die Deklarationen im Publicteil des PDFiumFrames:
Delphi-Quellcode:
Die Funktion GetPage des Frames (Opensource):
property PageIndex: Integer read FPageIndex;
property PageCount: Integer read FPageCount;
Delphi-Quellcode:
Die Funktion ist übrigens kein Getter eines Page-Propertys. Ich wollte dem Frame ein solches verpassen, aber da wird ein Kompilerungsversuch abgebrochen mit der etwas lapidaren Fehlermeldung: "Inkompatible Typen", ohne dass dabei die beiden Datentypen aufgeführt werden.
function TPDFiumFrame.GetPage(PageIndex: Integer): TPDFPage;
var Index :Integer; begin for Index := 0 to FPages.Count - 1 do begin Result := FPages[Index]; if Result.Index = PageIndex then Exit; end; Result := TPDFPage.Create; FPages.Add(Result); Result.Index := PageIndex; Result.Handle := FPDF_LoadPage(FDocument, PageIndex); end; Was mache ich falsch? Gruss Delbor |
AW: 2 PDFium-Frames synchronisieren
Delphi-Quellcode:
PDFiumFrame2.PageCount[PDFiumFrame2.PageIndex];
Das kann doch nicht funktionieren, wenn PageCount nur ein Integer-Wert ist. Müsste hier nicht PDFiumFrame2.GetPage(xxx), PDFiumFrame2.Pages[xxx] o.ä. aufgerufen werden? |
AW: 2 PDFium-Frames synchronisieren
Hi bra
Zitat:
Und letzteres geht auch nicht, da mit 'PDFiumFrame2.Pages' ein Property angesprochen würde
Gruss Delbor |
AW: 2 PDFium-Frames synchronisieren
Kann man da nicht über PDFiumFrame2.Page zugreifen? Und mit PDFiumFrame2.First/PDFiumFrame2.Next wechselt man die Seiten?
|
AW: 2 PDFium-Frames synchronisieren
Hi bra
Nein, leider ist das nicht so einfach - sowas wäre im Rahmen der Delphi-OOP ja auch schon logisch. Aber dem Programmm liegt die pdfium.dll zugrunde. Und die ist meines Wissens in C oder C++ programmiert. Aber ich habe ![]() Laut dieser Doku muss erst das Dokument geladen werden und anschliessend die darin enthaltenen Seiten. Wobei dies eigentlich genau das ist, was ich nicht tun wollte. Eine meiner ersten Regungen war, in der Sidebar eine Scrollbox zu platzieren, darauf verschiedene Panels mit je einem PDFium-Frame anzuordnen und in jeden dieser Frames eine Seite des PDF-Dokumentes zu laden. Das habe ich wieder verworfen, da die Panels vollkommen überflüssig wären, wenn mir die Kooordinaten der Seiten bekannt wären. Andrerseits wiederstrebte es mir, das PDF-Dokument und die einzelnen Seiten separat zu laden - das Beispielprogramm lädt von Haus auf auch nur gerade das Dokument, nicht aber die zugehörigen Seiten. Trotzdem kann man beliebig zwischen diesen Seiten hin- und herscrollen, auch per Mausrad. Und da war natürlich mein Gedanke: wozu etwas laden, das ohnehin schon da ist... Ach ja - gerade habe ich dies in meinem ersten Beitrag gesehen: Zitat:
Gruss Delbor |
AW: 2 PDFium-Frames synchronisieren
Hi zusammen
Um mir die Abläufe während des Kompilierens im Nachhinein anzeigen zu können, hab ich mir mal was mit einer Stringliste gebastelt, deren Einträge der Destruktor vor dem Beendem in eine Datei speichert. Das Resultat: Zitat:
Die Funktion gibt folgendes zurück:
Delphi-Quellcode:
Dass diese Funktion aufgerufen wird, beweist: Die Seiten sind innerhalb des Frames vorhanden - sie also nochmal zu laden, wäre völliger Quatsch. Dem Frame ein Property Page zu verpassen, war also eben doch der richtige Weg. Nur, um mich mal selbst zu zitieren:
Result.Index := PageIndex;
Result.Handle := FPDF_LoadPage(FDocument, PageIndex); Zitat:
Delphi-Quellcode:
Property PDFPage : TPDFPage read GetPage;
Das Result der Funktion GetPage allerdings:
Delphi-Quellcode:
Das heisst, der Frame erzeugt ein TPDFPage-Object und gibt diese in Result zurück, nachdem er dem Objekt den Index und das Handle zugewiesen hat.
Result := TPDFPage.Create;
FPages.Add(Result); Result.Index := PageIndex; Result.Handle := FPDF_LoadPage(FDocument, PageIndex); Ist meine Property-Deklaration falsch? Gruss Delbor PS: Ja, sie war falsch. So ist es besser, bzw. wird akzeptiert:
Delphi-Quellcode:
Property PDFPages : TList read FPages;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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