[Delphi] Typecasting, welke moet ik omzetten?

Pagina: 1
Acties:

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 07:30
Ik loop tegen een vreemde foutmelding op:

[Error]Incompatible types: 'Word' and 'TVarTypes'

Waar haalt Delphi dat word-type vandaan?

De regel waar het fout gaat is de tweede regel:
code:
1
2
  case CheckVar('..') of
    VT_Reserved:Error('VarName is reserved');

CheckVar retourneert een TVarType, zie deze code:
code:
1
2
3
function CheckVar(VarName:string):TVarType;
begin
end;

TVarTypes is een enumerated type, als volgt gedefinieerd.
code:
1
2
Type
  TVarTypes = (VT_Unknown,VT_Reserved,VT_NoVar,VT_String);

Ik heb de volgende varianten geprobeerd:
Gaat FOUT:
code:
1
2
  case Word(CheckVar('..')) of
    VT_Reserved:Error('VarName is reserved');

Gaat FOUT:
code:
1
2
  case TVarType(CheckVar('..')) of
    VT_Reserved:Error('VarName is reserved');

Gaat GOED:
code:
1
2
3
4
5
6
  var
    Dummy=TVarType;

  Dummy:=CheckVar('..')
  case Dummy of
    VT_Reserved:Error('VarName is reserved');

Maar ik wil geen Dummy in mijn code, vooral omdat hij na de controle niet belangrijk meer is. Is er op een andere manier omheen te gaan?

edit:
Iets veranderd in verband met leesbaarheid

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 07:30
Sluit maar weer, was een stomme typfout, met een onverwacht resultaat.
De functie CheckVar gebruikt TVarType (zonder 's' aan het eind, en dat schijnt automatisch een 'word' te zijn. 's' toegevoegd, en het werkt. Daar had ik nog niet naar gekeken |:(
edit:
hat veranderd in had

  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Op donderdag 21 maart 2002 22:39 schreef jvdmeer het volgende:
Sluit maar weer, was een stomme typfout, met een onverwacht resultaat.
De functie CheckVar gebruikt TVarType (zonder 's' aan het eind, en dat schijnt automatisch een 'word' te zijn. 's' toegevoegd, en het werkt. Daar hat ik nog niet naar gekeken |:(
Afgezien daarvan, uit de help:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
he case statement provides a readable alternative to complex nested if conditionals. A case statement has the form

case selectorExpression of

  caseList1: statement1;
  ...
  caseListn: statementn;
end

where selectorExpression is any expression of an ordinal 
type (string types are invalid) and each caseList is one of 
the following:

*     A numeral, declared constant, or other expression that the 
compiler can evaluate without executing your program. It 
must be of an ordinal type compatible with 
selectorExpression. Thus 7, True, 4 + 5 * 3, 'A', and 
Integer('A') can all be used as caseLists, but variables 
and most function calls cannot. (A few built-in functions 
like Hi and Lo can occur in a caseList. See Constant 
expressions.)


*   A subrange having the form First..Last, where First 
and Last both satisfy the criterion above and First is less 
than or equal to Last.

*   A list having the form item1, ..., itemn, where each item satisfies one of the criteria above.

Je mag blijkbaar geen funktie resultaat direkt evalueren met case in Delphi.

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 07:30
Op donderdag 21 maart 2002 22:42 schreef Sponz het volgende:

[..]

Afgezien daarvan, uit de help:

[..] stuk geknipt[/..]

Je mag blijkbaar geen funktie resultaat direkt evalueren met case in Delphi.
Mag gelukkig wel, de enumerated type, is een subset van de ordinal type, en er staat in diezelfde help Ordinalexpression, dus er mag ook een functie staan. Alleen zo'n stomme typefout |:(, dat mag niet.

  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Inderdaad, ik lul maar wat, de praktijk wijst anders uit:
code:
1
2
3
4
5
6
7
8
9
10
procedure test;
function test2 : integer;
begin
  return 1;
end;
  begin
    case test2 of
     1: showmessage('1');
    end;
  end;

Doet 't prima.