AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStream: Seek ist implementiert?

Ein Thema von igel457 · begonnen am 8. Feb 2009 · letzter Beitrag vom 9. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

TStream: Seek ist implementiert?

  Alt 8. Feb 2009, 15:41
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: TStream: Seek ist implementiert?

  Alt 8. Feb 2009, 16:58
Generell OK, aber ich würde es eher StreamSeekOverridden nennen. Es kann durchaus vorkommen, dass jemand .Seek überschreibt und einfach ein ENotSeekable wirft..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: TStream: Seek ist implementiert?

  Alt 8. Feb 2009, 17:17
Zitat von Dax:
Generell OK, aber ich würde es eher StreamSeekOverridden nennen. Es kann durchaus vorkommen, dass jemand .Seek überschreibt und einfach ein ENotSeekable wirft..
wieso was werfen?
stell dir mal vor, der macht darin nur einfach garnichts
$2B or not $2B
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: TStream: Seek ist implementiert?

  Alt 8. Feb 2009, 17:32
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: TStream: Seek ist implementiert?

  Alt 8. Feb 2009, 18:40
Zitat:
Delphi-Quellcode:
  //Get a reference to the parent TStream class of the TStream object
  base_class := AStream.ClassType;
  while (base_class <> nil) and (base_class <> TStream) do
    base_class := base_class.ClassParent;

  if base_class <> nil then
  begin
    //Get the new implementation of the seek method
    base_seek_proc := TStream(base_class).Seek;
Das kannst du ganz einfach kürzen, da base_class immer bei TStream herauskommt (außer jemand macht einen ungültigen Typecast nach TStream, dann ist er aber selbst schuld).
base_seek_proc := TStream.Seek;
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#6

Re: TStream: Seek ist implementiert?

  Alt 8. Feb 2009, 20:07
Hallo,

ich habe die Änderungsvorschlage umgesetzt. Vorher hatte ich auch nicht überprüft, ob die normale Seek-Prozedur überschrieben worden war.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: TStream: Seek ist implementiert?

  Alt 8. Feb 2009, 21:43
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#8

Re: TStream: Seek ist implementiert?

  Alt 9. Feb 2009, 09:58
Und das verschieben der Position ruft Seek auf.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: TStream: Seek ist implementiert?

  Alt 9. Feb 2009, 10:18
Genau .. also schön eine Fehlerbehandlung in die Abfrage reinmachen
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#10

Re: TStream: Seek ist implementiert?

  Alt 9. Feb 2009, 16:45
Und genau die wollte ich vermeiden. Konstrukte wie...
Delphi-Quellcode:
function SupportsFeature: boolean;
begin
  try
    DoFeature;
    result := true;
  except
    result := false;
  end;
end;
...sind irgendwie - naja - suboptimal.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 Uhr.
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