全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)Delphi輔導(dǎo)講義 221

字號(hào):

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)換為文本,并插入到部件的腳本描述中。