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:
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;
Die Funktion wurde der Funktionsweise der TStream.Seek Funktion, die bei Nichtimplementierung der Seek-Funktion eine
Exception wirft, nachempfunden.