我想缩短以下代码:
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/