聲明
OnSetName事件發生在Read對象設置部件的Name屬性前
下面的OnSetName事件處理過程
procedure TForm
var Name: string)
var
ButtonPos: Integer;
begin
ButtonPos := Pos(
if ButtonPos <>
Name := Copy(Name
Copy(Name
end;
聲明
ReadValue方法讀取流中緊著的項目的類型
TValueType是枚舉類型
聲明
Nextvalue方法的作用也是返回Reader對象流中緊接著的項目的類型
聲明
ReadBoolean方法從Reader對象的流中讀取一個布爾值
聲明
ReadChar方法從Reader對象的流中讀取一個字符
聲明
ReadFloat方法從流中讀取浮點數
聲明
ReadIdent方法從流中讀取標識符
聲明
ReadInteger方法從流中讀取整型數字
聲明
ReadString方法從Reader對象的流中讀取一個字符串
Filer對象的作用主要是Delphi用來在DFM文件中讀寫各種類型的數據(包括部件對象)
在TReader對象的屬性實現中我們重點介紹Position的實現
Position屬性的定義了使用了讀寫控制
TReader = class(TFiler)
private
…
function GetPosition: Longint;
procedure SetPosition(Value: Longint)
public
…
property Position: Longint read GetPosition write SetPosition;
end;
Postition的讀寫控制方法如下
function TReader
begin
Result := FStream
end;
procedure TReader
begin
FStream
FBufPos :=
FBufEnd :=
end;
在TReader的父對象TFiler對象中介紹過FBufPos和FBufEnd變量
在GetPosition方法中可以看到Reader對象的Position值和Stream對象的Position值是不同的
這兩個方法是虛方法
它們在TReader中的實現如下
procedure TReader
WriteData: TWriterProc; HasData: Boolean)
begin
if CompareText(Name
begin
ReadData(Self)
FPropName :=
end;
end;
procedure TReader
ReadData
var
Stream: TMemoryStream;
Count: Longint;
begin
if CompareText(Name
begin
if ReadValue <> vaBinary then
begin
Dec(FBufPos)
SkipValue;
FCanHandleExcepts := True;
PropValueError;
end;
Stream := TMemoryStream
try
Read(Count
Stream
Read(Stream
FCanHandleExcepts := True;
ReadData(Stream)
finally
Stream
end;
FPropName :=
end;
end;
在兩個方法都將Name參數值與當前的屬性名比較
FlushBuffer方法用於清除Reader對象的內部緩沖區中的內容
procedure TReader
begin
FStream
FBufPos :=
FBufEnd :=
end;
這三個方法都是用於從Reader對象的流中讀取一連串的項目
procedure TReader
begin
CheckValue(vaList)
end;
procedure TReader
begin
CheckValue(vaNull)
end;
function TReader
begin
Result := ReadValue = vaNull;
Dec(FBufPos)
end;
項目表開始標志是VaList
[
From:http://tw.wingwit.com/Article/program/Delphi/201311/25093.html