【问题标题】:Case statement with TComponent in DelphiDelphi 中使用 TComponent 的 case 语句
【发布时间】:2016-04-29 14:10:42
【问题描述】:

有一种方法可以用 Tcomponent 做一个案例陈述吗?我的意思是:

begin
  case Form1.Components[i] of
    TEdit: //do something;
    TMenuItem: //Do Something;
    TButton: //Do Somtehing;
  end;
end;

我知道可以这样做:

if (Form1.components[i] is TEdit) then
...

但我只是想知道case语句是否可能。

问候。

【问题讨论】:

  • case x of TObject: ....; TPersistentObject ...; TComponent: ...; TWinControl: ....; end; - 如果您将 TButton 作为 x 传递,编译器应该采用哪个分支???
  • @Arioch'当然是第一个。
  • @GolezTrol 我不这么认为。在 record 声明中,例如 case 获取每个匹配的部分

标签: delphi


【解决方案1】:

不,这是不可能的。 Case 语句仅支持ordinal types。序数类型是预定义类型 Integer、Char、WideChar、Boolean 和声明的枚举类型,因此不包括类、字符串甚至浮点数。

The documentation says:

案例陈述

case 语句可以为深度嵌套提供可读的替代方案 如果条件。案例陈述的形式为:

case selectorExpression of
  caseList1: statement1;
   ...
  caseListn: statementn;
end

其中 selectorExpression 是任何序数类型的表达式 小于 32 位(字符串类型和大于 32 位的序数 无效)....

当然有一些方法可以解决这个问题,比如构建一个组件类或组件名列表,并对该列表中组件的索引进行案例分析,但它们是有限的(不能轻易使用 TCustomEdit 来匹配 TEdit, TMemo 和其他人,当通过字符串匹配时)。所以对我来说,正常的 if 是最好的写法。

【讨论】:

    【解决方案2】:
    Case IndexStr(Form1.Components[i].classname, ['TEdit', 'TButton', 'TmenuItem', 'etc...']) of 
      0: ..code..;                   // TEdit
      1: ..code..;                   // TButton
      2: ..code..;                   // TMenuItem
     -1: ShowMessage('Not Present'); // not present in array
    else
      ShowMessage('Default Option'); // present, but not handled above
    end;
    

    【讨论】:

      【解决方案3】:

      不,这是不可能的。 Case 语句需要枚举类型,而类类型则不需要。

      【讨论】:

      • 谢谢@UweRaabe
      • 序数 (!) 类型
      猜你喜欢
      • 2021-11-26
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2023-04-07
      • 2011-10-08
      • 2021-03-14
      相关资源
      最近更新 更多