![]() |
TStream: Seek ist implementiert?
Prüfen, ob ein Stream "Seekable" ist
Wenn man öfters mit Streams arbeitet, ist es unter Umständen wichtig zu wissen, ob die "Seek" Methode implementiert ist. Zum Beispiel bei Netzwerkstreams ist dies nicht der Fall. Die folgende Funktion gibt zurück, ob die "Seek" Methode der Streamklasse überschrieben wurde. Dies muss zwar nicht zwangläufig bedeuten, dass die Seek-Funktionalität implementiert wurde, liefert jedoch schon mal einige Anhaltspunkte darüber. Da der Code die 64-Bit Variante der Seek-Methode überprüft, muss diese Überprüfung für die Verwendung mit Delphiversionen <= 5 entfernt werden.
Delphi-Quellcode:
Die Funktion wurde der Funktionsweise der TStream.Seek Funktion, die bei Nichtimplementierung der Seek-Funktion eine Exception wirft, nachempfunden.
type
TSeek64_Proc = function(const Offset: Int64; Origin: TSeekOrigin): Int64 of object; TSeek_Proc = function(Offset: Longint; Origin: Word): Longint of object; function StreamSeekOverridden(AStream: TStream): boolean; var current_seek_proc_64, base_seek_proc_64: TSeek64_Proc; current_seek_proc, base_seek_proc: TSeek_Proc; base_class: TClass; begin //Get the current seek implementation current_seek_proc_64 := AStream.Seek; current_seek_proc := AStream.Seek; //Get the old implementation of the seek method base_class := TStream; base_seek_proc_64 := TStream(@base_class).Seek; base_seek_proc := TStream(@base_class).Seek; //The seek method is implemented if the current address of the seek method //is unequal to the address of the TStream seek method result := (TMethod(current_seek_proc).Code <> TMethod(base_seek_proc).Code) or (TMethod(current_seek_proc_64).Code <> TMethod(base_seek_proc_64).Code); end; |
Re: TStream: Seek ist implementiert?
Generell OK, aber ich würde es eher StreamSeekOverridden nennen. Es kann durchaus vorkommen, dass jemand .Seek überschreibt und einfach ein ENotSeekable wirft.. ;)
|
Re: TStream: Seek ist implementiert?
Zitat:
stell dir mal vor, der macht darin nur einfach garnichts :shock: |
Re: TStream: Seek ist implementiert?
Auch wahr ;) In beiden Fällen gilt der Stream als seekbar, nur dass es in meinem Fall dann eben knallt, wenn man .Seek naiverweise aufruft. Bei dir geht's weiter, aber das Programm findet wahrscheinlich nicht das, was es finden will - und es knallt dann wohl an anderer Stelle.
|
Re: TStream: Seek ist implementiert?
Zitat:
Delphi-Quellcode:
base_seek_proc := TStream.Seek;
|
Re: TStream: Seek ist implementiert?
Hallo,
ich habe die Änderungsvorschlage umgesetzt. Vorher hatte ich auch nicht überprüft, ob die normale Seek-Prozedur überschrieben worden war. |
Re: TStream: Seek ist implementiert?
Das "Einfachste/Sicherste" wäre eigentlich die Position zu verschieben, zu vergleichen wo die Position danach ist und danach natürlich die Position zurückzusetzen, wenn verschoben.
Aber wenn der Stream 'ne Länge von 0 hat, könnte es da zu Problemen kommen. |
Re: TStream: Seek ist implementiert?
Und das verschieben der Position ruft Seek auf.
|
Re: TStream: Seek ist implementiert?
Genau .. also schön eine Fehlerbehandlung in die Abfrage reinmachen :stupid:
|
Re: TStream: Seek ist implementiert?
Und genau die wollte ich vermeiden. Konstrukte wie...
Delphi-Quellcode:
...sind irgendwie - naja - suboptimal.
function SupportsFeature: boolean;
begin try DoFeature; result := true; except result := false; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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 by Thomas Breitkreuz