AGB  ·  Datenschutz  ·  Impressum  







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

Privat deklarierte Klasse ableiten

Ein Thema von Delbor · begonnen am 17. Nov 2017 · letzter Beitrag vom 20. Nov 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

Privat deklarierte Klasse ableiten

  Alt 17. Nov 2017, 13:36
Delphi-Version: XE8
Hi zusammen
Dieser Thread ist im Grunde die Fortsetzung von hier. Für einen neuen Thread hab ich mich entschlossen, weil das Thema unabhängig vom verlinkten Thread interessant sein könnte.
Der da besprochene TPDFiumFrame deklariert ein Klasse TPDFPage in einem private-Abschnitt - es gibt, mir unverständlich, weshalb, 2 davon. TPDFiumFrame legt in einer TList-Instanz ein Handle auf eine TPDFPage-Instanz, bzw auf die da repräsentierte PDF-Seite ab, Diese Liste ist public deklariert, kann also von aussen angesprochen werden.

Tja, mein erster Ansatz war nun, in der Mainform, die mehrere Instanzen dieses TPDFiumFrames nutzt, eine neue Instanz der Klasse TPDFPage zu erstellen. Das ging aber gründlich schief, da in der von TPDFiumFrame benutzten Unit TSynPDF auch eine Klasse TPDFPage deklariert ist, die aber von TPDFDictonary abgeleitet ist.

Nun bin ich auf die Idee gekommen, im Public-Abschnitt von TPDFiumFrame eine neue Klasse TPDFDocumentPage zu erstellen und die von der privaten Klasse TPDFiumFrame.TPDFPage abzuleiten. Dabei soll TPDFDocumentPage keine neuen Member einführen.

Die Deklaration wäre auf dies Weise sehr einfach:
Delphi-Quellcode:
type
TPDFDocumentPage = class(TPDFiumFrame.TPDFPage)
  private
  public
end;
TPDFiumFrame.TPDFPage zu schreiben, ist mir jetzt gerade eingefallen - sollte im TPDFiumFrame SynPDF im Uses-Teil aufgeführt sein, könnte es Konflikte geben oder sogtar von einer völlig falschen Klasse abgeleitet werden.

Tja, und jetzt kommt mein eigentliches Problem: Irgendwo hab ich mal mitgekriegt, dass in einer abgeleiteten Komponente/Klasse Member ohne explizite Typangabe aufgeführt werden können, weiss aber nicht mehr, woher ich das habe. Hier, bei Delphi-Treff und in der EntwicklerEcke habe ich dazu nichts gefunden. Auch meine klugen Bücher schweigen sich darüber aus.
Daher wollte ich bei Embarcadero nachsehen, aber wies ausschaut, haben die ihren Server geade heute ins Nirwana geschickt.

Weiss jemand mehr?

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
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Privat deklarierte Klasse ableiten

  Alt 17. Nov 2017, 14:39
...dass in einer abgeleiteten Komponente/Klasse Member ohne explizite Typangabe aufgeführt werden können...
Darunter kann ich mir nichts vorstellen?!
Was willst du machen?
  Mit Zitat antworten Zitat
Delbor

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

AW: Privat deklarierte Klasse ableiten

  Alt 17. Nov 2017, 14:57
Hi TiGü

Na, zum Bleistift statt:

FPoint : TPoint;

nur:

FPoint;

Ich glaube mich zu erinnern, dass dies bei Erhöhen derSichtbarkeit der Fall ist. Aber sicher bin ich mir eben nicht. Und Embarcareo scheint sich immer noch im Nirwana aufzuhalten..

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
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#4

AW: Privat deklarierte Klasse ableiten

  Alt 17. Nov 2017, 15:15
Das geht nur bei Properties.
Hast Du diese in einer Klasse protected deklariert:
Delphi-Quellcode:
TFoo = class
private
  fInfo: string;
protected
  property info read finfo write finfo;
end;
Willst du nun in der abgeleiteten Klasse Bar info published machen, ist das so möglich:
Delphi-Quellcode:
TBar = class(Too)
published
  property info;
end;
Die Sichtbarkeit von private deklarierten Properties kannst Du aber nicht erhöhen.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP

