有没有办法缩短is / as构造?

约翰

我想缩短以下代码:

procedure TAddInModule.FinanBladCalculate(Sender: TObject);
begin
  if (Sender is TExcelWorksheet) then begin
    (Sender as TExcelWorksheet).Tag:= TagCalculationDone;
    // or
    TExcelWorksheet(Sender).Tag:= TagCalculationDone;
  end
  else {do nothing}
end;

为了安全起见,我做了很多这样的检查。
但是,这只是为了进行安全广播而进行的大量键入操作。

有没有一种方法可以缩短这一时间并获得相同的结果?我当时在考虑使用一种通过记录和运算符重载的通用解决方案。

以下代码有效:

program Project41;
{$APPTYPE CONSOLE} 
uses
  System.SysUtils,VCL.Forms;

type
  AsIs<T: class> = record
    Data: T;
    class operator Implicit(const a: TObject): AsIs<T>;
    function OK: boolean;
  end;

function AsIs<T>.OK: boolean;
begin
  Result:= Assigned(Data);
end;

class operator AsIs<T>.Implicit(const a: TObject): AsIs<T>;
begin
  if a is T then Result.Data:= T(a)
  else Result.Data:= nil;
end;

procedure Demonstrate(Sender: TObject);
var
  Test: AsIs<TApplication>;
begin //Something silly to demonstrate
  Test:= Sender;
  if Test.OK then Test.Data.HandleMessage;
end;

begin 
  Demonstrate(Application);
end.

有没有办法使它更短?就像是:

  Test(App).Data.HandleMessage;
  //or even
  Test(App).HandleMessage;
阿里奥奇

有一种观点认为,就像MVC模式一样,代码应将GUI和逻辑分开,因此事件处理程序不应包含任何实际工作,而应仅将用户的活动路由到实际的业务逻辑实现者,例如

procedure TAddInModule.Button1Click(Sender: TObject);
begin
  if (Sender is TExcelWorksheet) then 
     FinanBladCalculate(TExcelWorksheet(Sender));
end;

procedure TAddInModule.FinanBladCalculate(Sheet: TExcelWorksheet);
begin
  Sheet.Tag:= TagCalculationDone;
  ...
  ...
  ...
end;

这样,以后便可以在FinanBladCalculate集中并包含实际工作负载的情况下调用更多事件(例如菜单,热键,手势等)。

这种模式也许可以在一定程度上使用该记录

procedure TAddInModule.Button1Click(Sender: TObject);
begin
  FinanBladCalculate(Sender);
end;

procedure TAddInModule.MenuItem1Click(Sender: TObject);
begin
  FinanBladCalculate(Sender);
end;

procedure TAddInModule.CheckBox1Check(Sender: TObject);
begin
  FinanBladCalculate(Sender);
end;

....

procedure TAddInModule.FinanBladCalculate(const Sheet: AsIs<TExcelWorksheet>);
begin
  if Sheet.Data = nil then exit;

  Sheet.Data.Tag:= TagCalculationDone;
  ...
  ...
  ...
end;

如果您有许多可以启动某些工作并具有不同事件处理程序的GUI元素,那么这可能很有意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法引用类型的构造函数?

来自分类Dev

有没有办法使“构造函数”成为JS对象中的有效键?

来自分类Dev

有没有办法有一个ArrayList元素等于类的构造函数?

来自分类Dev

有没有办法检测const合格对象的构造?

来自分类Dev

有没有办法测试默认构造函数不存在?

来自分类Dev

有没有办法在科特林继承构造函数?

来自分类Dev

有没有办法用二维数组(int)重载构造函数?

来自分类Dev

有没有办法在C ++中进行就地成员构造(无需复制和销毁对象)?

来自分类Dev

有没有办法防止在我的命名参数构造函数中传递未定义?

来自分类Dev

有没有办法在特定的构造函数中延迟初始化一个昂贵的字段?

来自分类Dev

有没有办法使用Bootstrap文件和Unity Container在构造函数中注入List <TypeA>?

来自分类Dev

当用作类型参数时,有没有办法将参数传递给类构造函数?

来自分类Dev

有没有办法让“make_unique<T[]>”可以将参数转发给T的构造函数?

来自分类Dev

有没有办法缩短这个变量的定义?

来自分类Dev

有没有办法缩短这个jQuery代码?

来自分类Dev

有没有办法缩短多个.next()?

来自分类Dev

有没有办法从两个现有文档中以编程方式构造一个Open Office文档?

来自分类Dev

Kotlin 中的 Dagger 2:有没有办法在不使用 Module 的情况下使用默认参数化构造函数对类进行注入?

来自分类Dev

有没有办法缩短声明中的C ++ 11 lambda签名?

来自分类Dev

有没有办法缩短此正则表达式?

来自分类Dev

有没有办法缩短一系列colClasses

来自分类Dev

有没有办法以编程方式缩短到共享OneDrive文件的链接?

来自分类Dev

有没有办法缩短此重复代码?(添加JPanel组件)

来自分类Dev

有没有办法用switch缩短if else语句?

来自分类Dev

Rust:有没有办法使用map来缩短if / else代码?

来自分类Dev

Rust:有没有办法缩短from_request中if / else部分?

来自分类Dev

有没有办法缩短声明中的C ++ 11 lambda签名?

来自分类Dev

有没有办法缩短此正则表达式?

来自分类Dev

有没有办法缩短CSS选择器?

Related 相关文章

  1. 1

    有没有办法引用类型的构造函数?

  2. 2

    有没有办法使“构造函数”成为JS对象中的有效键?

  3. 3

    有没有办法有一个ArrayList元素等于类的构造函数?

  4. 4

    有没有办法检测const合格对象的构造?

  5. 5

    有没有办法测试默认构造函数不存在?

  6. 6

    有没有办法在科特林继承构造函数?

  7. 7

    有没有办法用二维数组(int)重载构造函数?

  8. 8

    有没有办法在C ++中进行就地成员构造(无需复制和销毁对象)?

  9. 9

    有没有办法防止在我的命名参数构造函数中传递未定义?

  10. 10

    有没有办法在特定的构造函数中延迟初始化一个昂贵的字段?

  11. 11

    有没有办法使用Bootstrap文件和Unity Container在构造函数中注入List <TypeA>?

  12. 12

    当用作类型参数时,有没有办法将参数传递给类构造函数?

  13. 13

    有没有办法让“make_unique<T[]>”可以将参数转发给T的构造函数?

  14. 14

    有没有办法缩短这个变量的定义?

  15. 15

    有没有办法缩短这个jQuery代码?

  16. 16

    有没有办法缩短多个.next()?

  17. 17

    有没有办法从两个现有文档中以编程方式构造一个Open Office文档?

  18. 18

    Kotlin 中的 Dagger 2:有没有办法在不使用 Module 的情况下使用默认参数化构造函数对类进行注入?

  19. 19

    有没有办法缩短声明中的C ++ 11 lambda签名?

  20. 20

    有没有办法缩短此正则表达式?

  21. 21

    有没有办法缩短一系列colClasses

  22. 22

    有没有办法以编程方式缩短到共享OneDrive文件的链接?

  23. 23

    有没有办法缩短此重复代码?(添加JPanel组件)

  24. 24

    有没有办法用switch缩短if else语句?

  25. 25

    Rust:有没有办法使用map来缩短if / else代码?

  26. 26

    Rust:有没有办法缩短from_request中if / else部分?

  27. 27

    有没有办法缩短声明中的C ++ 11 lambda签名?

  28. 28

    有没有办法缩短此正则表达式?

  29. 29

    有没有办法缩短CSS选择器?

热门标签

归档