最小化/优化重复代码

ple*_*103 4 delphi delphi-2010

这是我的代码,用于"动画" TPanel鼠标光标悬停在它上面的时间.我还有一个代码块来使它无法动画.

procedure Tmain.pStarting1MouseEnter(Sender: TObject);
begin
  if sender = pStarting1 then pStarting1.BevelInner := bvLowered;
  if sender = pStarting2 then pStarting2.BevelInner := bvLowered;
  if sender = pStarting3 then pStarting3.BevelInner := bvLowered;
  if sender = pStarting4 then pStarting4.BevelInner := bvLowered;
  if sender = pStarting5 then pStarting5.BevelInner := bvLowered;
  if sender = pStarting6 then pStarting6.BevelInner := bvLowered;
  if sender = pStarting7 then pStarting7.BevelInner := bvLowered;
  if sender = pStarting8 then pStarting8.BevelInner := bvLowered;
  if sender = pStarting9 then pStarting9.BevelInner := bvLowered;
end;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它非常重复,因为我有另外27 TPanel秒的动画,这将意味着另外27行重复代码.那么有什么方法可以优化它?

我还尝试将该代码块放入一个单独的过程(在同一单元中).但德尔福告诉我,这sender是未申报的.

And*_*and 11

if Sender is TPanel then
  TPanel(Sender).BevelInner := bvLowered;
Run Code Online (Sandbox Code Playgroud)

或者,如果你确定它Sender总是一个TPanel,简单地说

(Sender as TPanel).BevelInner := bvLowered;
Run Code Online (Sandbox Code Playgroud)

或者(如果你真的一定)

TPanel(Sender).BevelInner := bvLowered;
Run Code Online (Sandbox Code Playgroud)

  • 关于第一个例子:成功的`Sender is TPanel`之后直接进行类型转换是安全的:`TPanel(Sender)`,不需要`Sender as TPanel` (3认同)
  • @Andreas,但是在`is`之后使用`as`是低效的,就像```测试类型之前做的那样你自己完成相同的演员.所以`is`测试类型,然后`as`测试类型,如果它不是那种类型则引发异常.使用`如果Sender是TSomething然后TSomething(Sender)'比使用类型测试两次并为第二个设置异常堆栈更有效.:) (3认同)