我有大约20多个TWebActionItems以及相关的OnAction事件处理程序:
procedure TWebModuleWebServices.WebModuleWebServicesTTLoginAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
在TWebModuleWebServices =类(TWebModule)上。 (注意:发件人是TWebActionItem)
这些处理程序都有一些相同的局部变量,'初始化'和'终结'代码。
我已设法将一些代码移动到TWebModuleWebServices的AfterDispatch和BeforeDispatch处理程序。
如果我想移动更常见的代码,我需要在BeforeDispatch中的(对象)变量中存储数据(并在OnAction处理程序和AfterDispatch中访问这些变量)。
由于AfterDispatch和BeforeDispatch具有与OnAction处理程序相同的Sender: TObject; Request: TWebRequest; Response: TWebResponse;
参数,我正在考虑为TWebActionItem或TWebRequest编写类助手。
类助手不允许有数据成员(“方法或属性后不允许使用E2169字段定义”),但有一个trick with class vars/constructors/destructors。
在本文中,作者通过使用TDictionary:
TPanelHelper2 = class helper for TPanel
public
class var
MetaData: TDictionary<TPanel, string>; //store some strings - an example
procedure PutData(aData: string);
function ReadData: string;
class constructor SetUp;
class destructor TearDown;
end;
implementation
procedure TPanelHelper2.PutData(aData: string);
begin
MetaData.AddOrSetValue(Self, aData);
end;
function TPanelHelper2.ReadData: string;
begin
if MetaData.ContainsKey(Self) then
Result:=MetaData.Items[Self]
else
Result:=''; //or whatever
end;
class constructor TPanelHelper2.SetUp;
begin
MetaData:=TDictionary<TPanel, string>.Create;
end;
class destructor TPanelHelper2.TearDown;
begin
MetaData.Free;
end;
要使用此功能,请在表单上放置2个面板,然后:
Panel1.PutData('panel1string');
Panel2.PutData('panel2string');
ShowMessage('Panel 1 metadata: ' + Panel1.ReadData);
ShowMessage('Panel 2 metadata: ' + Panel2.ReadData);
一个很好的技巧,但它让我想知道我是否可以在我的TWebModuleWebServices上执行此操作。我对Delphi(VMT等)的内部工作原理没有足够的了解来回答这些问题:
修改:
上述问题存在错误:
由于AfterDispatch和BeforeDispatch具有相同的Sender:TObject;要求:TWebRequest;回复:TWebResponse; OnAction处理程序的参数不正确。
发件人是AfterDispath / BeforeDispatch的TWebModuleWebservices和OnAction处理程序的TWebActionItem。我要离开它,因为它需要重写一个大问题而且对答案来说并不重要。
答案 0 :(得分:2)
这些处理程序都有一些相同的局部变量
您也可以将这些局部变量简单地转换为Web模块的私有字段。
答案 1 :(得分:0)
这是安全的,但不一定是提出问题的最佳选择。
在你的位置,我会去继承。我将从TWebModule创建一个子类,并添加所有其他TWebModule在此类中具有的所有常规功能。然后我会将其他TWebModules的当前祖先更改为新的。
这种方法的好处是你可以慢慢地,谨慎地采用它。您可以为应用程序创建基本TWebModule,为其添加一些行为,并选择其中一个其他TWebModule来体验继承优势。您可以调整,重新设计和测试您选择的单个TWebModule。
之后,你可以选择另一个和另一个,直到完成所有工作。