首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 動態 DFM 技術:超媒體系統腳本語言設計與元件擴展策略

     編輯:Delphi

動態 DFM 應用之二:超媒體系統腳本語言設計

DFM 檔案可視為超媒體卡片,DFM 腳本能表達多種控制項(媒體物件),具物件導向表達、可編輯、可轉換為 DFM,堪稱優良腳本語言形式。ObjectBinaryToText/ObjectTextToBinary 實現元件與 DFM 腳本互轉;ObjectResourceToText/ObjectTextToResource 實現 DFM 檔案與腳本互轉。

卡片與腳本互轉代碼

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;

procedure TScriptForm.ScriptToCard;
var In, Out: TStream;
begin
  In := TMemoryStream.Create; Out := TMemoryStream.Create;
  try
    ScriptForm.ScriptEdit.Lines.SaveToStream(In);
    ObjectTextToResource(In, Out);
    In.ReadComponentRes(DesignWin);
  finally In.Free; Out.Free; end;
end;

以上為表單級轉換,ObjectBinaryToText/ObjectTextToBinary 可細化至元件級,支援媒體物件級編輯。

超媒體編輯系統與動態 DFM 擴展

常規 DFM 處理難滿足超媒體特殊需求(如連結)。兩大策略:

  1. 繼承開發新元件,增加專屬屬性方法,存取轉換沿用常規 DFM
  2. 擴展 DFM 結構,任意存取轉換元件與 DFM(需大幅修改存取邏輯)

本文探討策略二:降低顆粒度從表單級至元件級。

擴展 DFM 存取範例

寫入:逐元件寫入媒體 ID 与元件資料

with TWriter.Create(FileStream, 4096) do
try
  for I := 0 to DesignWin.ControlCount - 1 do
  begin
    WriteInteger(MMID[I]);
    WriteRootComponent(DesignWin.Controls[I]);
  end;
  WriteListEnd;
finally Free; end;

讀取:依媒體 ID 分派建立元件並重連事件

with TReader.Create(FileStream, 4096) do
try
  while not EndOfList do
    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;
finally Free; end;

SetMethodProp 重連事件,亦可用 TReader.OnFindMethod 實現。腳本擴展同理,額外將媒體資訊轉文本插入元件腳本描述中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved