AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Verständnisfrage Dateien in Objekten
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage Dateien in Objekten

Ein Thema von FragenderHerbert · begonnen am 12. Dez 2013 · letzter Beitrag vom 13. Dez 2013
Antwort Antwort
FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#1

Verständnisfrage Dateien in Objekten

  Alt 12. Dez 2013, 09:08
Hallo liebe Delphianer,

ich bin so gut wi neu hier, habe Euch durch Stöbern im Internet gefunden und auch schon hier im Forum ein wenig geblättert. Leider programmiere ich noch nicht allzu lange. Ich möchte es aber gerne lernen und da habe ich schon das erste Prorblem, das ich mir nicht erklären kann.

Ich habe diese Unit geschrieben.

Delphi-Quellcode:
unit UByteStream;

interface

uses
  Sysutils, Classes;


type
  PByteStream = ^TByteStream;
  TByteStream = Class(TObject)
  private
    FFile: File Of Byte;
    FFileName: String;
  public
    constructor Create(AFileName: String; Mode: Word);
    destructor Destroy; override;
    function ReadByte: Byte;
    function Read(var Buffer: array of byte; BufSize: Longint): Longint;
    procedure WriteByte(b: Byte);
    function Write(var Buffer: array of byte; BufSize: Longint): Longint;
    function Position: Longint;
    function Size: Longint;
    procedure Seek(APos: Longint; Flag: Word);
  End;


implementation


{ TByteStream }

constructor TByteStream.Create(AFileName: String; Mode: Word);
var IResult: Integer;
begin
  inherited Create;
  System.Assign(FFile, FFileName);
  {$I-}
  if (Mode=fmOpen) or (Mode=fmOpenRead) then
  begin
    System.Reset(FFile);
    IResult := System.IOResult;
    if IResult <> 0 then fail;
  end
  else
  if Mode = fmCreate then
  begin
    System.Rewrite(FFile);
    IResult := IOResult;
    if IResult <> 0 then fail;
  end;
  {$I+}
end;

destructor TByteStream.Destroy;
begin
  System.Close(FFile);
  inherited Done;
end;

function TByteStream.ReadByte: Byte;
var b: Byte;
begin
  System.Read(FFile, b);
  Result := b;
end;

function TByteStream.Read(var Buffer: array of byte; BufSize: Longint): Longint;
var Count,Current,BufStart,BufEnd,BufPos: Word;
begin
  BufStart := Low(Buffer);
  BufEnd := High(Buffer);
  BufPos := BufStart;
  Current := System.FilePos(FFile);
  Count := Current;
  while Count < Current + BufSize do
  begin
    System.Read(FFile, Buffer[BufPos]);
    inc(BufPos);
    inc(Count);
  end;
  Result := Count - Current;
end;

procedure TByteStream.WriteByte(b: Byte);
begin
  System.Write(FFile, b);
end;

function TByteStream.Write(var Buffer: array of byte; BufSize: Longint): Longint;
var Count,Current,BufStart,BufEnd,BufPos: Word; x: array[0..1023] of byte absolute Buffer;
begin
  BufStart := Low(Buffer);
  BufEnd := High(Buffer);
  BufPos := BufStart;
  Current := System.FilePos(FFile);
  Count := Current;
  while Count < Current + BufSize do
  begin
    System.Write(FFile, Buffer[BufPos]);
    inc(BufPos);
    inc(Count);
  end;
  Result := Count - Current;
end;

function TByteStream.Position: Longint;
begin
  Result := System.FilePos(FFile);
end;

function TByteStream.Size: Longint;
begin
  Result := System.FileSize(FFile);
end;

procedure TByteStream.Seek(APos: Longint; Flag: Word);
begin
  case Flag of
    soFromBeginning: System.Seek(FFile, APos);
    soFromCurrentPos: ;
    soFromEnd: ;
  end;
end;

end.
Bei Anwendung dieser Unit erhalte ich aber einen Fehler:

