其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:开发Delphi对象式数据管理功能(三)[3]


发布日期:2018年05月14日
 
DELPHI基础教程:开发Delphi对象式数据管理功能(三)[3]

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;

字符串TrueFalsenil作为标识符传入是由于Delphi的特殊需要如果是TrueFalsenil则写入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然后存储字符串的长度值最后存储字符串数据

[] [] [] []

               

上一篇:DELPHI基础教程:开发Delphi对象式数据管理功能(三)[4]

下一篇:DELPHI基础教程:Delphi开发数据库应用程序概述(二)[2]