Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verständnisfrage zu Methoden (https://www.delphipraxis.net/196590-verstaendnisfrage-zu-methoden.html)

Delbor 1. Jun 2018 12:30

Delphi-Version: 10.2 Tokyo

Verständnisfrage zu Methoden
 
Hi zusammen

Ich arbeite gegenwärtig gerade mit der GraphicEx von Mike Lischke, und da ist mir etwas begegnet, für das ich keine Erklärung habe und wofür ich auch in der Embarcadero OnlineHelp keine Andeutung gefunden habe.

Vorneweg : Die Unit GraphicEx weist eine besonderheit auf:
Normalerweise wird in der Zeile, in der ein Prozedurkopf beginnt direkt vor dem Wort procedure ein Pluszeichen eingeblendet, über das sich die Prozedur zusammenklappen lässt - das fehlt bei allen Methoden der Unit.
Ausserdem ist es nicht möglich, von der Prozedur-Implementierungmit <Shift+Ctrl+UP> zur Deklaration, bzw. mit <Shift+Ctrl+Down> in umgekehrter Richtung zu wechseln.

Deklaration und Implementation der Prozedur TTiffGraphic.SaveToStream:

Delphi-Quellcode:
  {$ifdef NewTIFFGraphic}
  // *.tif, *.tiff images
  TTIFFGraphic = class(TGraphicExGraphic)
  private
    FMemory: PByte;
    ...
  protected
    procedure ReadContiguous(tif: PTIFF);
    ...
  public
    class function CanLoad(const Memory: Pointer; Size: Int64): Boolean; override;
    ...
  end;
  {$endif NewTIFFGraphic}
  {$ifdef OldTIFFGraphic}
    TIFDEntry = packed record
      Tag: Word;
      DataType: Word;
      DataLength: Cardinal;
      Offset: Cardinal;
    end;

    TTIFFPalette = array[0..787] of Word;

    TTIFFGraphic = class(TGraphicExGraphic)
    private
      FBasePosition: Int64; //won't be too surprised of more than 2 Gb image...
      FIFD: array of TIFDEntry; // the tags of one image file directory
      ....
      procedure SortIFD;
      procedure SwapIFD;
    public
      class function CanLoad(const Memory: Pointer; Size: Int64): Boolean; override;
      ...
      ...
      procedure SaveToStream(Stream: TStream); override;
      function ReadImageProperties(Stream: TStream; ImageIndex: Cardinal): Boolean; override;
    end;
  {$endif OldTIFFGraphic}

procedure TTIFFGraphic.SaveToStream(Stream: TStream);
begin

end;
Der Vorfahre von TTiffGraphic, TGraphicExGraphic, ist ein Nachkomme von TBitmap.
Im wesentlichen irritiert mich eigentlich die leere Implementation der Prozedur. Daneben stellt sich aber auch die Frage, woran TTiffGraphic erkennt, ob fr die geladene Datei die alte oder die neue Klassenstrutur anzuwenden ist...

Gruss
Delbor

mkinzler 1. Jun 2018 12:39

AW: Verständnisfrage zu Methoden
 
Zitat:

Normalerweise wird in der Zeile, in der ein Prozedurkopf beginnt direkt vor dem Wort procedure ein Pluszeichen eingeblendet, über das sich die Prozedur zusammenklappen lässt - das fehlt bei allen Methoden der Unit.
Die IDE scheint etwas Probleme mit der bedingten Compilierung zu haben ({$ifdef ...}
Zitat:

Daneben stellt sich aber auch die Frage, woran TTiffGraphic erkennt, ob fr die geladene Datei die alte oder die neue Klassenstrutur anzuwenden ist...
Anhand von NewTIFFGraphic/OldTIFFGraphic. Müssten irgendwo entsprechend deklariert sein.
Zitat:

Im wesentlichen irritiert mich eigentlich die leere Implementation der Prozedur.
Mich auch.

Delbor 1. Jun 2018 13:02

AW: Verständnisfrage zu Methoden
 
Hi mkinzler
Danke für die Antwort! Ich habe die Unit nach dem Ausdruck NewTIFFGraphic durchsucht - den gibts nur in den Compileranweisungen.
Wobei - wenn ich das richtig verstanden habe, soll die Prozedure Canload dabei helfen, einen Dateityp nicht über die Endung zu identifizieren, sondern über den Inhalt - ein .PDF hinter einer Bitmap macht aus dieser noch lange kein PDF...
So könnte auch der Aufbau der Datei identifiziert werden.

Grusss
Delbor

DeddyH 1. Jun 2018 13:03

AW: Verständnisfrage zu Methoden
 
Möglicherweise ist die Methode in TGraphicExGraphic als abstract deklariert und muss daher überschrieben werden, auch wenn die Implementation gar nichts tut.

mkinzler 1. Jun 2018 13:09

AW: Verständnisfrage zu Methoden
 
Zitat:

Zitat von DeddyH (Beitrag 1403627)
Möglicherweise ist die Methode in TGraphicExGraphic als abstract deklariert und muss daher überschrieben werden, auch wenn die Implementation gar nichts tut.

Die Methode wird von TBitmap geerbt.

mkinzler 1. Jun 2018 13:12

AW: Verständnisfrage zu Methoden
 
Zitat:

Zitat von Delbor (Beitrag 1403626)
Hi mkinzler
Danke für die Antwort! Ich habe die Unit nach dem Ausdruck NewTIFFGraphic durchsucht - den gibts nur in den Compileranweisungen.
Wobei - wenn ich das richtig verstanden habe, soll die Prozedure Canload dabei helfen, einen Dateityp nicht über die Endung zu identifizieren, sondern über den Inhalt - ein .PDF hinter einer Bitmap macht aus dieser noch lange kein PDF...
So könnte auch der Aufbau der Datei identifiziert werden.

Grusss
Delbor

Wird in GraphicConfiguration.inc gesetzt.

Delbor 1. Jun 2018 13:14

AW: Verständnisfrage zu Methoden
 
Hi DeddyH

Die Methode stammt aus TBitmap - darum ist sie auch als overide deklariert. Ursprünglich hatte ich ja versucht, mit SaveToFile zu speichern:
Delphi-Quellcode:
  S := IncludeTrailingPathDelimiter(FAppDataPath) + OldFile;
  P := ChangeFileExt(S,'.Pdf');
  TiffStream := TMemoryStream.Create;

  Tifimage.SaveToFile(S);                       // Hier sollte das Tiff gespeichert werden
  Self.OCRFrame1.OutputFileName := P;               // 2 ropertys beschreiben direkt 2 Felder für den
  Self.OCRFrame1.InputFileName := S;               // Quell- und den Zielpfad, den die Fuktion CreatePDF benötigt
  Self.OCRFrame1.OCR2PDF;
Aber weder TTiffgrapic noch TGraphicExGraphic deklarieren sowas - nur logisch, dass meine Dateien zwar angelegt wurden, aber immer leer blieben..

Gruss
Delbor

mkinzler 1. Jun 2018 13:17

AW: Verständnisfrage zu Methoden
 
GraphicEx scheint nur für das Laden der Formate zu sorgen (und die Wandlung nach TBitmap). Beim Speichern wird Bitmap gespeichert (oder hat nichts, wie hier)

Delbor 1. Jun 2018 14:06

AW: Verständnisfrage zu Methoden
 
Hi mkinzler
Zitat:

GraphicEx scheint nur für das Laden der Formate zu sorgen
Das habe ich anders verstanden. Mit Hilfe der Streams ist es möglich, jeden Block einzeln am richtigen Ort zu schreiben. Dazu gibt es in TGraphicExGraphic einen Record THeader:
Delphi-Quellcode:
  type
    PTIFFHeader = ^TTIFFHeader;
    TTIFFHeader = packed record
      ByteOrder: Word;
      Version: Word;
      FirstIFD: Cardinal;
    end;
Der ist aber kein Feld von TTiffGraphic, sondern muss so in denStrem geschrieben werden - zumindest, wenn ich das richtig verstanden habe. Und FirsIFD gibt ja nur die Adresse des ersten IFDs an. Diejenige des zweiten (wenn vorhanden) steht dann im ersten.
ach dieser Deklaration:
Delphi-Quellcode:
procedure SaveToStream(Stream: TStream); override;
speichert TTiffGraphic nur den übergebenen Stream. Bleibt noch die Frage: wohin speichere ich den Header - in den zu übergebenden oder in den speichernden Stream...

Eine weitere Frage hätte ich aber noch: Ich hab da noch ein Buch über Dateitypen von 1997 ausgegraben, das das Tiff-Format (Tiff 6.0) beschreibt. Darin enthalten sind zweieinhalb Seiten Beschreibungen der verschiedenen Tagtypen. Brauche ich die Dinger wirklich?
Aktueller Stand ist: Der Scanner liefert Bitmaps. Und die wollte ich in möglichst durchsuchbare PDFs umwandeln und dann in eine Datenbank schreiben. Dabei soll das Bitmap des Scanners so, wie geliefert, in Tiff gewandelt und an Tesseract weitergereicht werden.

Gruss
Delbor

mkinzler 1. Jun 2018 14:34

AW: Verständnisfrage zu Methoden
 
Die leere Methode oder inherited macht aber buchstäblich überhaupt nichts. Möglicherweise war es mal etwas geplant.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.
Seite 1 von 2  1 2      

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