?? multidatafile.pas
字號:
////////////////////////////////////////////////////////////////////////////////
// TMultiDataFile2 //
////////////////////////////////////////////////////////////////////////////////
// Handles a file that consists of a sequence of other files, seperated by a //
// 3byte header containing the size of the following segment, terminated by //
// 3 byte with value 0. //
// VERSION 2 - LSB FIRST!!!!! //
////////////////////////////////////////////////////////////////////////////////
// version 2.1 / August 2001 //
// (C) 1999,2000 by Werner Bailer (werner@wbailer.com) //
////////////////////////////////////////////////////////////////////////////////
unit MultiDataFile;
interface
uses Classes, SysUtils
{$IFDEF CLX}
, QGraphics
, QDialogs
{$ELSE}
, Graphics
, Dialogs
{$ENDIF}
;
type
TMultiDataFile = class
protected
Stream: TMemoryStream;
function GetOffset(Index: Integer): Longint;
public
constructor Create;
destructor Destroy; override;
procedure ReadFile(Name: String);
procedure Flush;
function GetSize: Longint;
function GetSegmentAsStream(Index: Integer; var outStream: TStream): Longint;
function GetSegmentAsBitmap(Index: Integer; var Image: TBitmap): Boolean;
//function GetSegmentAsJPEG(Index: Integer; var Image: TJPEGImage): Boolean;
//function GetJPEGSegmentAsBitmap(Index: Integer; var Image: TBitmap): Boolean;
function GetSegmentAsString(Index: Integer): String;
end;
implementation
// TMultiDataFile
constructor TMultiDataFile.Create;
begin
inherited Create;
Stream:=TMemoryStream.Create;
end;
destructor TMultiDataFile.Destroy;
begin
Stream.Free;
inherited Destroy;
end;
procedure TMultiDataFile.ReadFile(Name: String);
var
inStream: TFileStream;
begin
if FileExists(Name) then begin
try
inStream:=TFileStream.Create(Name,fmOpenRead);
Stream.Clear;
Stream.Seek(0,soFromBeginning);
Stream.CopyFrom(inStream,inStream.Size);
FileClose(inStream.Handle);
finally
// inStream.Free;
end;
end
else raise Exception.Create('File '+Name+' not found.');
end;
procedure TMultiDataFile.Flush;
begin
Stream.Clear;
end;
function TMultiDataFile.GetSize: Longint;
begin
GetSize:=Stream.Size;
end;
function TMultiDataFile.GetOffset(Index: Integer): Longint;
var
SegSz: Array[0..2] of Byte;
SegSize: Longint;
offs: Longint;
idx: Integer;
begin
Stream.Seek(0,soFromBeginning);
if GetSize>3 then begin
idx:=-1;
offs:=-3;
SegSize:=0;
repeat
Inc(idx);
offs:=offs+3+SegSize;
Stream.Seek(offs,soFromBeginning);
Stream.Read(SegSz,3);
SegSize:=SegSz[0]+SegSz[1]*$100+SegSz[2]*$10000;
until (SegSize=0) or (idx=Index);
if (idx=Index) and (SegSize<>0) then GetOffset:=offs else GetOffset:=-1;
end
else GetOffset:=-1;
end;
function TMultiDataFile.GetSegmentAsStream(Index: Integer; var outStream: TStream): Longint;
var
SegSz: Array[0..2] of Byte;
Offs: Longint;
SegSize: Longint;
begin
Offs:=GetOffset(Index);
SegSize:=0;
if Offs>-1 then begin
Stream.Seek(Offs,soFromBeginning);
Stream.Read(SegSz,3);
SegSize:=SegSz[0]+SegSz[1]*$100+SegSz[2]*$10000;
Stream.Seek(Offs+3,soFromBeginning);
outStream.Seek(0,soFromBeginning);
outStream.CopyFrom(Stream,SegSize);
end;
GetSegmentAsStream:=SegSize;
end;
function TMultiDataFile.GetSegmentAsBitmap(Index: Integer; var Image: TBitmap): Boolean;
var
bmpStream: TStream;
BytesRead: Longint;
begin
bmpStream:=TMemoryStream.Create;
BytesRead:=GetSegmentAsStream(Index,bmpStream);
if BytesRead>0 then begin
GetSegmentAsBitmap:=True;
try
bmpStream.Seek(0,soFromBeginning);
Image.LoadFromStream(bmpStream);
except
on Exception do GetSegmentAsBitmap:=False;
end;
end
else GetSegmentAsBitmap:=False;
bmpStream.Free;
end;
{
function TMultiDataFile.GetSegmentAsJPEG(Index: Integer; var Image: TJPEGImage): Boolean;
var
jpegStream: TStream;
BytesRead: Longint;
begin
jpegStream:=TMemoryStream.Create;
BytesRead:=GetSegmentAsStream(Index,jpegStream);
Image.JPEGNeeded;
if BytesRead>0 then begin
try
GetSegmentAsJPEG:=True;
jpegStream.Seek(0,soFromBeginning);
Image.LoadFromStream(jpegStream);
except
on Exception do GetSegmentAsJPEG:=False;
end;
end
else GetSegmentAsJPEG:=False;
jpegStream.Free;
end;
function TMultiDataFile.GetJPEGSegmentAsBitmap(Index: Integer; var Image: TBitmap): Boolean;
var
jpegImage: TJPEGImage;
Success: Boolean;
begin
jpegImage:=TJPEGImage.Create;
Success:=GetSegmentAsJPEG(Index,jpegImage);
if Success then begin
try
Image.Assign(jpegImage);
except
on Exception do Success:=False;
end;
end;
jpegImage.Free;
GetJPEGSegmentAsBitmap:=Success;
end;
}
function TMultiDataFile.GetSegmentAsString(Index: Integer): String;
var
DataStream: TStream;
StrStream: TStringStream;
begin
try
DataStream:=TMemoryStream.Create;
StrStream:=TStringStream.Create('');
GetSegmentAsStream(Index,DataStream);
StrStream.CopyFrom(DataStream,0);
GetSegmentAsString:=Copy(StrStream.DataString,1,StrStream.Size);
finally
StrStream.Free;
DataStream.Free;
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -