我想缩短以下代码:

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元素,那么这可能很有意义。

关于delphi - 有没有办法缩短is/as构造?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30578469/

10-10 21:56