2016-04-29 1 views
-1

Es gibt eine Möglichkeit, mit TComponent eine Case-Anweisung zu tun ?, ich meine:Case-Anweisung mit TComponent in Delphi

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

I bekannt ist, kann dies tun:

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

aber nur möchte ich bekannt wenn möglich mit case statement.

Grüße.

+0

'Fall x von TObject: ....; TPersistentObject ...; TComponent: ...; TWinControl: ....; end; '- welche Verzweigung sollte Compiler nehmen, wenn Sie' TButton' als x übergeben? –

+0

@ Arioch'The Die erste natürlich. – GolezTrol

+1

http://docwiki.embarcadero.com/RADStudio/Seattle/de/E2001_Ordinal_type_required_%28Delphi%29 –

Antwort

5

Nein, das ist nicht möglich. Case-Anweisungen unterstützen nur ordinal types. Ordinale Typen sind die vordefinierten Typen Integer, Char, WideChar, Boolean und deklarierte Aufzählungstypen, sodass Klassen, Zeichenfolgen und sogar Gleitkommazahlen ausgeschlossen sind.

The documentation says:

Case-Anweisungen

Die Case-Anweisung eine lesbare Alternative bieten kann conditionals zu tief verschachtelten wenn. Eine Fall-Anweisung hat die Form:

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

wo SelektorAusdruck ist jede aus einer Ordnungstyp kleiner als 32 Bit (String-Typen und Ordinalzahlen größer als 32 Bits sind ungültig) ....

+0

Danke @GolezTrol – Enecumene

1

Nein, das ist nicht möglich. Fallanweisungen erfordern einen Aufzählungstyp, den ein Klassentyp nicht hat.

+0

Danke dir @UweRaabe – Enecumene

+0

** Ordinal ** (!) Type –

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