我有一些 20+ TWebActionItems 与相关的 OnAction 事件处理程序:
procedure TWebModuleWebServices.WebModuleWebServicesTTLoginAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
在 TWebModuleWebServices = 类(TWebModule)上。(注:Sender 是一个 TWebActionItem)
这些处理程序都有一些相同的局部变量,“初始化”和“终结”代码。
我已设法将一些代码移至 TWebModuleWebServices 的 AfterDispatch 和 BeforeDispatch 处理程序。
如果我想移动更常见的代码,我需要将数据存储在 BeforeDispatch 的(对象)变量中(并在 OnAction 处理程序和 AfterDispatch 中访问这些变量)。
由于 AfterDispatch 和 BeforeDispatch 具有与Sender: TObject; Request: TWebRequest; Response: TWebResponse;
OnAction 处理程序相同的参数,我正在考虑为 TWebActionItem 或 TWebRequest 编写一个类帮助程序。
类助手不允许有数据成员(“E2169 不允许在方法或属性之后定义字段”),但是类 vars/constructors/destructors 有一个技巧。
在本文中,作者通过使用 TDictionary 来规避类 var 是全局的这一事实:
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 等)的内部运作没有足够的了解来回答这些问题:
- 这安全吗?
- 有没有更好的方法(类助手有它们的缺点,参见例如Class Helpers Go and NoGo in Understanding Delphi Class (and Record) Helpers)?
编辑:
上面的问题有一个错误:
因为 AfterDispatch 和 BeforeDispatch 有相同的 Sender: TObject; 请求:TWebRequest;响应:TWebResponse;OnAction 处理程序的参数
不正确。
Sender 是 AfterDispath/BeforeDispatch 的 TWebModuleWebservices 和 OnAction 处理程序的 TWebActionItem。我把它留在里面是因为它需要重写一个大问题,而且它对答案不是必需的。