Position属性的定义中包含了两个读写控制方法GetPosition和SetPosition:
TWriter = class(TFiler)
private
FRootAncestor: TComponent;
…
function GetPosition: Longint;
procedure SetPosition(Value: Longint)
public
…
property Position: Longint read GetPosition write SetPosition;
property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
end;
GetPosition和SetPosition方法实现如下
function TWriterGetPosition: Longint;
begin
Result := FStreamPosition + FBufPos;
end;
procedure TWriterSetPosition(Value: Longint)
var
StreamPosition: Longint;
begin
StreamPosition := FStreamPosition;
{ 只清除越界的缓沖区 }
if (Value < StreamPosition) or (Value > StreamPosition + FBufPos) then
begin
WriteBuffer;
FStreamPosition := Value;
end
else FBufPos := Value StreamPosition;
end;
WriteBuffer是TWriter对象定义的私有方法它的作用是将Writer 对象内部缓沖区中的有效数据写入流中并将FBufPos置为Writer对象的FlushBuffer对象就是用WriteBuffer方法刷新缓沖区
在SetPosition方法中如果Value值超出了边界(FStreamPositionFStreamPosition + FBufPos)就将缓沖区中的内容写入流重新设置缓沖区在流中的相对位置否则就只是移动FBufPos指针
TWriter方法的实现
⑴ WriteListBegin和WriteListEnd的实现
这两个方法都是用于写连续若干个相同类型的值WriteListBegin写入VaList标志WriteListEnd写入VaNull标志
procedure TWriterWriteListBegin;
begin
WriteValue(vaList)
end;
procedure TWriterWriteListEnd;
begin
WriteValue(vaNull)
end;
这两个方法都调用TWriter对象的WriteValue方法该方法主要用于写入TValueType类型的值
procedure TWriterWriteValue(Value: TValueType)
begin
Write(Value SizeOf(Value))
end;
⑵ 简单数据类型的写入
简单数据类型指的是整型字符型字符串型浮点型布尔型等TWriter对象都定义了相应的写入方法
WriteInteger方法用于写入整型数据
procedure TWriterWriteInteger(Value: Longint)
begin
if (Value >= ) and (Value <= ) then
begin
WriteValue(vaInt)
Write(Value SizeOf(Shortint))
end else
if (Value >= ) and (Value <= ) then
begin
WriteValue(vaInt)
Write(Value SizeOf(Smallint))
end else
begin
WriteValue(vaInt)
Write(Value SizeOf(Longint))
end;
end;
WriteInteger方法将整型数据分为位位和位三种并分别用vaIntvaInt和VaInt
WriteBoolean用于写入布尔型数据
procedure TWriterWriteBoolean(Value: Boolean)
begin
if Value then
WriteValue(vaTrue) else
WriteValue(vaFalse)
end;
与其它数据类型不同的是布尔型数据只使用了标志位是存储布尔值在标志位后没有数据
WriteFloat方法用于写入浮点型数据
procedure TWriterWriteFloat(Value: Extended)
begin
WriteValue(vaExtended)
Write(Value SizeOf(Extended))
end;
字符串TrueFalse和nil作为标识符传入是由于Delphi的特殊需要如果是TrueFalse和nil则写入VaTrueVaFalse和VaNil否则写入VaIdent标志接着以字符串形式写入标识符
WriteString方法用于写入字符串
procedure TWriterWriteString(const Value: string)
var
L: Integer;
begin
L := Length(Value)
if L <= then
begin
WriteValue(vaString)
Write(L SizeOf(Byte))
end else
begin
WriteValue(vaLString)
Write(L SizeOf(Integer))
end;
Write(Pointer(Value)^ L)
end;
Delphi的字符串类型有两种一种长度小于个字节另一种长度小于 个字节WriteString方法区分这两类情况存储字符串一种设置VaStirng标志另一种设置VaLString然后存储字符串的长度值最后存储字符串数据
[] [] [] []