Avatar billede rozh Nybegynder
08. juli 2007 - 15:19 Der er 6 kommentarer og
1 løsning

TypeInfo, TypeIdentifier

Hej

Der findes en delphi function som hedder TypeInfo. Den tager en type identifier og returnerer en pointer til info om typen.

Jeg kunne godt tænke mig at lave en function, som (ligesom TypeInfo) også modtager en parameter der en er en type identifier.

Noget i stil med:

Type
  TMyType = (Ja, Nej);

function MyFunction(T: TypeIdentifier): Pointer
begin
end;

procedure CallTheAbove; 
begin
  MyFunction(TMyType);
end;


I ovenstående eksempel vil MyFunction og CallTheAbove ikke kompilere. Men hvis man kalder

TypeInfo(TMyType)

så kan man godt.


Problemet ligger i declarationen af MyFunction. Der hvor der står "TypeIdentifier", skal der stå noget andet. Men Hvad ???
Hvad skal typen på "T" være, så "T" kan indeholde en type og ikke bare en variabel ?

VH
Avatar billede martinlind Nybegynder
09. juli 2007 - 21:08 #1
type
  TMyType = (class);

  TmyTypeClass = class of Tmytype;
----------------------

function MyFunction(T: TmyTypeClass): Pointer
begin
end;


/Sådan :)
Avatar billede rozh Nybegynder
17. juli 2007 - 13:23 #2
Hej

problemet er at TMyType ikke er en classe. TMyType er af typen enum, som den er erklæret ovenfor.

Jeg vil lige uddybe hvorfor jeg spørger, og hvad jeg skal bruge functionen til:


Jeg har forskellige slags enumerated typer:

TMyType = (Ja, Nej);
TMyType1 = (Jan, Feb, Mar...)
TMyType2 = (Sommer, ForAAr, Vinter, EfterAAr)

og veriablerne:

Var MyType: TMyType;
    MyType1: TMyType1;
    MyType2: TMyType2;
   
Desuden har jeg en variable streng:

var Str: string;

som indeholder ordet 'Ja';

Denne vil jeg lave om til enumerated, dvs jeg vil sætte variablen MyType efter indeholdet i Str.

Man kan gøre dette således:

MyType:=  TMyType(GetEnumValue(TypeInfo(TMyType),Str))

Men da jeg har forskellige enumerated variable, synes jeg at det ville se mere elegant ud, hvis man hver gang man skulle lave en streng om til en enum, bare kunne kalde en function:

function StrToEnum(T: "TypeIdentifier", S: String): Integer;
begin
  Result:= T(GetEnumValue(TypeInfo(T), S));
end;

og så kunne man kalde ovenstående:

MyType:= EnumToStr(TMyType, Str);
MyType1:= EnumToStr(TMyType1, 'Mar');

Problemet er : hvad skal der står der, der hvor jeg har skrevet "TypeIdentifier" ?
Jeg ved at det kan lade sig gøre, fordi man kan jo kalde functionen TypeInfo i delphi på denne måde.
Avatar billede martinlind Nybegynder
17. juli 2007 - 14:50 #3
Da du har brugt enum tror/ved jeg ikke hvordan du skal gøre, andet end at benytte overload og gøre sådan :

function StrToEnum(T: TMyType, S: String): Integer; overload;
begin
  Result:= T(GetEnumValue(TypeInfo(T), S));
end;

function StrToEnum(T: TMyType1, S: String): Integer; overload;
begin
  Result:= T(GetEnumValue(TypeInfo(T), S));
end;

function StrToEnum(T: TMyType2, S: String): Integer; overload;
begin
  Result:= T(GetEnumValue(TypeInfo(T), S));
end;
Avatar billede martinlind Nybegynder
17. juli 2007 - 14:51 #4
sad lige og tænkte lidt :) vender lige tilbage...
Avatar billede martinlind Nybegynder
17. juli 2007 - 15:04 #5
ikke noget alligevel, tror du bliver nødt til at leve med "overload" :)
Avatar billede rozh Nybegynder
17. juli 2007 - 18:18 #6
Jo det har jeg også tænkt på, men så skal man lave en ny funktion, hvergang man har en enum type. Dvs så er der stadig meget arbejde og rod :)

Men hvordan er TypeInfo funktionen i delphi defineret. Hvis man vidste det, så kunne man jo bare definere sin funktion på samme måde.....

hvor tror du man kan finde ud af det ?
Avatar billede martinlind Nybegynder
17. juli 2007 - 20:09 #7
Den er bygget ind i compileren, og Typeidentifier er ikke sådan lige at definere :(

Bliver dig svar skyldig, hvis du er rigistreret bruger kan du jo prøve at spørge CodeGear folkene
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester