AGB  ·  Datenschutz  ·  Impressum  







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

Verständnisfrage Vorwärtsdeklaration

Ein Thema von Delbor · begonnen am 6. Dez 2017 · letzter Beitrag vom 8. Dez 2017
Antwort Antwort
Seite 1 von 2  1 2      
Delbor

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

Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 13:33
Delphi-Version: XE8
Hi zusammen

Folgende Deklaration im PDFiumFrame:
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; // Sollte die Vorwärtsdeklaration sein
 
// 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>;
...
Die Deklaration der Klasse TPDFPage habe ich in den public-Abschnitt verschoben, um von der Mainform aus darauf zugrreifen zu können. Da jedoch einige Felder des Frames vom Typ dieser Klasse sind, muss iich diese per Vorwärtsdeklaration bekannt machen, bevor die entsprechenden Felder eingeführt werden. Das Problem ist nur: Delphi meint:

Zitat:
[dcc32 Fehler] PDFium.Frame.pas(48): E2086 Typ 'TPDFiumFrame.TPDFPage' ist nicht vollständig definiert
Ich hab schonmal versucht, diese Deklaration in den public-Teil zu verschieben, wasaber zu sehr seltsamen Konstrukten führte - im Anhang zeigt ein Jpeg, wie das ausgesehen hat. Man beachte Zeile 5 und folgende unterhalb der blau markierten Zeile.
Das Embarcadero-Wiki hat mir dann verraten, das ich die Vorwärzsdeklaration mit einem Semikolon hätte abschliessen müssen.
Was nun diesmal der Grund für Delphis Meckerei ist, hab ich schlicht keine Ahnung.

Das Jpeg 'Vorwärtsdeklaration zeigt, wo ich diese anbringen wollte. Wenn ich ein end darunter schreibe, ist der Bezeichner TPDFPage unbekannt, ohne dieses end ist die Deklaration unvollständig...

Was, zum Kuckuck, mache ich falsch? Nach dieser Seite offenbar nichts. Und trotzdem meckert Delphi!

Gruss
Delbor
Miniaturansicht angehängter Grafiken
16_54_37-synpdf-master_pdfium.frame.pas.jpg   13_18_55-synpdf-master_pdfium.frame-vorwaertsdeklaration.jpg  
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
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#2

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 13:53
Hallo,

ich glaube mich zu erinnern das die Vorwärtsdeklaration der Klasse im selben Type-Abschnitt wie die endgültige Klassendeklaration stehen muss.
Eine Mischung Public/Private dürfte daher nicht funktionieren.
  Mit Zitat antworten Zitat
Delbor

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

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 14:19
Hi mischerr
Zitat:
Eine Mischung Public/Private dürfte daher nicht funktionieren.
Das ist der Punkt, an dem ich die Emba-OnlineHelp nicht richtig verstanden habe.

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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 14:41
Ich habe auch nie probiert, ob Forward-Deklarationen als Sub-Class möglich sind. (innerhalb einer anderen Klasse)

Aber sonst stimmt die bereits genannte Aussage.
Forward-Deklarationen sind nur innerhalb des selben Type-Blocks möglich, also auch nur innerhalb der selben Unit.

Wo ist hier überhaupt TPDFPage eigentlich deklariert?
Ich seh nur den Forward.


Ich kenn sonst nur eine Ausnahme.
Deklaration von Pointer-Typen, da kann die Deklaration des Pointers nach oder auch vor dem eigentlich Typ stehen, aber davor auch nur innerhalb des selben Type-Blocks.
$2B or not $2B

Geändert von himitsu ( 6. Dez 2017 um 14:46 Uhr)
  Mit Zitat antworten Zitat
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, 15: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 15:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 16:09
Wo findet man denn die Original-Unit? Ich habe so das Gefühl, dass Du etwas zu implementieren versuchst, was Du gar nicht brauchst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delbor

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

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 16:32
Hi DeddyH

Das Original findet sich hier (SynPDF.zip).
Das ding ist zur Anzeige eigentlich voll funktionsfähig - nur, dass eben keine Nvigationsbar vvorhanden ist, wie man das von gängigen PDF-Programmen kennt.

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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#8

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 17:02
(ungetestet) eher so:
Delphi-Quellcode:
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;

  TPDFiumFrame = class(TFrame)
  private
    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;
geht nicht:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    type
      tx = class
      private
      f : Integer;
    end;
    fx : tx;
  public
    { Public-Deklarationen }
  end;
muss so sein:
Delphi-Quellcode:
type
  tx = class
  private
  f : Integer;
end;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    fx : tx;
  public
    { Public-Deklarationen }
  end;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 17:03
Hallo,
ich mache mal lieber ein einfacheres Bsp.

Delphi-Quellcode:
type
  TClass2 = class; // Forward

  TClass1 = class
    Class2: TClass2;
  end;

  TClass2 = class
    Class1: TClass1;
  end;
Ich kann in TClass1 also schon TClass2 benutzen, obwohl TClass2 nicht vollständig definiert ist.
Und wie es schon bereits gesagt wurde, muss das alles im gleichen type sein.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 18:19
Delphi-Quellcode:
type
  TFormTest = class(TForm)
  private
    { Private-Deklarationen }
    type
      TDings = class
      private
        FBums: integer;
      public
        procedure Wuppdi;
        property Bums: integer read FBums write FBums;
      end;
  private
    FDings: TDings;
  public
    { Public-Deklarationen }
  end;
Die Klassenvervollständigung ergibt dann folgende Methode:
Delphi-Quellcode:
procedure TFormTest.TDings.Wuppdi;
begin

end;
Der Sinn dahinter ist, dass man die Nested Klasse lediglich innerhalb der Oberklasse benötigt und auch nur dort verwenden soll. Im Übrigen habe ich im verlinkten Archiv nirgends eine Klasse TPDFiumFrame finden können, daher kann ich auch nicht mehr dazu sagen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:29 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