Geändert von TBx (17. Nov 2017 um 15:22 Uhr)
  Mit Zitat antworten Zitat
Delbor

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

AW: Privat deklarierte Klasse ableiten

  Alt 17. Nov 2017, 15:57
Hi TBx

Vielen Dank!

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
Rollo62
Online

Registriert seit: 15. Mär 2007
3.899 Beiträge
 
Delphi 12 Athens
 
#6

AW: Privat deklarierte Klasse ableiten

  Alt 18. Nov 2017, 07:00
Das geht dann vieleicht in den Bereich "nasty hack"

Würde ich nur ein extremen Ausnahmefällen machen und gut Unit-Testen und dokumentieren.

Rollo
  Mit Zitat antworten Zitat
Delbor

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

AW: Privat deklarierte Klasse ableiten

  Alt 18. Nov 2017, 10:21
Hi Rollo

Da mein Englisch sehr schlecht ist, hab ich mir die Beiträge unter deinem Link mal von Google übersetzen lassen. Inzwischen kommen mit dem Ding ja tatsächlich verständliche und nachvollziehbare Übersetzungen zustande.

Wenn ich das jetzt richtig verstanden habe, besteht das Problem darin:
Sollte sich die Deklarationsstruktur des TPDFiumFrame bei einem Update des Frames ändern und auch nur ein privates Feld dazukommen, verschiebt das die ganzen nachfolgenden Deklarationen nicht nur im Quelltext-Editor nach unten, sondern sie erhalten auch eine neue Speicheradresse.

Ich seh hier allerdings in diesem Fall kein Problem. Denn wenn es mal ein Update des TPDFiumFrames geben sollte und ich dieses einbauen will, muss ich auch meine Klasse neu einfügen und neu compilieren, wodurch sich das Problem 'voon selbst' erledigen sollte.

Meine Deklaration (wobei ich gerade sehe, dass sie Falsch ist - ich beabsichtige nicht, irgendwas zu veränder oder irgendwelche Methoden zu überschreiben. Ich benötige lediglich in meiner Mainform eine Klassenvariable, die mit TPDFiumFrame.TPDFPage kompatibel ist :
Delphi-Quellcode:
  public
    { Déclarations publiques }
    type
      TPDFCustomDocumentPage = class(TPDFPage)
// 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;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

Den ganzen hier auskommentierten Teil kann ich weglassen. War wohl schon etwas spät gestern abend...

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
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#8

AW: Privat deklarierte Klasse ableiten

  Alt 18. Nov 2017, 11:01
Irgendwie komme ich noch nicht so ganz dahinter, was Du eigentlich vorhast.
Willst Du eine private Typdeklaration ableiten, also sowas:
Delphi-Quellcode:
TFoo = class
private
  type
   TMaker = class
     procedure bulb;
  end;
end;
Dann wird sowas nicht funktionieren:
Delphi-Quellcode:
TBar = class(Too)
public
  type
   TMyMaker = class(TMaker)
  end;
end;
Hast Du hingegen sowas:
Delphi-Quellcode:
TFoo = class
private
  TopSecret: Object;
end;
kannst Du Dir über einen class Helper helfen:
Delphi-Quellcode:
TFooHelper = class helper for TFoo
  function getTopSecret: TObject;
end;

function TFooHelper.getTopSecret: TObject;
begin
  Result := self.TopSecret;
end;
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
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
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#10

AW: Privat deklarierte Klasse ableiten

  Alt 18. Nov 2017, 13:37
Da dir ja offensichtlich der Quelltext vorliegt, warum passt Du die Klasse nicht Deinen Bedürfnissen an?
Die Typdeklaration public machen und eine public Property auf die entsprechende private Variable weisen lassen.

Dann hast du alles, was du für den Zugriff von außen brauchst.
Solche Änderungen kann man über eine Versionsverwaltung gut nachvollziehbar halten. Arbeitest Du mit GIT mit einem geschickten Branching, kannst Du Deine Änderungen in eine neuere Version der Ursprungsquellen über ein Rebase recht einfach wieder einarbeiten.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  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 15:37 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