Einzelnen Beitrag anzeigen

Delbor

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

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 14:50
Hi Himitsu

Nachfolgend die ersten Deklarationszeilen des Frames:

Delphi-Quellcode:
  TPDFiumFrame = class(TFrame)
  private
// protected
    { Déclarations privées }
    type
      // One point is 1/72 inch (around 0.3528 mm).
      
      TPointsSize = record
        cx : Double;
        cy : Double;
      end;
 
      TRectD = record
        Left : Double;
        Top : Double;
        Right : Double;
        Bottom : Double;
      end;
 
  TPDFPage = class
   Index : Integer;
    Handle : HPDFPage;
   Top : Double;
    Rect : TRect;
    Text : HPDFTextPage;
    NoText : Boolean;
    Visible : Integer;
    SelStart : Integer;
    SelStop : Integer;
    Selection: TArray<TRectD>;
    destructor Destroy; override;
    function HasText: Boolean;
    function CharIndex(x, y, distance: Integer): Integer;
    function CharCount: Integer;
    function Select(Start: Integer): Boolean;
    function SelectTo(Stop: Integer): Boolean;
    function ClearSelection: Boolean;
    procedure DrawSelection(DC, BMP: HDC; const Blend: TBlendFunction; const Client: TRect);
  end;

 private
// protected
    FDocument : HPDFDocument;
    FError : Integer;
    FPageCount: Integer;
    FPageSize : TArray<TPointsSize>;
    FTotalSize: TPointsSize;
    FPages : TList;
    FReload : Boolean;
    FPageIndex: Integer;
...
    FCurPage : TPDFPage;
    FSelPage : TPDFPage;
    FSelStart : Integer;
    FSelBmp : TBitmap;
    FInvalide : Boolean;
    FReportList: TStringlist;
    FGetPageAt : Integer;
  {$IFDEF TRACK_CURSOR}
    FCharIndex: Integer;
    FCharBox : TRectD;
  {$ENDIF}
    procedure SetDocument(Value: HPDFDocument);
    procedure SetPageCount(Value: Integer);
...
    property _Document: HPDFDocument read FDocument write SetDocument;
    procedure ClearPages;
    function GetPage(PageIndex: Integer): TPDFPage;
    function GetPageAt(const p: TPoint): TPDFPage;
    procedure LoadVisiblePages; //<===
    procedure WMEraseBkGnd(var Msg: TMessage); message WM_ERASEBKGND;
    procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
    procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  protected
    procedure PaintWindow(DC: HDC); override; //<===
    procedure Resize; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint): Boolean; override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure SetPageIndex(Value : Integer);
  public
    { Déclarations publiques }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
In dem als Navigationsbar dienenden Frame werden immer mehrere Seiten angezeigt - im Normalfall, wenn das Fenster die selbe Grösse wie im Entwurfsmodus hat, etwa drei. Diese Seiten darzustellen, ist LoadVisiblePages zuständig.Diese Prozedur wird von Paintwindow aufgerufen, die die Liste FPages(TList) durchläüft und in diesem Block die Seite rendern lässt:
Delphi-Quellcode:
    if Page.Visible > 0 then
    begin
      FillRect(DC, Page.Rect, WHITE);
      SynpdfMain.Memo1.Lines.Add('Page.Visible > 0 / ' + IntToStr(Index));
      FPDF_RenderPage(DC, Page.Handle, Page.Rect.Left, Page.Rect.Top, Page.Rect.Width, Page.Rect.Height, 0, 0);
      Page.DrawSelection(DC, SelDC, Blend, Client);
    end;
Das heisst nichts anderes, als: ich muss nur den Index der Seite wissen, auf die ich geklickt habe. Und da sehe ich das Problem, zumindest ohne Zugriff auf die Klasse TPDFPage. Übrigens: diese Klasse gibt es so nur im PDFiumFrame - ausserhalb ist auch eine Klasse diesen Namens bekannt, die aber von TPDFDictonary abgeleitet ist...


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 6. Dez 2017 um 14:53 Uhr)
  Mit Zitat antworten Zitat