3. 動(dòng)態(tài)DFM文件應(yīng)用之二:超媒體系統(tǒng)腳本語(yǔ)言設(shè)計(jì)
超媒體腳本語(yǔ)言設(shè)計(jì)是超媒體系統(tǒng)設(shè)計(jì)的重要內(nèi)容。腳本語(yǔ)言必須能夠表達(dá)卡片中的多種媒體對(duì)象,必須是可編程,可理解的,必須是可執(zhí)行的,應(yīng)該可以由腳本語(yǔ)言生成超媒體系統(tǒng)中的卡片和鏈。
DFM文件可以看作是超媒體系統(tǒng)的卡片,DFM腳本能夠表達(dá)DFM文件中的多種控制,也就是說能夠表達(dá)卡片中的多種媒體對(duì)象,再加上DFM腳本的對(duì)象式表達(dá),可編輯性,可轉(zhuǎn)換為DFM文件,因此用作超媒體系統(tǒng)腳本語(yǔ)言較好的形式。
ObjectBinaryToText和ObjectTextToBinary過程提供了在部件和DFM腳本之間相互轉(zhuǎn)化的功能,ObjectResourceToText和ObjectTextToResoure過程提供了DFM文件和DFM腳本之間相互轉(zhuǎn)化的功能。這樣就可以在應(yīng)用程序中自如實(shí)現(xiàn)超媒體卡片和超媒體腳本語(yǔ)言相互轉(zhuǎn)化。
下面是卡片和腳本語(yǔ)言相互轉(zhuǎn)化的程序:
procedure TMDIChild.CardToScript;
var
In, Out: TStream;
begin
In := TMemoryStream.Create;
Out := TMemoryStream.Create;
try
In.WriteComponentRes(Self.ClassName, Self);
ObjectResourceToText(In, out);
ScriptForm.ScriptEdit.Lines.LoadFromStream(Out);
finally
In.Free;
Out.Free;
end;
end;
ScriptEdit是個(gè)文本編輯器,它的Lines屬性是TStrings類型的對(duì)象。
procedure TScriptForm.ScriptToCard;
var
In, Out: TStream;
begin
In := TMemoryStream.Create;
Out := TMemoryStream.Create;
try
ScriptForm.ScriptEdit.Lines.SaveToFromStream(In);
ObjectTextToResource(In, out);
In.ReadComponentRes(DesignWin);
finally
In.Free;
Out.Free;
end;
end;
這兩段程序是對(duì)整個(gè)卡片,即窗體級(jí),進(jìn)行轉(zhuǎn)換的。ObjectBinaryToText和ObjectTextToBinary過程可以細(xì)化到部件級(jí)的轉(zhuǎn)換。因此超媒體腳本語(yǔ)言的編輯可以細(xì)化到媒體對(duì)象級(jí)。
4. 超媒體編輯和表現(xiàn)系統(tǒng)與動(dòng)態(tài)DFM文件的擴(kuò)展
超媒體系統(tǒng)的媒體編輯與卡片管理有其特殊的需求,比如鏈接需求。這時(shí)采用已有的窗體部件和媒體部件并按常規(guī)的DFM文件處理就顯得力不從心了。解決這個(gè)矛盾有兩套方案:
● 利用Delphi部件開發(fā)技術(shù),繼承和開發(fā)新的部件增加新的超媒體特有的屬性和處理方法
● 擴(kuò)展DFM文件結(jié)構(gòu),使之能按自己的需要任意地存取和轉(zhuǎn)換部件和DFM文件
前者是充分利用Delphi的面向?qū)ο蟛考_發(fā)技術(shù),在存取和轉(zhuǎn)換等處理上仍舊與常規(guī)DFM文件相同。而后者需要DFM的存取和轉(zhuǎn)換上作比較大的改動(dòng)。下文介紹擴(kuò)展DFM文件的思路。
擴(kuò)展動(dòng)態(tài)DFM文件的總體思路是降低處理操作的數(shù)據(jù)的顆粒度,即從原先窗體級(jí)降低到部件級(jí)。
下面是存取操作的擴(kuò)展示范:
var
FileStream: TStream;
I: Integer;
begin
FileStream := TFileStream.Create('OverView.Crd', fmOpenWrite);
With TWriter.Create(FileStream, 4096) do
try
for I := 0 to DesignWin.ControlCount - 1 do
begin
WriteInteger(MMID[i]);
WriteRootComponent(DesignWin.Controls[i]);
{ 寫相應(yīng)媒體擴(kuò)展信息 }
……
end;
WriteListEnd;
finally.
Free;
end;
FileStream.Free;
end;
WriteInteger(MMID[i])語(yǔ)句是寫入媒體標(biāo)識(shí)。
下面是相應(yīng)的讀擴(kuò)展DFM的程序:
var
PropInfo: PPropInfo;
Method : TMethod;
FileStream: TStream;
I: Integer;
begin
FileStream := TFileStream.Create('OverView.Crd', fmOpenRead);
With TReader.Create(FileStream, 4096) do
try
while not EndOfList do
begin
case ReadInteger of
IDText: begin
Ctrl := TControl(ReadRootComponent(nil));
PropInfo := GetPropInfo(Ctrl.ClassInfo, 'OnClick');
Method.Code:= Self.MethodAddress(MethodName);
Method.Data := Self;
if Method.Code <> nil then
SetMethodProp(Ctrl, PropInfo, Method);
DesignWin.InsertControl(Ctrl);
end;
IDImage:
……
end;
……
WriteListEnd;
end;
finally.
Free;
end;
FileStream.Free;
end;
SetMethodProp過程是用于重新聯(lián)接控制和它的事件處理過程。類似的功能還可以用TReader對(duì)象的OnFindMethod事件的處理過程來實(shí)現(xiàn)。
實(shí)現(xiàn)腳本語(yǔ)言擴(kuò)展的基本方法與存取擴(kuò)展類似,但它還要加擴(kuò)展媒體信息轉(zhuǎn)換為文本,并插入到部件的腳本描述中。
超媒體腳本語(yǔ)言設(shè)計(jì)是超媒體系統(tǒng)設(shè)計(jì)的重要內(nèi)容。腳本語(yǔ)言必須能夠表達(dá)卡片中的多種媒體對(duì)象,必須是可編程,可理解的,必須是可執(zhí)行的,應(yīng)該可以由腳本語(yǔ)言生成超媒體系統(tǒng)中的卡片和鏈。
DFM文件可以看作是超媒體系統(tǒng)的卡片,DFM腳本能夠表達(dá)DFM文件中的多種控制,也就是說能夠表達(dá)卡片中的多種媒體對(duì)象,再加上DFM腳本的對(duì)象式表達(dá),可編輯性,可轉(zhuǎn)換為DFM文件,因此用作超媒體系統(tǒng)腳本語(yǔ)言較好的形式。
ObjectBinaryToText和ObjectTextToBinary過程提供了在部件和DFM腳本之間相互轉(zhuǎn)化的功能,ObjectResourceToText和ObjectTextToResoure過程提供了DFM文件和DFM腳本之間相互轉(zhuǎn)化的功能。這樣就可以在應(yīng)用程序中自如實(shí)現(xiàn)超媒體卡片和超媒體腳本語(yǔ)言相互轉(zhuǎn)化。
下面是卡片和腳本語(yǔ)言相互轉(zhuǎn)化的程序:
procedure TMDIChild.CardToScript;
var
In, Out: TStream;
begin
In := TMemoryStream.Create;
Out := TMemoryStream.Create;
try
In.WriteComponentRes(Self.ClassName, Self);
ObjectResourceToText(In, out);
ScriptForm.ScriptEdit.Lines.LoadFromStream(Out);
finally
In.Free;
Out.Free;
end;
end;
ScriptEdit是個(gè)文本編輯器,它的Lines屬性是TStrings類型的對(duì)象。
procedure TScriptForm.ScriptToCard;
var
In, Out: TStream;
begin
In := TMemoryStream.Create;
Out := TMemoryStream.Create;
try
ScriptForm.ScriptEdit.Lines.SaveToFromStream(In);
ObjectTextToResource(In, out);
In.ReadComponentRes(DesignWin);
finally
In.Free;
Out.Free;
end;
end;
這兩段程序是對(duì)整個(gè)卡片,即窗體級(jí),進(jìn)行轉(zhuǎn)換的。ObjectBinaryToText和ObjectTextToBinary過程可以細(xì)化到部件級(jí)的轉(zhuǎn)換。因此超媒體腳本語(yǔ)言的編輯可以細(xì)化到媒體對(duì)象級(jí)。
4. 超媒體編輯和表現(xiàn)系統(tǒng)與動(dòng)態(tài)DFM文件的擴(kuò)展
超媒體系統(tǒng)的媒體編輯與卡片管理有其特殊的需求,比如鏈接需求。這時(shí)采用已有的窗體部件和媒體部件并按常規(guī)的DFM文件處理就顯得力不從心了。解決這個(gè)矛盾有兩套方案:
● 利用Delphi部件開發(fā)技術(shù),繼承和開發(fā)新的部件增加新的超媒體特有的屬性和處理方法
● 擴(kuò)展DFM文件結(jié)構(gòu),使之能按自己的需要任意地存取和轉(zhuǎn)換部件和DFM文件
前者是充分利用Delphi的面向?qū)ο蟛考_發(fā)技術(shù),在存取和轉(zhuǎn)換等處理上仍舊與常規(guī)DFM文件相同。而后者需要DFM的存取和轉(zhuǎn)換上作比較大的改動(dòng)。下文介紹擴(kuò)展DFM文件的思路。
擴(kuò)展動(dòng)態(tài)DFM文件的總體思路是降低處理操作的數(shù)據(jù)的顆粒度,即從原先窗體級(jí)降低到部件級(jí)。
下面是存取操作的擴(kuò)展示范:
var
FileStream: TStream;
I: Integer;
begin
FileStream := TFileStream.Create('OverView.Crd', fmOpenWrite);
With TWriter.Create(FileStream, 4096) do
try
for I := 0 to DesignWin.ControlCount - 1 do
begin
WriteInteger(MMID[i]);
WriteRootComponent(DesignWin.Controls[i]);
{ 寫相應(yīng)媒體擴(kuò)展信息 }
……
end;
WriteListEnd;
finally.
Free;
end;
FileStream.Free;
end;
WriteInteger(MMID[i])語(yǔ)句是寫入媒體標(biāo)識(shí)。
下面是相應(yīng)的讀擴(kuò)展DFM的程序:
var
PropInfo: PPropInfo;
Method : TMethod;
FileStream: TStream;
I: Integer;
begin
FileStream := TFileStream.Create('OverView.Crd', fmOpenRead);
With TReader.Create(FileStream, 4096) do
try
while not EndOfList do
begin
case ReadInteger of
IDText: begin
Ctrl := TControl(ReadRootComponent(nil));
PropInfo := GetPropInfo(Ctrl.ClassInfo, 'OnClick');
Method.Code:= Self.MethodAddress(MethodName);
Method.Data := Self;
if Method.Code <> nil then
SetMethodProp(Ctrl, PropInfo, Method);
DesignWin.InsertControl(Ctrl);
end;
IDImage:
……
end;
……
WriteListEnd;
end;
finally.
Free;
end;
FileStream.Free;
end;
SetMethodProp過程是用于重新聯(lián)接控制和它的事件處理過程。類似的功能還可以用TReader對(duì)象的OnFindMethod事件的處理過程來實(shí)現(xiàn)。
實(shí)現(xiàn)腳本語(yǔ)言擴(kuò)展的基本方法與存取擴(kuò)展類似,但它還要加擴(kuò)展媒體信息轉(zhuǎn)換為文本,并插入到部件的腳本描述中。