stream 读取整数(100分)

  • 主题发起人 主题发起人 lkjin
  • 开始时间 开始时间
L

lkjin

Unregistered / Unconfirmed
GUEST, unregistred user!
能不能在stream二进制文件中读取整数
 
可以的。声明个integer
 
var i:integer;
begin
...
stream1.read(i,sizeOf(Integer));//或者stream1.read(i,4);
...
end;
 
FastReport关于流的操作函数,包括Byte, Word, Integer, String, Font等数据的读和写方法,我一直在用

function frSetFontStyle(Style: Integer): TFontStyles;
begin
Result := [];
if (Style and $1) <> 0 then Result := Result + [fsItalic];
if (Style and $2) <> 0 then Result := Result + [fsBold];
if (Style and $4) <> 0 then Result := Result + [fsUnderLine];
if (Style and $8) <> 0 then Result := Result + [fsStrikeOut];
end;

function frGetFontStyle(Style: TFontStyles): Integer;
begin
Result := 0;
if fsItalic in Style then Result := Result or $1;
if fsBold in Style then Result := Result or $2;
if fsUnderline in Style then Result := Result or $4;
if fsStrikeOut in Style then Result := Result or $8;
end;

procedure frReadMemo(Stream: TStream; l: TStrings);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
Stream.Read(n, 2);
if n > 0 then
repeat
Stream.Read(n, 2);
SetLength(s, n);
if n > 0 then
Stream.Read(s[1], n);
l.Add(s);
Stream.Read(b, 1);
until b = 0
else
Stream.Read(b, 1);
end;

procedure frWriteMemo(Stream: TStream; l: TStrings);
var
s: String;
i: Integer;
n: Word;
b: Byte;
begin
n := l.Count;
Stream.Write(n, 2);
for i := 0 to l.Count - 1 do
begin
s := l;
n := Length(s);
Stream.Write(n, 2);
if n > 0 then
Stream.Write(s[1], n);
b := 13;
if i <> l.Count - 1 then Stream.Write(b, 1);
end;
b := 0;
Stream.Write(b, 1);
end;

function frReadString(Stream: TStream): String;
var
s: String;
n: Word;
b: Byte;
begin
Stream.Read(n, 2);
SetLength(s, n);
if n > 0 then
Stream.Read(s[1], n);
Stream.Read(b, 1);
Result := s;
end;

procedure frWriteString(Stream: TStream; s: String);
var
b: Byte;
n: Word;
begin
n := Length(s);
Stream.Write(n, 2);
if n > 0 then
Stream.Write(s[1], n);
b := 0;
Stream.Write(b, 1);
end;

procedure frReadMemo22(Stream: TStream; l: TStrings);
var
s: String;
i: Integer;
b: Byte;
begin
SetLength(s, 4096);
l.Clear;
i := 1;
repeat
Stream.Read(b,1);
if (b = 13) or (b = 0) then
begin
SetLength(s, i - 1);
if not ((b = 0) and (i = 1)) then l.Add(s);
SetLength(s, 4096);
i := 1;
end
else if b <> 0 then
begin
s := Chr(b);
Inc(i);
if i > 4096 then
SetLength(s, Length(s) + 4096);
end;
until b = 0;
end;

function frReadString22(Stream: TStream): String;
var
s: String;
i: Integer;
b: Byte;
begin
SetLength(s, 4096);
i := 1;
repeat
Stream.Read(b, 1);
if b = 0 then
SetLength(s, i - 1)
else
begin
s := Chr(b);
Inc(i);
if i > 4096 then
SetLength(s, Length(s) + 4096);
end;
until b = 0;
Result := s;
end;

function frReadBoolean(Stream: TStream): Boolean;
begin
Stream.Read(Result, 1);
end;

function frReadByte(Stream: TStream): Byte;
begin
Stream.Read(Result, 1);
end;

function frReadWord(Stream: TStream): Word;
begin
Stream.Read(Result, 2);
end;

function frReadInteger(Stream: TStream): Integer;
begin
Stream.Read(Result, 4);
end;

{$HINTS OFF}
procedure frReadFont(Stream: TStream; Font: TFont);
var
w: Word;
begin
Font.Name := frReadString(Stream);
Font.Size := frReadInteger(Stream);
Font.Style := frSetFontStyle(frReadWord(Stream));
Font.Color := frReadInteger(Stream);
w := frReadWord(Stream);
{$IFNDEF Delphi2}
Font.Charset := w;
{$ENDIF}
end;
{$HINTS ON}

procedure frWriteBoolean(Stream: TStream; Value: Boolean);
begin
Stream.Write(Value, 1);
end;

procedure frWriteByte(Stream: TStream; Value: Byte);
begin
Stream.Write(Value, 1);
end;

procedure frWriteWord(Stream: TStream; Value: Word);
begin
Stream.Write(Value, 2);
end;

procedure frWriteInteger(Stream: TStream; Value: Integer);
begin
Stream.Write(Value, 4);
end;

{$HINTS OFF}
procedure frWriteFont(Stream: TStream; Font: TFont);
var
w: Word;
begin
frWriteString(Stream, Font.Name);
frWriteInteger(Stream, Font.Size);
frWriteWord(Stream, frGetFontStyle(Font.Style));
frWriteInteger(Stream, Font.Color);
w := 0;
{$IFNDEF Delphi2}
w := Font.Charset;
{$ENDIF}
frWriteWord(Stream, w);
end;
{$HINTS ON}
 
to tonmy:
为何贴这么多代码?我们的空间也是钱买的!
一句话能解决的,何必说半小时?!!!
 
谢谢,问题已解决
 
后退
顶部