Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Stefano - Ottobre 31, 2012, 09:27:02 am

Titolo: Passare Enumerator come parametro ad altra unit
Inserito da: Stefano - Ottobre 31, 2012, 09:27:02 am
poniamo di avere una dichiarazione simile
Codice: [Seleziona]
interface

uses ... TypInfo

type TOperazione = (Edit, Consulta);

 private
   FOperazione: TOperazione;
all'interno della stessa unit posso dichiarare
Codice: [Seleziona]
procedure Gestione(Sender: TObject; Const AOperationType: TOperazione);
ma se devo passare il tipo TOperazione ad un'altra unit, mi trovo  in difficoltà, "Enumerator" e' un tipo , googlando non trovo come dichiararlo,
devo trasformare il tipo Enumerator in string per poterlo passare
Codice: [Seleziona]
procedure Tfrm_MenuAree.AnagrafeOperatori(iPannello: integer);
var
  frm_AnagrafeOperatori: Tfrm_AnagrafeOperatori;
begin
  frm_AnagrafeOperatori := Tfrm_AnagrafeOperatori.Create(nil);
  frm_AnagrafeOperatori.StatoPulsanti(GetEnumName(TypeInfo(TOperazione), integer(Edit)));
  VisualizzaForm(frm_AnagrafeOperatori ,0 ,0);
e nella procedure ricevente
Codice: [Seleziona]
.. sarebbe piu' corretto passare l'Enumerator TOperazione

procedure Tfrm_AnagrafeOperatori.StatoPulsanti(AOperazione: <Enumerator>);
ma <Enumerator> a cosa corrisponde ? .. TObject non viene accettato.

//riceve Enumerator trasformato in string, ma e' poco utile
procedure Tfrm_AnagrafeOperatori.StatoPulsanti(sStato: string);
begin
  //
end;
grazie.
Titolo: Re:Passare Enumerator come parametro ad altra unit
Inserito da: Legolas - Ottobre 31, 2012, 11:01:11 am
Potresti spostare la dichiarazione del tipo enum in una unit a parte e utilizzarla dove ti serve, oppure puoi fare un semplice cast a integer e passare quello. O ancora, puoi usare la funzione Ord per ottenere il valore associato all'elemento dell'enum:
Codice: [Seleziona]
TMyType = (mtCane, mtGatto);  //mtCane= 0; mtGatto= 1
...
a := integer(mtCane);   // a = 0
b := integer(mtGatto);  // b = 1
...
c := Ord(mtCane);  // c = 0
d := Ord(mtGatto);  // d = 1
Ricorda anche che puoi assegnare un valore ad ogni elemento dell'enum:
Codice: [Seleziona]
TMyType = (mtCane= 14, mtGatto= 9); 
...
a := integer(mtCane);   // a = 14
b := integer(mtGatto);  // b = 9
...
c := Ord(mtCane);  // c = 14
d := Ord(mtGatto);  // d = 9
Puoi anche assegnare un valore a soltanto uno degli elementi e gli altri verranno incrementati di uno:
Codice: [Seleziona]
TMyType = (mtCane= 14, mtGatto); 
...
a := integer(mtCane);   // a = 14
b := integer(mtGatto);  // b = 15
...
c := Ord(mtCane);  // c = 14
d := Ord(mtGatto);  // d = 15
Titolo: Re:Passare Enumerator come parametro ad altra unit
Inserito da: Stefano - Ottobre 31, 2012, 11:25:54 am
grazie, molto chiaro nella spiegazione.