熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:開發Delphi對象式數據管理功能(三)[3]

2013-11-23 17:47:52  來源: Delphi編程 

  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然後存儲字符串的長度值最後存儲字符串數據

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25098.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.