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.