Einzelnen Beitrag anzeigen

Delbor

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

AW: Privat deklarierte Klasse ableiten

  Alt 18. Nov 2017, 13:06
Hi TBx

So auf den ersten Blick fürchte ich, dass das, was ich vorhabe, deinem ersten Beispiel entspricht, zumal unter dem Nastly-Link auch ein Classhelper eingesetzt wird. Daher mal die Deklaration des PDFiumFrames:
Delphi-Quellcode:
 TPDFiumFrame = class(TFrame)
  private
    { 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
    FDocument : HPDFDocument;
    ......
Und der durch mich erweiterte Teil:
Delphi-Quellcode:
  public
    { Déclarations publiques }
    type
      TPDFCustomDocumentPage = class(TPDFPage) // Die fragliche Klasse.
        private
        public
      end;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Invalidate; override;
    procedure LoadFromMemory(APointer: Pointer; ASize: Integer);
    procedure LoadFromStream(AStream: TStream);
    procedure LoadFromFile(const AFileName: string);
    procedure ClearSelection;
    function PageLevelZoom: Single;
    function PageWidthZoom: Single;
    property Document: HPDFDocument read FDocument;
    property PageIndex: Integer read FPageIndex;
    property PageCount: Integer read FPageCount;
    property Zoom: Single read FZoom write SetZoom;
    property ZoomMode: TZoomMode read FZoomMode write SetZoomMode;

    // Erweitert durch mich
    Property PDFPageList: TList read FPages; // Dieses Property erlaubt mir von aussen (Mainform) den Zugriff auf die Items(PDF-Seiten und deren Abmessungen)
  end;

Und die Mainform deklariert dann eine kompatible Klassenvariable, zum Beispiel nur Lokal, um auf die von PDFium.PDFPageList zurückgegeben PDFSeite, bzw deren Handle, zugreifen zu können:
Delphi-Quellcode:
procedure TSynpdfMain.PDFiumFrame1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var SP, FP :TPoint; XF : Integer; PdfPage : TPDFiumFrame.TPDFCustomDocumentPage;
begin
  PdfPage := TPdfPage.Create(Owner);

Mit einem Classhelper würde dies wohl so ausehen:

Delphi-Quellcode:
  public
    { Déclarations publiques }
    type
      TPDFPageHelper = class(TPDFPage)
        private
        public
        function GetPage(Index: Integer) : TPDFPage;
        Property PDFPageList: TList read FPages;
      end;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
...
    property Zoom: Single read FZoom write SetZoom;
    property ZoomMode: TZoomMode read FZoomMode write SetZoomMode;
  end;
Wobei dieser Code immer noch im Frame steht. Ausserhalb, also in der Mainform, brauche ich einen kompatiblen Datentyp. Im Falle der Funktion müsste dies eine Klassenvariable (oder eine Instanz?) vom Typ TPDFPage sein. Das ist aber nicht möglich, da in der Unit SynPDF eine Klasse TPDFPage deklariert ist, die aber von TPDFDictionary abgeleitet und somit ganz anders aufgebaut 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 (18. Nov 2017 um 13:22 Uhr) Grund: Irgendwie hab ich beim Editieren wohl eine falsche Taste erwischt, und so wurde der Beitrag vorzeitig abgeschickt
  Mit Zitat antworten Zitat