Filer 串流開頭 4 位元組為標誌 TPF0,供 WriteSignature/ReadSignature 存取TValueType),列舉值:vaNull、vaList、vaInt8/16/32、vaExtended、vaString、vaIdent、vaFalse/True、vaBinary、vaSet、vaLString、vaNil、vaCollectionvaList 標識連續同型項目開始,vaNull 標識結束。寫入用 WriteListBegin/End,讀取用 ReadListBegin/End + EndOfListWriter 寫入先寫標誌再寫資料;Reader 讀取先讀標誌判斷,符合才讀資料否則異常。
直接繼承 TFiler,新增 Position、RootAncestor。
RootAncestor:private FRootAncestor,直接讀寫。
Position:含 GetPosition/SetPosition 存取控制。
function TWriter.GetPosition: Longint;
begin Result := FStream.Position + FBufPos; end;
procedure TWriter.SetPosition(Value: Longint);
var StreamPosition: Longint;
begin
StreamPosition := FStream.Position;
if (Value < StreamPosition) or (Value > StreamPosition + FBufPos) then
begin
WriteBuffer; { 刷新緩衝區 }
FStream.Position := Value;
end
else FBufPos := Value - StreamPosition;
end;
WriteBuffer 為私有方法,將緩衝區有效資料寫入串流並歸零 FBufPos。FlushBuffer 即呼叫 WriteBuffer。
邏輯:設定位置超出緩衝區範圍 → 刷新緩衝區並重設串流位置;否則僅移動緩衝區指標 FBufPos。