Delphi中带有TComponent的Case语句

Delphi中带有TComponent的Case语句,delphi,Delphi,有一种方法可以使用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 ... 但我只是想知道,如果可能的话,用案例陈述 问候。

有一种方法可以使用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语句需要枚举类型,而类类型不是。

否,这是不可能的。案例陈述仅支持。序数类型是预定义的类型Integer、Char、WideChar、Boolean和声明的枚举类型,因此不包括类、字符串甚至浮点数

:

案例陈述

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

case selectorExpression of
  caseList1: statement1;
   ...
  caseListn: statementn;
end
其中selectorExpression是任何序号类型的表达式 小于32位(字符串类型和序数大于32位 无效)


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

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

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;
:

案例陈述

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

case selectorExpression of
  caseList1: statement1;
   ...
  caseListn: statementn;
end
其中selectorExpression是任何序号类型的表达式 小于32位(字符串类型和序数大于32位 无效)


当然,有很多方法可以解决这个问题,比如构建一个组件类或组件名列表,并对该列表中组件的索引进行大小写,但它们是有限的(当通过字符串进行匹配时,不能轻松地使用TCustomEdit来匹配TEdit、TMemo和其他组件)。因此,对我来说,a正常if是写这篇文章的最好方式。

谢谢@uwerabeordinal(!)类型谢谢@uwerabeordinal(!)类型
TObject的案例x:。。。。;TPO对象。。。;t成分:。。。;TWinControl:。。。。;结束-如果您将
TButton
作为x传递,编译器应该采用哪个分支?@Arioch'当然是第一个。@GolezTrol我不这么认为。在
记录
声明中,例如
案例
获取TObject的每个匹配部分
案例x:。。。。;TPO对象。。。;t成分:。。。;TWinControl:。。。。;结束-如果您将
TButton
作为x传递,编译器应该采用哪个分支?@Arioch'当然是第一个。@GolezTrol我不这么认为。在
记录
声明中,例如
案例
获取每个匹配部分
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;