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 2 von 2     12   
Delbor

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

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 18:06
Hi zusammen

Ich habe die Deklaration nochmal etwas abgeändert, so dass es für mich 'schon eher nachDelphi aussieht':
Delphi-Quellcode:
uses
 ...
const PAGE_MARGIN = 5; // pixels
  
type
  TZoomMode = (zmCustom,zmActualSize, zmPageLevel, zmPageWidth);
    
    TPointsSize = record
 ...
    end;
 
    TRectD = record
...
    end;
 
  TPDFPage = class
   Index : Integer;
    Handle : HPDFPage;
 ...
  end;
  
  TPDFiumFrame = class(TFrame)
  private
    { Déclarations privées }
{Hier waren TPointsSize, TRectD und TPDFPage deklarirt} 
 private
    FDocument : HPDFDocument;
...
  protected
...
  public
    { Déclarations publiques }
...
end;
Das Resultat gleich bei der ersten Prozedur nach 'Implementation:

Delphi-Quellcode:
function TPDFiumFrame.TPDFPage.HasText: Boolean;
begin
....
end;
Dass hier die Unterklasse direkt und nicht etwa eine Instanz angesprochen wird, fiel mir erst jetzt auf.
Instanzen gibt es erst später, wenn das Programm schon lange läuft und ein Dokument geladen 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
  Mit Zitat antworten Zitat
Delbor

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

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 18:22
Hi DeddyH
Der Frame ist Teil innerhalb der Sinpdf.zip. Meine Testanwendung ist grundsätzlich bis auf die zweite, als Navigationsbar dienende Frameinstanz genaau diese Anwendung. Mit dabei ist die PDFium.dll, die das Einlesen der PDF-Dokumente ermöglicht. Diese Anwendung ist Opensource, Entwickler der DLL ist Google. Im Anhang findest du die Synpdf-Zip, die ich mir von der Synopse-Seite heruntergeladen habe.

Gruss
Delbor
Angehängte Dateien
Dateityp: zip synpdf.zip (611,7 KB, 4x aufgerufen)
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 DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 18:33
Ja, da habe ich alle *.pas durch, in keiner lässt sich die Zeichenfolge "PDFium" finden, wo kommt also der TPDFiumFrame her?
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
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#14

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 20:21
Ich hab den Eingangspost jetzt 3mal gelesen und ich verstehs nich. Schreib ein public type vor die TPDFPage Deklaration und fertig - brauchst keine Vorwärtsdeklaration.
Ja, der nested Type muss dann mit TPDFiumFrame.TPDFPage ansprochen werden und das taucht auch so in der Methodenliste auf - da ist nix seltsames dran.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 6. Dez 2017 um 20:24 Uhr)
  Mit Zitat antworten Zitat
Delbor

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

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 6. Dez 2017, 21:44
Hi DeddyH

Sorry, wenn ich erst jetzt antworte - nach deinem letzten Post hab ich festgestellt, dass meine Anwendung doch auf meinem Mist gewachsen ist. Ich benutze dabei gewissermassen als Basis dieses Beispiel.
Leider kann ich dir nur diesen Link geben. Die Datei, die da als Zip-Datei herunterladbar ist, hat mehr als 5MB und kann daher nicht als Anhang hier gepostet werden.

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 DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 7. Dez 2017, 06:28
Ich weiß zwar nicht, wozu Du die Seiteninstanz brauchst, aber es gibt da mehrere Möglichkeiten. Entweder die Typdeklaration aus der Klasse herausnehmen und davor setzen, oder z.B. einen öffentlichen Typalias deklarieren. Wenn ich das so schreibe:
Delphi-Quellcode:
type
  TTest = class
  strict private
    type
      TDings = class
        Bums: integer;
      end;
  public
    Bums: TDings;
  end;
,dann komme ich an Bums nicht heran, das sagt mir auch der Compiler. Mache ich das aber so:
Delphi-Quellcode:
type
  TTest = class
  strict private
    type
      TDings = class
        Bums: integer;
      end;
  public
    type
      TBums = TDings;
  public
    Bums: TBums;
  end;
,dann kann ich Bums als TBums ansprechen.
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
 
#17

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 7. Dez 2017, 11:52
Hi DeddyH

Da TPDFPage privat deklariert ist, habe ich von der Mainform keinen Zugriff darauf, kann also in der Mainform keine Klassenvariable einführen, die mit TPDFPage kompatibel ist.
mit deinem Tip ist das allerdings kein Problem. Die Deklaration in TPDFiumFrame:
Delphi-Quellcode:
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure SetPageIndex(Value : Integer);
  public
    { Déclarations publiques }
    type
      TPDFPageClass = TPDFPage;
  public
    PDFPageClass : TPDFPageClass;
     
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
...
Überflüssig ist das hier:
Delphi-Quellcode:
constructor TPDFiumFrame.Create(AOwner: TComponent);
begin
{$IFDEF TRACK_EVENTS}
  AllocConsole;
{$ENDIF}
  inherited;
  ControlStyle := ControlStyle + [csOpaque];
  FZoom := 100;
  FPageIndex := -1;
  PDFPageClass := TPDFPageClass.Create;
