-1

我有一些 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 等)的内部运作没有足够的了解来回答这些问题:

  1. 这安全吗?
  2. 有没有更好的方法(类助手有它们的缺点,参见例如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。我把它留在里面是因为它需要重写一个大问题,而且它对答案不是必需的。

4

2 回答 2

2

这些处理程序都有一些相同的局部变量

您也可以简单地将这些局部变量转换为 Web 模块的私有字段。

于 2013-08-14T10:37:31.410 回答
0

这是安全的,但不一定是解决所提出问题的最佳选择。

在你的位置,我会去继承。我将从 TWebModule 创建一个子类,并添加所有其他 TWebModule 在该类中具有的所有通用功能。然后我会将其他 TWebModules 的当前祖先更改为这个新的祖先。

该方法的好处是您可以缓慢而谨慎地采用它。您可以为您的应用程序创建基本的 TWebModule,为其添加一些行为并选择其他 TWebModule 中的一个来体验继承优势。您可以调整、重新设计和测试您选择的单个 TWebModule。

之后,您可以继续进行一次又一次,直到完成所有操作。

于 2013-08-14T10:51:30.047 回答