![]() |
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:
Der Vorfahre von TTiffGraphic, TGraphicExGraphic, ist ein Nachkomme von TBitmap.
{$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; 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 |
AW: Verständnisfrage zu Methoden
Zitat:
Zitat:
Zitat:
|
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 |
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.
|
AW: Verständnisfrage zu Methoden
Zitat:
|
AW: Verständnisfrage zu Methoden
Zitat:
|
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:
Aber weder TTiffgrapic noch TGraphicExGraphic deklarieren sowas - nur logisch, dass meine Dateien zwar angelegt wurden, aber immer leer blieben..
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; Gruss Delbor |
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)
|
AW: Verständnisfrage zu Methoden
Hi mkinzler
Zitat:
Delphi-Quellcode:
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.
type
PTIFFHeader = ^TTIFFHeader; TTIFFHeader = packed record ByteOrder: Word; Version: Word; FirstIFD: Cardinal; end; ach dieser Deklaration:
Delphi-Quellcode:
speichert TTiffGraphic nur den übergebenen Stream. Bleibt noch die Frage: wohin speichere ich den Header - in den zu übergebenden oder in den speichernden Stream...
procedure SaveToStream(Stream: TStream); override;
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 |
AW: Verständnisfrage zu Methoden
Die leere Methode oder inherited macht aber buchstäblich überhaupt nichts. Möglicherweise war es mal etwas geplant.
|
AW: Verständnisfrage zu Methoden
Hi mkinzler
Ja, ich denke auch, dass da etwas geplant war. ich denke, ich werde das implementieren. Eigentlich fehlt der Klasse ein Property Targetfile, das ein Feld FTargetfile beschreibt, damit TTiffgraphic auch weiss, wohin gespeichert werden soll. Oder ein solcher Übergabeparameter. Gruss Delbor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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