程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第二十章-開發Delphi對象式數據管理功能(四)(3)

第二十章-開發Delphi對象式數據管理功能(四)(3)

編輯:Delphi

2. Defineproperty和DefineBinaryproperty方法的實現

這兩個方法是虛方法,在TFiler中是抽象方法,在TReader和TWriter對象中才有具體的實現。

它們在TReader中的實現如下:

procedure TReader.DefineProperty(const Name: string; ReadData: TReaderProc;

WriteData: TWriterProc; HasData: Boolean);

begin

if CompareText(Name, FPropName) = 0 then

begin

ReadData(Self);

FPropName := '';

end;

end;

procedure TReader.DefineBinaryProperty(const Name: string;

ReadData, WriteData: TStreamProc; HasData: Boolean);

var

Stream: TMemoryStream;

Count: Longint;

begin

if CompareText(Name, FPropName) = 0 then

begin

if ReadValue <> vaBinary then

begin

Dec(FBufPos);

SkipValue;

FCanHandleExcepts := True;

PropValueError;

end;

Stream := TMemoryStream.Create;

try

Read(Count, SizeOf(Count));

Stream.SetSize(Count);

Read(Stream.Memory^, Count);

FCanHandleExcepts := True;

ReadData(Stream);

finally

Stream.Free;

end;

FPropName := '';

end;

end;

在兩個方法都將Name參數值與當前的屬性名比較,如果相同則進行讀操作。在DefineBinaryproperty中,創建了一個內存流。先將數據讀到內存流中然後調用ReadData讀取數據。

3. FlushBuffer的實現

FlushBuffer方法用於清除Reader對象的內部緩沖區中的內容,保持Reader對象和流在位置(Position)上的同步,其實現如下:

procedure TReader.FlushBuffer;

begin

FStream.Position := FStream.Position - (FBufEnd - FBufPos);

FBufPos := 0;

FBufEnd := 0;

end;

4. ReadListBegin、ReadListEnd和EndOfList方法

這三個方法都是用於從Reader對象的流中讀取一連串的項目,並且這些項目都由WriteListBegin寫入的標志標定開始和WriteListEnd寫入標志,標定結束,在讀循環中用EndOfList進行判斷。它們是在Reader對象讀取流中數據時經常用於的。它們的實現如下:

procedure TReader.ReadListBegin;

begin

CheckValue(vaList);

end;

procedure TReader.ReadListEnd;

begin

CheckValue(vaNull);

end;

function TReader.EndOfList: Boolean;

begin

Result := ReadValue = vaNull;

Dec(FBufPos);

end;

項目表開始標志是VaList,項目表結束標志是VaNull,VaList和VaNull都是枚舉類型TValueType定義的常量。

它們實現中調用的CheckValue是TReader的私有方法,其實現如下:

procedure TReader.CheckValue(Value: TValueType);

begin

if ReadValue <> Value then

begin

Dec(FBufPos);

SkipValue;

PropValueError;

end;

end;

CheckValue方法的功能是檢測緊接著要讀的值是否是Value指定的類型。如果不是則跳過該項目並觸發一個SInvalidPropertyValue錯誤。

EndOfList函數只是簡單地判斷下一字節是否是VaNull將判斷結果返回,並將字節移回原來位置。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved