添加到TScrollBox的辅助方法不起作用

时间:2017-12-01 11:56:11

标签: delphi-2010

在我被指示开发的一个旧项目中,有一个类型为TScrollBox的字段。

FScroll   : TScrollBox;

为了能够处理导航按钮的事件,该类必须包含WM_GETDLGCODE消息处理程序。所以我创建了一个新类:

TScrollBoxArrowBtn = class(TScrollBox)
protected
  procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;

实施

procedure TScrollBoxArrowBtn.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
  Message.Result := DLGC_WANTARROWS;
end;

并用TScrollBoxArrowBtn替换了TScrollBox类型。

FScroll   : TScrollBoxArrowBtn;

组件开始响应按下箭头按钮。但是copy,delete,SelectAll方法停止了工作。发生这种情况是因为之前的开发人员添加了这样的验证方法:

"VariableName".ClassType = TScrollBox

我替换了它们进行验证:

"VariableName" is TScrollBox

这种编辑方法开始起作用。但我不确定这样的测试是否会在项目的其他地方应用。所以我决定离开

FScroll   : TScrollBox;

并使TScrollBoxArrowBtn成为帮助类:

TScrollBoxArrowBtn = class helper for TScrollBox
protected
  procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;

不幸的是这种方法不起作用。像"VariableName".ClassType = TScrollBox这样的验证开始完美,但项目停止响应事件箭头按钮。我做错了什么?

我确信我的IDE版本支持辅助方法。

1 个答案:

答案 0 :(得分:1)

我没有找到关于helpers类中的消息方法的具体答案,但我找到了解决问题的方法。另外,我了解了助手类的许多其他不良特性,最终说服我放弃使用它们。所以我的答案是 - 不要使用班助手。这时这是一个非常不稳定的工具。也许在未来它会得到改善。

现在关于我的决定。我担心,检查以下类型的问题:

"VariableName".ClassType = TScrollBox
合并先前创建的分支时再次出现

。所以我决定替换TScrollBox窗口过程。我在TScrollBox-field容器类中添加了字段,并在容器类中为TScrollBox-field添加了一个新的窗口过程:

TCADParamsGroupBlockBaseScheme = class (TCADGroupBlockParams)
.....................................................
protected

  Old_FScroll_WindowProc   : TWndMethod;
  procedure New_FScroll_WindowProc(var Message: TMessage);
.....................................................
end;

implementation

procedure TCADParamsGroupBlockBaseScheme.New_FScroll_WindowProc(var Message: 
TMessage);
begin
  //Для обработки событий нажатий Key_Up/Down/Left/Right в DoKeyDown
  if Message.Msg = WM_GETDLGCODE then
    Message.Result := DLGC_WANTARROWS
  else Old_FScroll_WindowProc(Message);
end;

在容器类的构造函数中,我将指针保存到旧的TScrollBox-field窗口过程并为其分配了一个新的窗口过程:

constructor TCADParamsGroupBlockBaseScheme.Create(const AOwner: TWinControl);
begin
...........................................
FScroll := TScrollBox.Create(FHost.Owner);

Old_FScroll_WindowProc := FScroll.WindowProc;
FScroll.WindowProc := New_FScroll_WindowProc;
............................................
end;