04. januar 2002 - 12:02Der er
13 kommentarer og 1 løsning
TFileStream
Jeg har ikke megen erfaring i at bruge TFileStream. Jeg har skrevet følgende kode:
type TChunk3DS = record Tag: Word; Size: Cardinal; Position: Cardinal; end;
function LoadFile(FileName : string) : string; var MyFile : TfileStream; Chunk : TChumk; begin MyFile := TFileStream.Create(FileName, $0000 or $0020); with MyFile do begin //Reading File Chunk Position := 0; ReadBuffer(Chunk.tag, sizeof(Chunk.tag)); ReadBuffer(Chunk.size, sizeof(Chunk.size)); if Chunk.tag = $4D4D then //gør et eller andet end; MyFile.Free; end;
Det virker fint til den filformat jeg ønsker indllæst. Jeg har et hav af adresser til at hente andre informationer fra filen. Til det kan jeg eventuelt bruge en repeat lykke men hvorfor ikke bruge seek() - men jeg ved bare ikke hvordan...
Jeg har eksempelvis en adresse, $3D3E, den skulle give mig et fil-version værdi. Men hvordan får jeg værdien (integer) frem med seek()...
Jeg har været i Delphis hjælpe-fil men uden held...
Procedure AddToStream ( Source , Dest : TStream ); var Size : Integer ; begin try Source.position := 0 ; //Keep the size by puting it in the first byte Size := Source.Size ; Dest.Write(Size,SizeOf(Integer)); Dest.CopyFrom(Source,0); except end; end;
Procedure GetFromStream ( Source , Dest : TStream ; Index : Integer ); Var Size , I : Integer ; begin Dest.Position:=0; Source.Position := 0 ; For i := 0 to index-1 do begin Source.Read(Size,SizeOf(Integer)); Source.Position := Source.Position + Size ; end; // if where all the way up the file pointer then someting went wrong :( if Source.position = Source.Size then Raise EAccessViolation.Create(\'Unknown File\') ; // Get the desired file size
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
// helper functions function GetStr(AStream: TStream): String; VAR Len : Integer; begin AStream.Read(Len,SizeOf(Len)); Result := \'\'; if Len > 0 then begin SetLength(Result,Len); AStream.Read(Result[1],Len); end; end;
procedure PutStr(AStr: String; AStream: TStream); VAR Len : Integer; begin Len := Length(AStr); AStream.Write(Len,SizeOf(Len)); if Len > 0 then AStream.Write(Astr[1],Len); end;
function GetInt( aStream : TStream ) : Integer; begin AStream.Read(Result,SizeOf(Result)); end;
function GetStream( aStream : TStream ) : TStream; VAR Len : Integer; begin Result := TMemoryStream.Create; AStream.Read(Len,SizeOf(Len)); if Len > 0 then Result.CopyFrom(aStream,Len); Result.Position := 0; end;
procedure PutStream( aValue,aStream : TStream ); VAR Len : Integer; begin Len := aValue.Size; AStream.Write(Len,SizeOf(Len)); aValue.Position := 0; AStream.CopyFrom(aValue,Len); end;
procedure TForm1.Button1Click(Sender: TObject); VAR F : TFileStream; I : Integer; S : String; begin F := TFileStream.Create(\'MyTest.dat\',fmCreate); I := 15; S := \'Hest\'; PutInt(I,F); PutStr(S,F); F.Free; F := TFileStream.Create(\'MyTest.dat\',fmOpenRead); ShowMessageFmt(\'%d %s\',[GetInt(F),GetStr(F)]); F.Free; end;
har dog ikke helt fundet ud af det endnu, men det er vist tid til at lukke dette spørgsmål...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.