"Datei nicht geöffnet". Warum ist das so?

Delphi-Quellcode:
type
  TReader = class(TObject)
   private
    MeineBytes: TByteStream;
   public
    constructor Create(Filename: String);
    destructor Destroy; override;
    procedure ReadBytes;
  end;

implementation

constructor Create(Filename: String);
begin
  inherited Create;
  MeineBytes := TByteFile.Create(FileName, fmOpen);
end;

destructor Destroy;
begin
  MeineBytes.Free;
  inherited Destroy;
end;

procedure ReadBytes;
begin
  //hier sollten die Bytes aus der Datei nun gelesen werden
  //Aber die Datei ist nicht geöffnet
end;

end.
Entweder ich bin betriebsblind und habe was entscheidendes übersehen oder eine Datei kann in einer Klasse nicht geöffnet werden.

Wenn letzteres zutrifft, warum ist das so. Ich möchte die Zusammenhänge gerne verstehen.

Wer kann mir helfen?
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Verständnisfrage Dateien in Objekten

  Alt 12. Dez 2013, 09:12
AFileName wird übergeben aber nichts damit gemacht, stattdessen wird FFilename benutzt, das nirgends gesetzt wurde.

Delphi-Quellcode:
constructor TByteStream.Create(AFileName: String; Mode: Word);
var IResult: Integer;
begin
   inherited Create;
   System.Assign(FFile, FFileName);
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Verständnisfrage Dateien in Objekten

  Alt 12. Dez 2013, 09:22
Da ein Klassentyp eine Referenz( Zeiger-)typ ist, wird kein Zeigertyp benötigt
PByteStream = ^TByteStream;
Die Angabe der Superklasse TObject kann enfallen
TByteStream = Class(TObject) da beim Weglasen automatisch von TObject geerbt wird.

Ich würde hier aber direkt von TStream ableiten
Markus Kinzler
  Mit Zitat antworten Zitat
FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#4

AW: Verständnisfrage Dateien in Objekten

  Alt 13. Dez 2013, 07:42
Hallo,

danke erst mal für Eure wirklich schnellen Antworten.

@baumina:
Habe das geändert und jetzt wird die Datei geöffnet.

@mkinzler:

Ich werde in Zukunft auch von TStream ableiten. Aber vorher schau ich mir den Quelltext (Turbo Delphi) von TStream an. Da gibt es bereits jetzt jede Menge Fragen. Ich glaub, ich schau mir das in aller Ruhe erst mal an. Was ich bis jetzt gesehen habe, ist, das das Stream Objekt auch aus einer gewöhnlichen Datei liest. Bleibt die Frage, wie Objekte gelesen und geschrieben werden. Da werd ich wohl noch einige Zeit brauchen, um das zu verstehen. Will mich erst mal damit beschäftigen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Verständnisfrage Dateien in Objekten

  Alt 13. Dez 2013, 08:36
Mal so als Frage unter uns Kegelschwestern

Was unterscheidet deine Klasse jetzt von einem Delphi-Referenz durchsuchenTFileStream?
(Abgesehen davon, dass Delphi-Referenz durchsuchenTFileStream von Delphi-Referenz durchsuchenTStream abgeleitet ist)

Oder was erwartest du von deiner Klasse, was nicht mit Delphi-Referenz durchsuchenTFileStream erledigt werden könnte?

Oder ganz ketzerisch gefragt, was denkst du, was jemand erwartet, wenn er TByteStream liest?
Einen Stream wo Bytes drin sind? (das mit dem Dateinamen würde mich aber schon wieder überraschen - warum dann nicht TFileByteStream ?)

Ja was ist denn dann in einem Delphi-Referenz durchsuchenTStream?
(auf jeden Fall keine Hasenköttel - ich dachte immer, da sind Bytes drin)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Verständnisfrage Dateien in Objekten

  Alt 13. Dez 2013, 12:37
@Sir Rufo
vielleicht wollte er einfach mal üben?
"learning by doing"

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:29 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