Es existiert jetzt zwar eine Instanz dieser Klasse, die aber vorerst nicht initialisiert ist. Ich sehe auch keinen Sinn dain, dies überhaupt noch zu tun - zumindest nicht im TPDFiumFrame.

Aber sie ermöglicht mir etwas anderes:
Delphi-Quellcode:
procedure TSynpdfMain.PDFiumFrame1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var SP, FP :TPoint; Index : Integer; Page : TPDFiumFrame.TPDFPageClass;
begin
  Memo1.Lines.Add('------ PDFiumFrame1MouseUp ------');
  for Index := 0 to PDFiumFrame1.PDFPageList.Count -1 do
  begin
     Page := PDFiumFrame1.PDFPageList.Items[Index];
     Memo1.Lines.Add('Page.Index := '+ IntToStr(Index));
     Memo1.Lines.Add('Page.Rect.Left := '+ FloatToStr(Page.Rect.Left));
     Memo1.Lines.Add('Page.Rect.Top := '+ FloatToStr(Page.Rect.Top));
     Memo1.Lines.Add('Page.Rect.Top := '+ FloatToStr(Page.Rect.Right));
     Memo1.Lines.Add('Page.Rect.Top := '+ FloatToStr(Page.Rect.Bottom));
  end;
PDFPageList ist ein Property, das ich dem TPDFiumFrame verpasst habe und das den Zugriff auf die TList-Variable FPages erlaubt. Die Ausgabe im Memo bei einem Click auf PDFiumFrame1:
Zitat:
------ PDFiumFrame1MouseUp ------
Page.Index := 0
Page.Rect.Left := 5
Page.Rect.Top := 5
Page.Rect.Right := 144
Page.Rect.Bottom := 185
Page.Index := 1
Page.Rect.Left := 5
Page.Rect.Top := 190
Page.Rect.Right := 144
Page.Rect.Bottom := 370
Page.Index := 2
Page.Rect.Left := 5
Page.Rect.Top := 375
Page.Rect.Right := 144 //<===Page.Rect.Right
Page.Rect.Bottom := 555
PDFiumFrame1.Seite := 1
PDFiumFrame1.Left := 10
PDFiumFrame1.PDFCurPage ist NIL
PDFiumFrame1.PDFSelPage ist NIL

PDFiumFrame1.TotalSize.cx := 612
PDFiumFrame1.TotalSize.cy := 5544
PDFiumFrame1.Width := 166 // <===PDFiumFrame1.Width
PDFiumFrame1.Height := 556
PDFiumFrame1.PageIndex := 0
Dem gegenüer liefert mir ein Click auf den grösseren Frame2 Folgendes:
Zitat:
------ PDFiumFrame2MouseUp ------
Page.Index := 0
Page.Rect.Left := 5
Page.Rect.Top := 5
Page.Rect.Right := 590
Page.Rect.Bottom := 762
Damit ist klar: Ich habe Zugriff auf die Abmessungen der einzelnen Seiten in den Frameinstanzen. Diese werde ich brauchen, um bei einem Click den Index der einzelnen Seiten zu ermitteln. Bislang liefert mir ein Klick auf die Seite mit dem Index 0 zwar auch den korrekten Wert, aber erst ein Klick auf die 4. angeigte Seite liefert mir den Index 1 zurück.

Allerdings zweifle ich daran, dass ich, wie erst angedacht, hier mit ScreenToClient weiterkomme Die Masse der einzelnen Seiten sind in der DLL und beziehen sich auf (normalerweise) das A4-Format.

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
Delbor

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

AW: Verständnisfrage Vorwärtsdeklaration

  Alt 8. Dez 2017, 14:28
Hi zusammen

Die Lösung liegt darin, dem TPDFiumFrame ein Property zu verpassen:

property PageAt[const p: TPoint]: TPDFPage read GetPageAt; Wie ich nun den PDFiumFrame2 dazu bringe, die Seite mit dem aus PDFiumFrame1 erhaltenen Index anzuzeigen, muss ich erst noch herausfinden. Es gibt zwar eine Funktion (GetPage), die das tut. Aber die liefert an den Aufrufer (PDFiumFrame1) zurück, nicht gewissermassen an sich selbst.

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
Antwort Antwort
Seite 2 von 2     12   


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 20:19 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