![]() |
Delphi-Version: XE8
Verständnisfrage Vorwärtsdeklaration
Liste der Anhänge anzeigen (Anzahl: 2)
Hi zusammen
Folgende Deklaration im PDFiumFrame:
Delphi-Quellcode:
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:
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>; ... Zitat:
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 ![]() Gruss Delbor |
AW: Verständnisfrage Vorwärtsdeklaration
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. |
AW: Verständnisfrage Vorwärtsdeklaration
Hi mischerr
Zitat:
Gruss Delbor |
AW: Verständnisfrage Vorwärtsdeklaration
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. |
AW: Verständnisfrage Vorwärtsdeklaration
Hi Himitsu
Nachfolgend die ersten Deklarationszeilen des Frames:
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
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...
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; Gruss Delbor |
AW: Verständnisfrage Vorwärtsdeklaration
Wo findet man denn die Original-Unit? Ich habe so das Gefühl, dass Du etwas zu implementieren versuchst, was Du gar nicht brauchst.
|
AW: Verständnisfrage Vorwärtsdeklaration
Hi DeddyH
Das Original findet sich ![]() 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 |
AW: Verständnisfrage Vorwärtsdeklaration
(ungetestet) eher so:
Delphi-Quellcode:
geht nicht:
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;
Delphi-Quellcode:
muss so sein:
type
TForm1 = class(TForm) private { Private-Deklarationen } type tx = class private f : Integer; end; fx : tx; public { Public-Deklarationen } end;
Delphi-Quellcode:
type
tx = class private f : Integer; end; type TForm1 = class(TForm) private { Private-Deklarationen } fx : tx; public { Public-Deklarationen } end; |
AW: Verständnisfrage Vorwärtsdeklaration
Hallo,
ich mache mal lieber ein einfacheres Bsp.
Delphi-Quellcode:
Ich kann in TClass1 also schon TClass2 benutzen, obwohl TClass2 nicht vollständig definiert ist.
type
TClass2 = class; // Forward TClass1 = class Class2: TClass2; end; TClass2 = class Class1: TClass1; end; Und wie es schon bereits gesagt wurde, muss das alles im gleichen type sein. |
AW: Verständnisfrage Vorwärtsdeklaration
Delphi-Quellcode:
Die Klassenvervollständigung ergibt dann folgende Methode:
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;
Delphi-Quellcode:
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.
procedure TFormTest.TDings.Wuppdi;
begin end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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